본문 바로가기

Oracle/admin

Oracle TDE

=====================TDE 적용시 주의점================

Wallet 이나 Wallet Password 를 분실하게 되면 암호화된 데이터는 Access 가 불가 하므로 물리적인 Wallet File 의 백업과 Wallet Password 관리가 반드시 필요하다.




CPU

① 11g : Tablespace 암호화는 Application 마다 다를 수 있지만, 평균적으로 5~8%사이에 Overhead 가 발생한 다.(하지만 실무에서의 전체적인 Performance 를 본다면 11g 에서의 성능이 10g 보다 월등한 Performance 를 보여준다.)

② 10g : Column 암호화에서의 Table 은 Column 암호화가 삽입되어 있는 경우에만 해당이 되며, 암호화, 복 호화 하는 과정에서 5%의 overhead 가 발생한다. 또한 암호화 된 column 수나 access 를 하는 횟수에 비례 하기도 한다. 


Large table Encryption
Size 가 큰 table 의 관하여 Column 암호화를 하는 경우 redo log size 를 증가시켜주어야 하고, 인덱스가 걸려 있 는 상태에서의 Column 암호화는 상당한 시간이 소요된다. 그렇기 때문에 Index 를 제거후에 No Salt 옵션과 함께 암호화를 한 후, Index 를 새로 만들어 주어야 한다.(새로 만들어진 Index 는 암호화 된 값의 의해서 생성이 됨)


Storage

① 11g : Tablespace 암호화는 Storage OverHead 가 없다.

② 10g : Column 암호화는 일반 데이터보다 공간을 좀더 사용하게 되는데, AES 경우 최대 16byte,3DES 일 경 우 8Bytes 가 추가적으로 사용되며 정합성 체크를 위한 20bytes 가 추가적으로 더 필요 하다.(nomac 파라 미터 이용시 제외) salt 옵션으로 암호화 했을 경우 16bytes 가 더필요하여 결론적으로 최대 발생할 수 있는 스토리지 오버해드는 각 암호화 된 value 당 52bytes 가 된다.



제약사항.
동일한 서버에 여러 데이터베이스가 설치되어 있는 경우, 각각의 Encryption Key 를 생성 및 사용해야 한다. 서로 공유하여 사용할 경우 암호화 된 데이터 손실을 유발할수 있기 때문에 Oracle 에서는 이 같은 방법은 지원하지 않 는다


 Column Encryption 제약(10g ~ 11g)

① B-tree 가 아닌 Index 유형(Function Index, Domain Index, Join Index 등등) 생성 불가.

② Index 를 통한 Range Scan 불가능.(동등 비교 연산자를 통한 Scan 만 가능)

③ External Table(BFILE) – oracle_datapump drver 로만 가능.

④ TTS(Transportable Tablespace) 지원 불가.

⑤ PK 를 참조하는 FK 키 Column 지원불가(ORA-28335)

⑥ 암호화 Column 을 Partition Key, Cluster Key 로 사용할 수 없음.

⑦ LOB(BLOB/CLOB) 지원 불가

⑧ SYS 스키마 Object Column (ORA-28336) 지원불가

⑨ Export/Import Util (Expdp/Impdp 사용권장)STREAMS 사용불가.

⑩ Advanced Queuing 사용불가.

⑪ Advanced Replication 사용불가.

⑫ Logical Standby Database 사용불가.

⑬ Logminer 에 의한 해석은 가능하지만, 암호화 Column 은 ‚Unsupported Type‛라고 표시됨.

⑭ 비 스칼라 Type (오브젝트 Type, 유저정의 Type, Varray, REF 등) 지원 불가

⑮ 암호화시 Salt 옵션을 부여할 경우 Index 생성 불가능




Tablespace Encryption 제약 및 변경사항. (11gR1~ )

① 모든 table, cluster, index, LOB, table 및 index partition 등을 지원가능. 
② SYSTEM, SYSAUX, UNDO, TEMP tablespaces 는 암호화 불가능.

③ Exp 불가능, Imp 는 부분적으로 가능.(Expdp/Impdp 권장)

암호화가 설정이 안되어 있는 10gR2 또는 이전버전에서 Export 이후, 암호화 설정이 되어있는 11g 로 Import 는 가 능하다


④ Bitmap Index 사용 가능

⑤ Index 를 통한 Range Scan 가능

⑥ LOB datatype 가능

⑦ TTS 가능  -- Source 쪽에서 Wallet Key 를 Copy 해 가져가야하기 때문에 Target database 에서는 TDE 를 사용하지 않 고 있어야만 가능하다. (Cross-endianism 은 불가능)




