=====================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 |