TDE(Transparent Data Encryption) DB 사업부이대혁 2015 년 01 월 16 일 문서정보 프로젝트명 TDE ( Transparent Data Encryption ) 서브시스템명 버전 1.0 문서명 TDE ( Transparent Data Encryption ) 작성일 2015-01-16 작성자 DB사업부이대혁사원 최종수정일 2015-01-16 문서번호 UNIONE-201407291925-LDH 재개정이력 일자내용수정인버전 문서배포이력 발신자수신자배포목적일자비고 데이터암호화및접근제어가이드 2014-07-17.
Table of Contents 1 개요... 3 2 테스트환경구성... 3 3 Metalink 참조문서... 3 4 이해및암호화알고리즘... 4 4.1 Encryption Key... 4 4.2 TDE 에사용되는암호화알고리즘... 4 4.3 TDE 적용시주의사항... 4 4.3.1 CPU... 4 4.3.2 Large Table Encryption... 4 4.3.3 PASSWORD 관리... 5 4.3.4 Storage Overhead... 5 4.4 제약사항... 6 5 TDE 설치여부확인... 7 6 Wallet File... 7 6.1 Wallet File 의위치지정... 7 6.2 Wallet 위치조회및상태조회... 8 6.3 Master Key 생성... 8 6.3.1 Master key OPEN 및 CLOSE... 9 6.4 Column 또는 Tablespace 전체에대한암호화사용...10 7 테이블스페이스암호화마스터키포함여부확인...14 8 컬럼을암호화마스터키존재여부확인하기...16 9 TDE 마스터키및전자지갑관리...16 10 Tool 을이용한 Wallet 설정...17 10.1 Orapki Tool...17 10.1.1 Wallet 생성...18 10.1.2 Wallet Password 변경...18 10.1.3 Auto-Login 설정...20 10.2 OWM ( Oracle Wallet Management )...22 11 Exp/Imp 와 Expdp/Impdp...27 2/32
1 개요 데이터를암호화하여디스크에저장하는기법으로디스크의도난및백업데이터의유출시데이터를보호할수있습니다. ORACLE 10gR2 의 New Feature 이며 Enterprise Edition 에서사용가능합니다. ORACLE 10g 에서는 Column 단위의암호화를지원합니다. ORACLE 11g 에서는 Tablespace 단위의암호화를지원합니다. 그렇게때문에 Table, Cluster, Index, Lobs, Table Partition, Index Partition 도암호화가능하며 Application 의변경이필요하지않은것이가장큰장점이라할수있습니다. 2 테스트환경구성 O/S : Red Hat Enterprise Linux Server release 5.10 64bit Memory : 2048 MB CPU : Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz Database : Oracle 11.2.0.3 EE 3 Metalink 참조문서 영문문서 한글문서 3/32
4 이해및암호화알고리즘 4.1 Encryption Key Master Encryption Key Master Key 는 Column 또는 Tablespace 에사용되는보조키를암호화하는데사용 되는암호화키입니다. Table Key ( 10g Column 단위 ) Database 안의 Data Dictionary 에저장되며암호화된테이블에대하여 Master Key 와 함께데이터를암복호화하는데사용됩니다. Tablespace Key ( 11g Tablespace 단위 ) 11g 부터는 Encryption Key 가각 Tablespace Header 안에저장이되어데이터암복호 화에사용이됩니다. 4.2 TDE 에사용되는암호화알고리즘 암호화에대한국제표준을준수하는 Algorithms 을사용하고있습니다. Algorithm Key Size Parameter Name Triple DES ( Data Encryption Standard ) 168 bits 3DES168 AES ( Advanced Encryption Standard ) 128 bits ( 11gR2 default tablespace ) AES128 AES 128 bits ( 10gR2 default Column ) AES192 AES 256 bits AES256 4.3 TDE 적용시주의사항 4.3.1 CPU 11g : 평균적 5~8 % 사이의 Overhead 발생 ( 전반적인퍼포먼스는실제로 11g > 10g) 10g : Column 암복호화과정에서 5% 의 overhead 가발생. Column 수나 access 획수에비례하기도합니다. 4.3.2 Large Table Encryption Size가큰 Table 에관해서 Column 암호화의경우 redo log size 증가시켜주어야합니다. 인덱스가걸려잇는상태에서의 Column 암호화는상당한시간이소요됩니다. 4/32
Index 제거후 No Salt 옵션과함게암호화, Index 를새로생성해주어야합니다. 새로만들어진 index 는암호화된값에의해서생성이됩니다. 4.3.3 PASSWORD 관리 Wallet 또는 Wallet Password 를분실하게되면암호화된데이터는 Access 가불가하므로물리 적인 Wallet File 의백업과 Wallet Password 관리가반드시필요합니다. 4.3.4 Storage Overhead TDE 컬럼암호화로발생한 Storage Overhead 는암호화된각값에대해 1 ~ 52 bytes 사이입니다. Colomn 암호화 (10g) 는일반데이터보다공간을조금더사용합니다. AES 경우최대 16bytes, 3DES일경우 8bytes 정합성체크를위한 20bytes가추가적으로필요합니다.(nomac 파라미터이용시제외 ) Salt 옵션으로암호화했을경우 16bytes 가더필요하므로결론적으로최대발생할수있는스토리지오버헤드는각암호화된 value 당 52bytes 가됩니다. 11g : Tablespace 암호화는 Storage Overhead 가없습니다. Overhead 발생요소 1. 다음 16 bytes 또는 8 bytes 에대해채워넣기로발생한 Storage Overhead 는데이터를암호화하는데사용된알고리즘에따라다릅니다. AES 는 Key 크기 (192, 256 등 ) 에상관없이 128 bit (128 / 8 = 16 Bytes) 의블록크기를사용하므로최대 16 Bytes 채워넣기를사용합니다. 즉, 원래값크기가 16 Bytes 의배수인경우에도 16 Bytes Block 을하나더추가하게됩니다. 이렇게되면 최악의경우 입니다. 동일한논의는3DES 에적용되지만이경우 Block 의크기는 8 Bytes 입니다. 이채워넣기 8 Bytes 또는 16 Bytes Overhead 는 Mandatory ( 반드시수행 ) 입니다. 2. 무결성검사에대한 20 Bytes Overhead. 이는 OPTIONAL 입니다 ( 이옵션대신 NOMAC 옵션사용 ) 3. Column 을암호화하는데 SALT 가사용되는경우 16 Bytes Overhead. 이는 OPTIONAL 입니다. ( 이옵션대신 NO SALT 옵션사용 ) 5/32
4.4 제약사항 동일한서버에여러데이터베이스가설치되어있는경우 각각의 Encryption Key 를생성후사용서로공유하여사용할경우암호화된데이터손실유발우려가있기때문에 Oracle 에서는지원하지않습니다. Column Encrytion 제약 ( 10g ~ 11g ) 1 B-tree 가아닌 Index 유형 ( Function, Domain, Join INDEX 등 ) 생성불가 2 Index 를통한 Range Scan 불가 ( 동등비교연산자를통한스캔만가능 ) 3 External Table(BFILE) : oracle_datapump drver 로만가능 4 TTS(Transportable Tablespace) 지원불가 5 PK 를참조하는 FK 키 Column 지원불가 ( ORA-28335 ) 6 암호화 Column 을 Partition Key, Cluster Key 로사용할수없습니다. 7 LOB(BLOB/CLOB) 지원불가 8 SYS 스키마 Object Column ( ORA-28336 ) 지원불가 9 Export / Import Util ( Expdp / impdp 사용권장 ) STREAMS 사용불가 10 Advanced Queuing 사용불가 11 Advanced Replication 사용불가 12 Logical standby Database 사용불가 13 Logminer 에의한해석은가능, 암호화 Column 은 Unsupported Type 라고표시됩니다. 14 비스칼라 Type ( Object Type, 유저정의 Type, Varray, REF 등 ) 지원불가 15 암호화시 Salt 옵션을부여시 Index 생성불가능 Tablespace Encrytion 제약및변경사항 ( 11gR1 이상 ) 1 모든 table, cluster, index, LOB, table 및 index partition 등을지원가능 2 SYSTEM, SYSAUX, UNDO, TEMP tablespace 는암호화불가능합니다. 3 Exp 불가능, Imp 는부분적가능 ( Expdp/Impdp 권장 ) 암호화가되어있지않은 10gR2 또는이전버전 Export 후암호화되어있는 11g 로 import는가능합니다. ( 마지막단락인 11항목참조하시길바랍니다. ) 4 Bitmap Index 사용가능 5 Index 를통한 Range Scan 가능 6 LOB datatype 가능합니다. 7 TTS 가능 ( Source 쪽에서 Wallet Key 를 Copy 해가져가야하기때문에 Target Database에서는 TDE 를사용하지않고있어야만가능합니다. Cross-endianism 은불가능 6/32
5 TDE 설치여부확인 SQL> select PARAMETER, VALUE from v$option where parameter='transparent Data Encryption'; PARAMETER VALUE ---------------------------------------------------------------- ---------------------------------------------------------------- Transparent Data Encryption TRUE 6 Wallet File Encryption ( 암호화 ) 와 Decryption( 복호화 ) 를수행하는 Master Key 를저장하고있습니다. Database 와별도의공간에저장하여허가된사용자만접근가능하도록합니다. 6.1 Wallet File 의위치지정 Defautlt 는 $ORACLE_BASE/ADMIN/<SID>/WALLET 에생성됩니다. 경로가존재하지않거나 Platform 에따라파일위치를지정하지않았을경우 ORA-28368 발생, Bug 4956266 존재 $ORACLE_HOME/network/admin/sqlnet.ora 파일에명시가가능합니다. ENCRYPTION_WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /u01/oracle/wallet) ) ) 7/32
6.2 Wallet 위치조회및상태조회 SQL> set linesize 200 SQL> set pages 500 SQL> select wrl_parameter, status from v$encryption_wallet ; WRL_PARAMETER STATUS -------------------------------------------------- ------------------ /u01/oracle/ wallet CLOSED v$encrytion_wallet 뷰를통하여 sqlnet.ora 에지정된경로와동일하게설정되어있는지를확인할수있으며 WalletFile의 Default 위치는 $ORACLE_BASE/admin/<global_db_name>/wallet 으로지정이되있으며명시적으로위치지정을해주지않을경우 ORA-28368 : cannot auto-create wallet 이발생합니다. 6.3 Master Key 생성 아래의패스워드생성은최초생성시에만사용해야하는점을유의하셔야합니다. 아래와같은문장으로패스워드를변경할경우에는기존의암호화되었던테이블을사용할수없게됩니다. 큰따옴표가사용되지않는경우비밀번호의문자는모두대문자가됩니다. 이명령은새전자지갑을열어사용할수있는상태로생성합니다. TDE에대한새전자지갑을생성할수있는유일한적합한방법이며 Oracle Wallet Manager 또는명령행툴 orapki를사용하여처음으로 TDE 전자지갑을생성할수없습니다. 새마스터키가생성되며전자지갑에기록됩니다. 새로생성된이마스터키는활성마스터키가됩니다. 8/32
oracle 부분은 wallet_password, 즉암호설정부분입니다. STATUS 부분 OPEN 확인 6.3.1 Master key OPEN 및 CLOSE Database 를재시작할때마다 Master Key 를아래의명령어로 Load 해야하며, Password 가틀릴경우 ORA-28353 : Failed to open wallet 에러가발생합니다. 또한 Wallet 을 OPEN 하지않고암호화된 Table 이나 Tablespace 를조회할때는 ORA- 28365 : Wallet is not open 에러가발생합니다. 혹 Master Key 를 Close 시에는 Auto-login 이설정되어있을경우패스워드부분은생략을하여도됩니다. 10g 에서 11g 로업그레이드하였다면 Master Key는재생성해야합니다. (11gR1 11gR2도마찬가지이며 Wallet 경로의 ewallet.p12 파일도그대로가져가야합니다 ) Instance Crash 로인한 recover 가필요한경우 redo 와 undo 의암호화된 Data 에대한접근성이필요하므로 Database 가 OPEN 되기전에 Wallet 이 OPEN 되어야합니다. CLOSE 로에러가떨어진부분은 auto-login 이설정이안되어서발생한에러입니다. 9/32
만약설정이되어있는경우패스워드부분을생략하셔도가능하며에러가떨어지지않습니다. 다시 OPEN 해줍니다. 6.4 Column 또는 Tablespace 전체에대한암호화사용 암호화옵션을지정하여테이블을생성합니다. 기존테이블의컬럼을암호화합니다. ( 위에서생성한테이블사용 ) 1. SALT 옵션 암호화시에사용하는 Salt Option은데이터보안을강화하는방법중하나로임의의 String 으로암호화하는것이며암호화할때마다다른 String 패턴으로암호화가진행됩니다. Salt 옵션을사용하게되면추가적으로각데이터값마다 16bytes 가필요하며, 인덱스를사용할예정이라면 Salt Option 을사용해서는안됩니다. 2. NOMAC Parameter TDE 는기본적으로 SHA-1 알고리즘을사용하여무결성체크를합니다. NOMAC 파라미터를사용하게되면암호화및복호화시에하는무결성체크부분이빠지면서 10/32
TDE의관한성능오버헤드를줄일수있습니다. 이파라미터를사용하게되면각암호화된값보다디스크공간이 20 Bytes가더필요하게되고이미 SHA-1 알고리즘을사용하여 Table Column 암호화가있다면동일한 Table 의다른 Column을 NOMAC Parameter 로암호화를할수없습니다. < 무결성알고리즘변경 > SQL> ALTER TABLE test REKEY USING 3DES168 SHA-1 ; SQL> ALTER TABLE test REKEY USING 3DES168 NOMAC ; External Table 생성시암호화 External Table은오직 Datapump 로사용할때가능하고, External Table을새로운위치로 Move 하게되면임의로생성된 Encryption Key 를사용못하게됩니다. 그렇기때문에컬럼암호화시따로암호를지정하여 External Table 이 Move 를하더라도엑세스를가능하게해주어야합니다. SQL> create directory en_dir as /oracle ; SQL> grant read, write on directory en_dir to scott; SQL> conn scott/tiger SQL> create table test_ext (empno number(10), Empname varchar2(30), 11/32
Salary number(10) ENCRYPT USING '3DES168' identified by "oracle123") ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY en_dir LOCATION('TEST_ext.dat') ); 기존 Table의암호화 Column 을추가 / 변경시 AES192 알고리즘과 Salt, MAC Option 은 default 값으로 Index 를사용할예정이라면 NO SALT 옵션을부여해야합니다. 1. Column 추가시 SQL> ALTER TABLE test ADD (sales VARCHAR2(11) ENCRYPT no salt 'NOMAC' ); 2. Column 변경시 SQL> ALTER TABLE test MODIFY (sales ENCRYPT no salt 'NOMAC' ); SQL> ALTER TABLE test MODIFY (sales ENCRYPT SALT) ; 12/32
3. 암호화 Column 을제거시 SQL> ALTER TABLE test MODIFY (sales DECRYPT) ; 4. 암호화 Column 에대한 Encryption Key 와알고리즘변경시 - Encryption Key 변경시 SQL> ALTER TABLE test REKEY ; - 암호화알고리즘변경시 SQL> ALTER TABLE test REKEY USING 3DES168 ; 암호화된테이블스페이스를생성합니다. 중요 : 암호화되지않은기존테이블스페이스암호화는할수없습니다. 전체 Tablespace 에서데이터를암호화해야하는경우암호화된새테이블스페이스를 생성한후기존테이블스페이스에서새테이블스페이스로데이터를이동해야합니다. 13/32
7 테이블스페이스암호화마스터키포함여부확인 v$encrypted_tablespace 의 MASTERKEYID 는 base64 형식으로저장됩니다. 전자지갑내에서사용되는형식으로 ID 를가져오려면다음질의를실행해야합니다. select utl_raw.cast_to_varchar2( utl_encode.base64_encode('01' substr(masterkeyid,1,4))) utl_raw.cast_to_varchar2( utl_encode.base64_encode(substr(masterkeyid,5,length(masterkeyid)))) FROM v$encrypted_tablespaces; TEST 버전은 11gR2 버전이므로 01 을사용했지만 11gR1 일경우 05 로바꿔주어야합니다. 위의질의로가져온문자열을전자지갑의 ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY 값과비교해야합니다. 마지막의노란색으로표기된구절은현재의마스터키입니다. 14/32
Tablespace Key 는다음질의를사용하여가져올수도있습니다. SQL> select t.name, RAWTOHEX(x.mkid) from v$tablespace t, x$kcbtek x where t.ts#=x.ts# ; 해당값은 16 진수형식의 Key ID 입니다. 16진수문자열은전자지갑의콘텐츠와비교할수있도록 BASE64 문자열로변환할수도있습니다. SQL> select utl_raw.cast_to_varchar2( utl_encode.base64_encode ('01' substr('4072fdf269fc4f90bf29e02fededd9c2',1,4))) utl_raw.cast_to_varchar2( utl_encode.base64_encode (substr('4072fdf269fc4f90bf29e02fededd9c2',5,length ('4072FDF269FC4F90BF29E02FEDEDD9C2')))) masterkeyid_base64 FROM dual; BASE64 형식의키 ID 입니다. 15/32
8 컬럼을암호화마스터키존재여부확인하기 SQL> select MKEYID from enc$ where obj# in (select object_id from dba_objects where object_type='table' and object_name='test' and owner='scott'); 이후마스터키 ID 가전자지갑에존재하는지여부를파악합니다. 9 TDE 마스터키및전자지갑관리 전자지갑은중요한구성요소이며안전한위치 ( 데이터베이스백업이저장되는위치와다른위치 ) 에백업해야합니다. 마스터키가포함되어있는전자지갑이없어졌거나비밀번호를잊어버린경우암호화된데이터에더이상액세스할수없습니다. 전자지갑이다음시나리오에서백업되었는지확인하십시오 1 전자지갑을생성한직후. 2 마스터키를다시생성했을때 3 데이터베이스를백업할때. 전자지갑백업이데이터베이스백업과동일한위치에저장되지않았는지확인하십시오 4 전자지갑비밀번호를변경하기전 16/32
필요한경우전자지갑비밀번호를 Oracle Wallet Manager 내에서변경하거나 orapki 를사용하는 다음명령을사용 (11.1.0.7 부터시작 ) 하여변경할수있습니다 ( 아래사진참조 ) $ orapki wallet change_pwd wallet <wallet_location> Oracle은전자지갑파일을 $ORACLE_BASE 디렉토리외부에저장하여기타 Oracle 파일과동일한위치에백업하지않도록할것을권장합니다 또한이디렉토리및전자지갑파일에대한액세스를제한하여우발적인제거를방지하는것이좋습니다. 전자지갑파일에대한액세스를제한하는데권장되는방법이아래에나와있습니다. $ cd /etc $ mkdir pv oracle/wallets/<$oracle_sid> $ chown R oracle:oinstall oracle $ chmod R 700 oracle 전자지갑을생성한후전자지갑파일에대한권한설정을줄입니다. Wallet 경로의 ewallet.p12 의권한을 600 으로축소 Chmod 600 ewallet.p12 10 Tool 을이용한 Wallet 설정 10.1 Orapki Tool 17/32
10.1.1 Wallet 생성 Orapki 를생성시 Password 를미리기입할수있지만, 패스워드는미리기입하지않는것을 권장합니다. $ orapki wallet create -wallet <wallet 경로 > -pwd <wallet password> 미리기입하지말고패스워드부분은밑에서기재해주도록합니다. 10.1.2 Wallet Password 변경 패스워드변경후에는기존 Password 로 wallet 을 Close 한후새로운 Password 로 Wallet 을 OPEN 해야합니다. (11g 에서만가능합니다.) $ orapki wallet change_pwd wallet <wallet경로 > -oldpwd < 이전암호 > newpwd < 바꿀암호 > 기존암호 oracle 에서새로운암호 oracle123 으로변경 SQL> select wrl_parameter, status from v$encryption_wallet ; OPEN 상태확인 SQL> alter system set wallet close identified by oracle ; 18/32
기존 Wallet 암호 CLOSE 및확인 SQL> alter system set encryption wallet open identified by oracle ; 기존암호오픈 SQL> alter system set encryption wallet open identified by oracle123 ; 바뀐암호오픈 SQL> select * from v$encryption_wallet ; 오픈상태확인 바뀐 Wallet 암호로 OPEN 확인모습, 기존암호 OPEN 불가 19/32
10.1.3 Auto-Login 설정 Metalink 문서 ID 데이터베이스재시작마다 Master Key 를수동으로 OPEN 하는번거로움을해소하기위하여 open 설정이가능합니다. 10g 의경우 auto-login 설정후 instance restart 를하여도상태는 CLOSE 로나옵니다. 암호화테이블에대해 DDL, DML 을한후상태체크를하면 OPEN 다시변경됩니다. 11g 의경우 restart 를하여도 OPEN 유지, wallet 을 Close 하여도 View 에서는 OPEN 상태 Wallet 상태가 Close로변경이되더라도암호화 Table 을조회시자동 OPEN 조회가능합니다. 오라클에서권장은하지않는방법으로편리할수있으나후에 wallet 이 open, close 가잘되지않는현상이간혹발생할수있습니다. orapki 에서 auto_login 옵션을사용하여 AUTO_LOGIN 설정 암호화테이블생성후 Insert 데이터 1 건입력 20/32
Shutdown 후 startup 해줍니다. ( Startup force 도상관없습니다. ) Close 상태확인됩니다. 21/32
Select 조회시다시 wallet 이 OPEN 으로변경되신것을확인하실수있습니다. 만약 Auto-login 이설정되어있지않은경우아래와같은에러를만날수있습니다. auto-login 이아닐경우 DB restart 후 wallet CLOSE 상태 만약 Auto-login 기능을제거시 OWM 을이용하여 auto-login 기능을해제해야합니다. 10.2 OWM ( Oracle Wallet Management ) Wallet 파일을보다쉽게관리하기위한 GUI Tool 입니다. Master Key 생성, Auto-login, 패스워드변경등 TDE 와관련된모든것들을이 Tool 하나로관리할수있기때문에보다편리하게이용하실수있습니다. $ owm 1. OWM 실행 22/32
2. Wallet Open 23/32
상단 wallet 메뉴클릭후 OPEN 선택 3. Wallet 경로설정 24/32
Wallet 경로설정 4. Wallet 패스워드입력 25/32
Wallet 패스워드입력후좌측상단에메뉴가생긴것을확인 5. Auto-login 설정 26/32
Auto-login 체크후 SAVE 클릭 11 Exp/Imp 와 Expdp/Impdp Exp 불가능, Imp 부분적가능하며 expdp/impdp 를권고하며그에대한테스트를보여드리도록하겠습니다. Scott 유져의 Default Tablespace 를 encryptedtbs 로지정 27/32
Object 를이용해서데이터건수늘리기 28/32
EXP 테스트 29/32
Column 뿐만아니라 Tablespace 역시 Encrypt 는 EXP 가안되는것을확인하실수있습니다. Expdp / Impdp 를사용하는경우 $ expdp system/oracle directory=test_dir dumpfile=expdp.dmp logfile=expdp.log schemas=scott 30/32
ORA-39173 오류가아닌단지메시지입니다. 암호화데이터가덤프파일안에저장되었다는뜻입니다. 덤프파일확인 $ strings expdp.dmp more 덤프파일이암호화된것을확인하실수있습니다. 31/32
Dump file 암호화 Encryption_password= Password 옵션을이용하면암호화된 table 을암호화형식의 dump 파일로받을 수있습니다. SQL> expdp scott/tiger schemas=scott directory=test_dir dumpfile=expdp2.dmp logfile=expdp2.log encryption_password="oracle123" 성공적으로 Expdp 받은것을확인하실수있습니다. $ string expdp2.dmp more 32/32