====================TDE 적용====================


Wallet File 위치 지정

Sqlnet.ora 파일에 wallet 의 경로를 지정 후에는 v$encryption_wallet 뷰를 통하여 sqlnet.ora 에 지정된 경로와 동일 하게 설정 되어 있는지 확인 한다.

$> vi $ORACLE_HOME/network/admin/sqlnet.ora

ENCRYPTION_WALLET_LOCATION=

        (SOURCE=(METHOD=FILE)(METHOD_DATA=    

          (DIRECTORY=/oracle/wallet1/)))


-> Wallet File 의 default 위치는 $ORACLE_BASE/admin/<global_db_name>/wallet 으로 리눅스 환경에서는 명시적으 로 위치를 지정하지 않을 경우 ORA-28368: cannot auto-create wallet 이 발생한다.



SQL> select * from v$encryption_wallet;

WRL_TYPE             WRL_PARAMETER                            STATUS 

-------------------  --------------------------------------   ------------------ 

file                  /oracle/wallet1/                         CLOSED



 Master Key 생성

Master Key는 아래 명령어를 통하여 생성이 가능하며 최초 생성 시에만 사용해야 하며 아래의 문장으로 패스워드를 변경 할 경우에는 기존의 암호화 되었던 테이블을 사용할 수 없게 된다. Wallet file 이름은 기본적으로 ewallet.p12로 생성이 된다.


SQL> alter system set encryption key identified by "oracle";

System altered. 
SQL> select * from v$encryption_wallet;

WRL_TYPE             WRL_PARAMETER                            STATUS 

-------------------  --------------------------------------   ------------------ 

file                  /oracle/wallet1/                         OPEN 


$> ls –alrt /oracle/wallet1/

-rw------- 1 oracle dba 1309 Mar 7 05:14 ewallet.p12


 Master Key OPEN 및 Close

데이터 베이스를 재 시작 할때마다 master key 를 아래의 명령어로 LOAD 해야 하며, 패스워드가 틀린 경우 ORA28353: Failed to open wallet 에러가 발생한다. 또한 wallet 을 open 하지 않고 암호화된 Table 이나 Tablespace 를 조회 할때는 ORA-28365: wallet is not open 에러가 발생 한다.

SQL> alter system set wallet open identified by "oracle";

System altered. 
SQL> alter system set wallet close;    

wallet close ORA-28390: auto login wallet not open but encryption wallet may be open   --> auto-login 이 설정이 안되어서 발생. 
SQL> alter system set wallet close identified by "oracle"; System altered.




=========Wallet Password 변경===========

주의 : Password를 변경하게되면 이전 암호로 암호화 시킨 대상들은 더이상 읽을수가 없게 됨.


password 를 변경하는 방법은 2가지가 있다.

그중 첫번째는 명령문을 통해 변경을 하고 기존 wallet을 기존암호로 close하고 새암호로 wallet을 open 하면 된다.



[oracle@localhost admin]$ orapki wallet change_pwd -wallet /app/oracle/admin/orcl/wallet -oldpwd "oracle" -newpwd "oracle123"
Oracle PKI Tool : Version 11.2.0.4.0 - Production
Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.

[oracle@localhost admin]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Tue Jun 14 10:14:05 2016

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing options

SQL> select * from v$encryption_wallet;

WRL_TYPE
--------------------
WRL_PARAMETER
--------------------------------------------------------------------------------
STATUS
------------------
file
/app/oracle/admin/orcl/wallet
OPEN


SQL> alter system set wallet close identified by oracle123;
alter system set wallet close identified by oracle123
*
ERROR at line 1:
ORA-28391: cannot close wallet or HSM, password mismatch


SQL> alter system set wallet close identified by oracle;

System altered.

SQL> alter system set wallet open identified by oracle123;

System altered.


=>2번째 방법은

기존 wallet파일을 다른이름으로 복사하고 새로 만들어주는 방법


[oracle@localhost wallet]$ ls
ewallet.p12
[oracle@localhost wallet]$ mv ewallet.p12 ewallet.p12.bak


SQL> alter system set encryption key identified by oracle;

System altered.

SQL> select * from v$encryption_wallet;

WRL_TYPE
--------------------
WRL_PARAMETER
--------------------------------------------------------------------------------
STATUS
------------------
file
/app/oracle/admin/orcl/wallet
OPEN


[oracle@localhost wallet]$ ls
ewallet.p12  ewallet.p12.bak



===============Table Cloumn암호화====================


 Table 생성 시 Column을 암호화

Column 암호화시 ‘AES192’는 default 값으로 using ‘3DES168’를 작성을 안할시 기본적으로 AES192 가 적용이 된다.


SQL> create user hhh identified by hhh;

User created.
SQL> grant connect,resource to hhh;

Grant succeeded.

SQL> conn hhh/hhh
Connected.

SQL> create table test
  2  (first_name varchar2(11),
  3  last_name varchar2(10),
  4  order_number number(13),
  5  credit_card_number varchar2(20) encrypt using '3DES168' no salt 'NOMAC');

Table created.


 Salt Option

암호화 시의 사용하는 Salt Option 은 데이터의 보안을 강화하는 방법으로 임의의 String 으로 암호화 하는 것이며 암호화 할 때 마다 다른 String 패턴으로 암호화가 진행이 된다. Salt Option 를 사용하게 되면 추가적으로 각 데이터 값마다 16byte 가 필요하며, 인덱스를 사용할 예정이라면 Salt Option 을 사용해서는 안된다.



NOMAC Parameter

TDE 는 기본적으로 SHA-1 알고리즘을 사용하여 무결성을 체크 하지만, NOMAC 파라미터를 사용하게 되면 암호화 및 복호화시에 하는 무결성 체크부분이 빠지면서 TDE 의 관한 성능 오버헤드를 줄일 수 있다. 이 파라미터를 사용하게 되면 각 암호화 된 값보다 디스크 공간이 20Byte 가 더 필요하게 되고, 이미 SHA-1 알고리 즘을 사용하여 Table Column 암호화가 있다면, 동일한 Table 의 다른 Column 을 NOMAC Parameter 로 암호화를 할 수 없다.



=> 무결성 알고리즘 변경.

SQL> ALTER TABLE test REKEY USING '3DES168' 'SHA-1';

Table altered. 
SQL> ALTER TABLE test REKEY USING '3DES168' 'NOMAC';

Table altered.  



External Table 생성시 암호화

External Table 은 오직 DataPump 로 사용할 때 가능하고, External Table 을 새로운 위치로 Move 를 하게 되면 임의 로 생성 된 Encryption Key 를 사용 못하게 된다. 그렇기에 컬럼 암호화시 따로 암호를 지정하여 External Table 이 Move 를 하더라도 엑세스를 가능하게 해주도록 해야한다

SQL> create directory d_dir as ‘/oracle’;

SQL> grant read, write on directory d_dir to hr;

SQL> conn hr/hr

SQL> create table test_ext      

(empno number(10),      

Empname varchar2(30),      

Salary number(10)

ENCRYPT USING '3DES168' IDENTIFIED BY "oracle" )

ORGANIZATION EXTERNAL

    (    

    TYPE ORACLE_DATAPUMP    

    DEFAULT DIRECTORY "D_DIR"

    LOCATION('test_ext.dat')      

    )



기존 TABLE의 암호화 Column을 추가 또는 변경시

AES192 알고리즘과 Salt, MAC Option 은 default 값으로 Index 를 사용할 예정이라면 No salt Option 을 부여해야 한다.


Column 추가시

SQL> ALTER TABLE test ADD (sales VARCHAR2(11) ENCRYPT no salt 'NOMAC' );


Column 변경시
SQL> ALTER TABLE test MODIFY (sales ENCRYPT  no salt 'NOMAC' );


 암호화 Column을 제거시
SQL> ALTER TABLE test MODIFY (sales DECRYPT);


암호화 Column의 대한 Encryption Key와 알고리즘 변경시.

 Encryption Key 변경시
SQL> ALTER TABLE test REKEY;


암호화 알고리즘 변경시
SQL> ALTER TABLE employee REKEY USING '3DES168';





Tablespace 암호화

11gR2 에서는 Column 암호화와 Tablespace 암호화 모두 동일한 Master Key 를 사용하고, 만약 10g 에서 11g 로 업그 레이드 한것이라면 Master Key 는 재생성을 해야만 한다. (11gR1 에서 11gR2 로 업그레이드도 재생성이 필요하고 ewallet.p12 파일도 그대로 가져가야 한다.)

또한 Oracle 에서 Auto-login 기능은 권장하지 않으며, 기존 Tablespace 는 암호화 할 수 없기 때문에 새롭게 암호 화 된 Tablespace 를 생성하여 CTAS, Table Move, DataPump 등의 방법으로 이동시켜야 한다.


 Wallet Open

암호화 된 Tablespace 를 만들기 전에 Wallet 은 Open 이 되어있어야만 하고, Instance Crash 로 인한 recover 가 필 요할 시 redo 와 Undo 의 암호화 된 Data 의 대한 접근이 필요하기 때문에 Database 는 Open 이 되기전의 Wallet 이 Open 되어 있어야만 한다.

SQL> startup mount;

SQL> alter system set encryption wallet open identified by ‚oracle‛;

SQL> alter database open;


암호화 된 Tablespace 생성

Tablespace 암호화는 기본 알고리즘이 AES128 이다.


SQL> CREATE TABLESPACE test DATAFILE '/oradata/test01.dbf' SIZE 100M

        ENCRYPTION USING '3DES168'

        DEFAULT STORAGE(ENCRYPT); 


SQL> Select tablespace_name,encrypted from dba_tablespaces where tablespace_name='TEST';

TABLESPACE_NAME                ENC

------------------------------ ---

TEST                           YES 


SQL> Select * from v$encrypted_tablespaces;

TS#        ENCRYPT  ENC

---------- -------  ---

5          3DES168  YES



암호화 Tablespace Decryption

Tablespace 암호화를 해제하기 위해서는 해당 Table 들을 alter table move, DataPump, dbms_redefinition 을 이용 하여 암호화 되지 않은 Tablespace 로 옮기면 된다. 
SQL> alter table cust_payment_info_2 move tablespace users;

Table altered. 
SQL> select * from cust_payment_info_2;

FIRST_NAME  LAST_NAME  ORDER_NUMBER CREDIT_CARD_NUMBER

----------- ---------- ------------ --------------------

Jon         Oldfield   10001        5446-9597-0881-2985

Chris       White      10002        5122-3580-4608-2560

Alan        Squire     10003        5595-9689-4375-7920 


SQL> alter system set wallet close identified by "oracle";

System altered. 


SQL> select * from cust_payment_info_2;

FIRST_NAME  LAST_NAME  ORDER_NUMBER CREDIT_CARD_NUMBER

----------- ---------- ------------ --------------------

Jon         Oldfield   10001        5446-9597-0881-2985

Chris       White      10002        5122-3580-4608-2560

Alan        Squire     10003        5595-9689-4375-7920


Expdp/Impdp 사용법
TDE 로 컬럼 암호화를 하였을 경우 exp/imp 는 사용할 수 없다. 단 11g 에서는 export 덤프 파일을 암호화 된 Tablespace 로 Import 는 사용 할 수 있다.


Expdp/impdp   
=> test 라는 유저의 default tablespace 는 test 로 지정이 되어있고, test tablespace 는 암호화 된 tablespace 인 환경이다.

SQL> select ts#,  ENCRYPTIONALG  , ENCRYPTEDTS from  v$encrypted_tablespaces;


TS#                ENCRYPT          ENC

----------        --------           ----

8                  3DES168          YES


SQL> conn test/oracle

SQL> select count(*) from test; COUNT(*)

----------

10000 


=>기존 exp/Imp 는 metadata 들은 정상적으로 수행이 되지만, 실제 데이터가 있는 Table 같은 경우는 Error 가 발 생하면서 export 가 수행이 되지 않는다.



=> Expdp/Impdp 를 사용하는 경우. 동일한 wallet File(Master Key)를 사용하고 있다면 Expdp/impdp 를 수행함에 있어 아무러 Error 는 발생하지 않는다. 하지만 Master Key 가 없거나 잘못 되어있을 경우에는 ORA-28365: Wallet is not open 이 발생한다.

$> impdp system/oracle directory=en dumpfile=expdp.dmp logfile=impdp.log schemas=test remap_schema=test:hr



Dump File 암호화
encryption_password="Password" 옵션을 이용하면 암호화 된 table 을 암호화 형식의 dump 파일로 받을 수 있다.

그 외에도 Encryption, Encryption_Algorithm, Encryption_Mode 옵션을 더 추가하여 좀 더 디테일하게 암호화를 할
수도 있다.

$> expdp test/oracle schemas=test directory=en dumpfile=expdp.dmp logfile=expdp.log encryption_password="oracle" 








'Oracle > admin' 카테고리의 다른 글

Oracle Dataguard Install  (0) 2016.06.16
패스워드 verify 설정 및 해제  (0) 2016.06.14
batch 파일중 SQL 부하 찾기  (0) 2016.06.13
Migration Step  (0) 2016.06.13
rman  (0) 2016.06.13