프린트 하기

OS 환경 : Oracle Linux 8.1 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c tde 설정 방법 및 데이터파일 암호화 테스트

TDE(Transparent Data Encryption(투명한 데이터 암호화))란?
Transparent Data Encryption(TDE)은 테이블과 테이블스페이스에 저장된 민감한 데이터를 암호화할 수 있도록 해주고, 데이터베이스 백업을 암호화할 수 있도록 해줌

 

데이터가 암호화된 후, 이 데이터에 접근하는 권한이 있는 사용자나 애플리케이션은 해당 데이터를 자동으로 복호화하여 사용할 수 있음
TDE는 저장 매체 또는 데이터파일이 도난당했을 경우를 대비하여 저장된 데이터(디스크 등에 저장된 '정지된 데이터'(휴지 상태 데이터)라고도 함)를 보호하는 데 도움을 줌

 

Oracle Database는 데이터베이스 내의 데이터를 보호하기 위해 인증, 권한 부여, 감사 등의 메커니즘을 제공하지만, 운영 체제 수준의 데이터파일은 이러한 보호 범위에 포함되지 않음
이러한 데이터파일을 보호하기 위해 Oracle Database는 Transparent Data Encryption(TDE)을 제공함
TDE는 데이터파일에 저장된 민감한 데이터를 암호화함
비인가 복호화를 방지하기 위해, TDE는 암호화 키를 데이터베이스 외부의 보안 모듈에 저장함
보안 모듈 종류 :
TDE Wallet : TDE를 위해 사용되는 전용 월렛(지갑)
인증서 등 다른 보안 아티팩트는 포함할 수 없음
이전 버전에서는 소프트웨어 키스토어 또는 단순히 월렛이라고 불렸음
External keystores : Oracle Key Vault 또는 Oracle Cloud Infrastructure(OCI)의 키 관리 서비스(KMS)를 의미함
keystores : TDE 월렛과 외부 키스토어를 아우르는 일반적인 용어임

 

Oracle Key Vault를 TDE 구현의 일부로 구성할 수 있음
이를 통해 엔터프라이즈 환경에서 키스토어를 중앙에서 관리할 수 있음
예를 들어, TDE 월렛을 Oracle Key Vault에 업로드하고, 데이터베이스가 해당 키스토어를 기본 키스토어로 사용하도록 마이그레이션한 뒤, 해당 키스토어의 내용을 데이터베이스의 다른 주요 노드나 대기 노드(Oracle RAC 환경 포함)와 공유하여 암호화된 데이터베이스의 일상적인 관리 작업을 간소화할 수 있음

 

tde의 자세한 설명 및 동작방식은 공식문서를 참고하기 바람
참고 :

https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/asopart1.html#GUID-62AA9447-FDCD-4A4C-B563-32DE04D55952

 

 

본문에서는 테이블스페이스 단위 tde를 설정해보고 설정 전 후 데이터파일을 strings 명령으로 읽어서 내용이 어떻게 보이는지 확인해봄

 

 

테스트
샘플 테이블스페이스 생성

1
2
3
SQL> create tablespace tde_test1 datafile '/oradata1/ORACLE19/tde_test1.dbf' size 10m;
 
Tablespace created.

 

 

샘플 테이블 생성 및 데이터 삽입

1
2
3
4
5
6
SQL> 
create table sample (col1 number, col2 varchar2(10)) tablespace tde_test1;
insert into sample values (1, 'A');
insert into sample values (2, 'B');
insert into sample values (3, 'C');
commit;

 

 

데이터파일 내용 확인

1
2
3
4
5
6
7
8
9
$ cd /oradata1/ORACLE19
$ ls -al tde_test1.dbf
-rw-r----- 1 oracle oinstall 10493952 Jun 15 14:12 tde_test1.dbf
$ strings tde_test1.dbf >> tde_tbs_off.txt
$ cat tde_tbs_off.txt
}|{z
ORACLE19b
TDE_TEST1
AAAAAAAA

sid도 보이고 테이블스페이스 명과 함께 일부 데이터가 보임

 

 

tde 설정
tde 월렛 경로 생성

1
2
3
# mkdir -pv /home/oracle/keystores/oracle19/tde
# chown -Rv oracle:oinstall /home/oracle/keystores
# chmod -Rv 700 /home/oracle/keystores

 

 

wallet_root 파라미터 설정

1
2
3
SYS> alter system set wallet_root = '/home/oracle/keystores/oracle19' scope = spfile;
 
System altered.

 

 

tablespace_encryption 파라미터 설정(선택)
*이 파라미터를 auto_enable로 설정할 경우 create tablespace 구문에서 encryption 옵션을 사용하지 않더라도 모든 신규 테이블스페이스가 암호화됨
*19.16 이상에서만 사용가능

1
2
3
SYS> alter system set tablespace_encryption = auto_enable scope = spfile;
 
System altered.

 

 

db 재기동

1
2
SQL> shutdown immediate
SQL> startup

 

 

관련 파라미터 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL> 
set lines 200 pages 1000
col desc for a70
col name for a40
col current_value for a15
col default_value for a15
col default_t_f for a15
select
ksppinm "name",
ksppstvl "current_value",
b.ksppstdfl "default_value",
b.ksppstdf "default_t_f",
ksppdesc "desc"
from sys.x$ksppi a, sys.x$ksppcv b
where 1=1
and a.indx=b.indx
AND SUBSTR(a.KSPPINM, 1, 1) = '_'
and a.ksppinm in ('_tablespace_encryption_default_algorithm');
 
name                                     current_value   default_value   default_t_f     desc
---------------------------------------- --------------- --------------- --------------- ----------------------------------------------------------------------
_tablespace_encryption_default_algorithm AES128          AES128          TRUE            default tablespace encryption block cipher mode

tde 암호화 알고리즘은 기본값인 AES128임

 

 

아래와 같이 aes256 알고리즘으로도 변경 가능함(선택)

1
2
3
SYS> alter system set "_tablespace_encryption_default_algorithm" = 'aes256' scope = both;
 
System altered.

 

 

tde 월렛을 사용하도록 설정

1
2
3
SYS> alter system set tde_configuration = "keystore_configuration=file" scope = both;
 
System altered.

 

 

Keystore 생성(syskm 권한 필요, 본문에서는 / as sysdba로 작업함)
예시 SQL> administer key management create keystore identified by PW;

1
2
3
SQL> administer key management create keystore identified by "Dhfkzmf1!";
 
keystore altered.

 

 

Local Auto-login Wallet 생성 (DB 재시작 시 자동 오픈)
(참고: 이 명령어 수행시 <WALLET_ROOT>/tde 경로를 생성함)
예시 SQL> administer key management create [local] auto_login keystore from keystore identified by PW;

1
2
3
SQL> administer key management create local auto_login keystore from keystore identified by "Dhfkzmf1!";
 
keystore altered.

*local을 지정하면 local auto_login 키스토어를 생성함, 이 경우 키가 생성된 host에서만 열 수 있음
지정하지 않으면 일반 auto_login 키스토어를 생성하고 이 경우 다른 컴퓨터에서도 사용 가능함
rac의 경우 local을 지정하게되면 다른 노드에서는 자동 열리지 않아 키스토어 오픈에 실패하게 됨, 그렇기 때문에 월렛 경로가 공유경로더라도 rac에서는 local을 사용하면 안됨

 

 

tde 마스터 키 설정
예시 SQL> administer key management set keystore open identified by PW;

1
2
3
SQL> administer key management set keystore open identified by "Dhfkzmf1!";
 
keystore altered.

 

 

키 백업
예시 SQL> administer key management set key force keystore identified by PW with backup;

1
2
3
SQL> administer key management set key force keystore identified by "Dhfkzmf1!" with backup;
 
keystore altered.

 

 

월렛 경로가서 확인

1
2
3
4
5
6
7
8
$ cd /home/oracle/keystores/oracle19/tde
$ ls -al
total 12
drwx------ 2 oracle oinstall   80 Jun 15 14:12 .
drwx------ 3 oracle oinstall   17 Jun 15 14:13 ..
-rw------- 1 oracle oinstall 4040 Jun 15 14:12 cwallet.sso
-rw------- 1 oracle oinstall 2555 Jun 15 14:12 ewallet_2025061505125343.p12
-rw------- 1 oracle oinstall 3995 Jun 15 14:12 ewallet.p12

 

 

테이블스페이스 암호화 적용

1
2
3
4
5
SQL> 
alter tablespace USERS encryption online encrypt;
alter tablespace TDE_TEST1 encryption online encrypt;
alter tablespace SYSAUX encryption online encrypt;
alter tablespace SYSTEM encryption online encrypt;

 

 

암호화시 alter 로그 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
$ tail -300f /ORA19/app/oracle/diag/rdbms/oracle19/oracle19/trace/alert_oracle19.log
2025-06-15T14:14:42.490283+09:00
About to encrypt tablespace USERS (tsn 0/4)
Auto-renaming original file /oradata1/ORACLE19/users01.dbf to aux file /oradata1/ORACLE19/users01.dbf_new..
Rekeying datafile /oradata1/ORACLE19/users01.dbf (7) to /oradata1/ORACLE19/users01.dbf_new
2025-06-15T14:14:48.493800+09:00
Rekey operation committed for file /oradata1/ORACLE19/users01.dbf_new
2025-06-15T14:14:50.550210+09:00
About to zero out original file "/oradata1/ORACLE19/users01.dbf"
2025-06-15T14:14:52.590485+09:00
Successfully zero'ed out original file "/oradata1/ORACLE19/users01.dbf"
Successfully deleted original file "/oradata1/ORACLE19/users01.dbf"
Auto online renaming aux file /oradata1/ORACLE19/users01.dbf_new to original filename /oradata1/ORACLE19/users01.dbf (this could take some time)..
Moving datafile /oradata1/ORACLE19/users01.dbf_new (7) to /oradata1/ORACLE19/users01.dbf
2025-06-15T14:14:56.399491+09:00
Move operation committed for file /oradata1/ORACLE19/users01.dbf
2025-06-15T14:14:58.611417+09:00
Completed renaming aux file to original filename /oradata1/ORACLE19/users01.dbf
Completed rekey for tablespace USERS (tsn 0/4) from key version 0 to 1.
Completed: alter tablespace USERS encryption online encrypt
alter tablespace TDE_TEST1 encryption online encrypt
About to encrypt tablespace TDE_TEST1 (tsn 0/8)
Auto-renaming original file /oradata1/ORACLE19/tde_test01.dbf to aux file /oradata1/ORACLE19/tde_test01.dbf_new..
Rekeying datafile /oradata1/ORACLE19/tde_test01.dbf (2) to /oradata1/ORACLE19/tde_test01.dbf_new
Rekey operation committed for file /oradata1/ORACLE19/tde_test01.dbf_new
2025-06-15T14:15:00.725915+09:00
About to zero out original file "/oradata1/ORACLE19/tde_test01.dbf"
Successfully zero'ed out original file "/oradata1/ORACLE19/tde_test01.dbf"
Successfully deleted original file "/oradata1/ORACLE19/tde_test01.dbf"
Auto online renaming aux file /oradata1/ORACLE19/tde_test01.dbf_new to original filename /oradata1/ORACLE19/tde_test01.dbf (this could take some time)..
Moving datafile /oradata1/ORACLE19/tde_test01.dbf_new (2) to /oradata1/ORACLE19/tde_test01.dbf
Move operation committed for file /oradata1/ORACLE19/tde_test01.dbf
2025-06-15T14:15:02.841052+09:00
Completed renaming aux file to original filename /oradata1/ORACLE19/tde_test01.dbf
Completed rekey for tablespace TDE_TEST1 (tsn 0/8) from key version 0 to 1.
Completed: alter tablespace TDE_TEST1 encryption online encrypt
alter tablespace SYSAUX encryption online encrypt
About to encrypt tablespace SYSAUX (tsn 0/1)
Auto-renaming original file /oradata1/ORACLE19/sysaux01.dbf to aux file /oradata1/ORACLE19/sysaux01.dbf_new..
Rekeying datafile /oradata1/ORACLE19/sysaux01.dbf (3) to /oradata1/ORACLE19/sysaux01.dbf_new
2025-06-15T14:15:07.728941+09:00
Rekey operation committed for file /oradata1/ORACLE19/sysaux01.dbf_new
2025-06-15T14:15:09.813906+09:00
About to zero out original file "/oradata1/ORACLE19/sysaux01.dbf"
2025-06-15T14:15:11.372502+09:00
Successfully zero'ed out original file "/oradata1/ORACLE19/sysaux01.dbf"
Successfully deleted original file "/oradata1/ORACLE19/sysaux01.dbf"
Auto online renaming aux file /oradata1/ORACLE19/sysaux01.dbf_new to original filename /oradata1/ORACLE19/sysaux01.dbf (this could take some time)..
Moving datafile /oradata1/ORACLE19/sysaux01.dbf_new (3) to /oradata1/ORACLE19/sysaux01.dbf
2025-06-15T14:15:13.662601+09:00
Move operation committed for file /oradata1/ORACLE19/sysaux01.dbf
2025-06-15T14:15:15.703369+09:00
Completed renaming aux file to original filename /oradata1/ORACLE19/sysaux01.dbf
Completed rekey for tablespace SYSAUX (tsn 0/1) from key version 0 to 1.
Completed: alter tablespace SYSAUX encryption online encrypt
alter tablespace SYSTEM encryption online encrypt
About to encrypt tablespace SYSTEM (tsn 0/0)
Auto-renaming original file /oradata1/ORACLE19/system01.dbf to aux file /oradata1/ORACLE19/system01.dbf_new..
Rekeying datafile /oradata1/ORACLE19/system01.dbf (1) to /oradata1/ORACLE19/system01.dbf_new
2025-06-15T14:15:20.191749+09:00
Rekey operation committed for file /oradata1/ORACLE19/system01.dbf_new
2025-06-15T14:15:22.230037+09:00
About to zero out original file "/oradata1/ORACLE19/system01.dbf"
2025-06-15T14:15:23.735851+09:00
Successfully zero'ed out original file "/oradata1/ORACLE19/system01.dbf"
Successfully deleted original file "/oradata1/ORACLE19/system01.dbf"
Auto online renaming aux file /oradata1/ORACLE19/system01.dbf_new to original filename /oradata1/ORACLE19/system01.dbf (this could take some time)..
Moving datafile /oradata1/ORACLE19/system01.dbf_new (1) to /oradata1/ORACLE19/system01.dbf
2025-06-15T14:15:25.819569+09:00
Cleaning up online move operation for data file #1 ("/oradata1/ORACLE19/system01.dbf").
Clean up of move operation for fno 1 completed
Encounter ORA-1114 when online renaming auxiliary file to original file name. Online encrypt operation is completed for this data file but the data file name is kept at /oradata1/ORACLE19/system01.dbf_new. This does not affect the data file. If desired the data file can be renamed again with ALTER DATABASE MOVE DATAFILE commmand.
Completed rekey for tablespace SYSTEM (tsn 0/0) from key version 0 to 1.
Completed: alter tablespace SYSTEM encryption online encrypt

설명 :
About to encrypt tablespace USERS (tsn 0/4) : 테이블스페이스에 대해 암호화를 시작함을 알림
Auto-renaming original file ... to aux file ..._new
Rekeying datafile ... to ..._new
: 원본 파일을 _new 이름의 보조 파일로 복사하며 암호화 적용
Rekey operation committed for file ..._new : 암호화된 새 파일의 생성 완료
About to zero out original file ...
Successfully zero'ed out original file ...
Successfully deleted original file ...
: 보안상 원본 파일은 내용을 0으로 덮어쓰고 삭제
Auto online renaming aux file ..._new to original filename ...
Moving datafile ..._new to ...
Move operation committed for file ...
Completed renaming aux file to original filename ...
: _new로 만들어진 암호화 파일을 기존 이름으로 덮어쓰기함, DB 운영에 영향 없이 전환됨
Completed rekey for tablespace ... from key version 0 to 1. : 해당 테이블스페이스의 마스터키 버전이 1로 갱신됨 (처음 설정한 마스터 키)
Encounter ORA-1114 when online renaming auxiliary file to original file name
: system 테이블스페이스의 경우 _new 파일을 기존 파일명으로 바꾸는 과정에서 오류(ORA-1114)가 발생함
하지만 암호화 자체는 완료되었고, alter database move datafile 명령을 이용해 수동으로 이름을 바꿀 수 있다고 나옴

 

 

system 테이블스페이스의 데이터파일 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQL>
set lines 200 pages 1000
col tablespace_name for a20
col file_name for a70
select tablespace_name, file_id, file_name, round(bytes/1024/1024/1024, 2) gb,
round(maxbytes/1024/1024/1024, 2) max_gb, autoextensible, status, online_status from dba_data_files;
 
TABLESPACE_NAME         FILE_ID FILE_NAME                                                                      GB     MAX_GB AUT STATUS    ONLINE_
-------------------- ---------- ---------------------------------------------------------------------- ---------- ---------- --- --------- -------
SYSTEM                        1 /oradata1/ORACLE19/system01.dbf_new                                             1          0 NO  AVAILABLE SYSTEM
SYSAUX                        3 /oradata1/ORACLE19/sysaux01.dbf                                                 1          0 NO  AVAILABLE ONLINE
UNDOTBS1                      4 /oradata1/ORACLE19/undotbs01.dbf                                                1          0 NO  AVAILABLE ONLINE
USERS                         7 /oradata1/ORACLE19/users01.dbf                                                  1          0 NO  AVAILABLE ONLINE
IMSITS                        5 /oradata1/ORACLE19/imsits01.dbf                                                 2          0 NO  AVAILABLE ONLINE
TDE_TEST1                     2 /oradata1/ORACLE19/tde_test01.dbf                                             .01          0 NO  AVAILABLE ONLINE

system tbs의 데이터파일만 dbf_new로 표시되어 있음

 

 

암호화 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SYS> 
set lines 200 pages 1000
col name for a20
col encryptionalg for a10, status for a10
select t.name, e.encryptionalg, e.status
from v$tablespace t, v$encrypted_tablespaces e
where e.ts#(+) = t.ts#
and e.con_id(+) = t.con_id
order by e.con_id, t.name;
 
NAME                 ENCRYPT STATUS
-------------------- ------- ----------
SYSAUX               AES128  NORMAL
SYSTEM               AES128  NORMAL
TDE_TEST1            AES128  NORMAL
USERS                AES128  NORMAL
IMSITS
TEMP
UNDOTBS1
 
7 rows selected.

sysaux, system, tde_test1, user 테이블스페이스가 정상적으로 암호화됨

 

 

tde 설정 데이터파일 내용 확인

1
2
3
4
5
6
$ cd /oradata1/ORACLE19
$ ls -al tde_test1.dbf
-rw-r----- 1 oracle oinstall 10493952 Jun 15 14:18 tde_test1.dbf
$ strings tde_test1.dbf >> tde_tbs_on.txt
$ cat tde_tbs_on.txt | wc -l
129275

암호화로 인해 12만줄 이상이 추가됨(기존에는 4줄만 존재했음)

 

 

head 명령으로 확인

1
2
3
4
5
6
7
8
9
10
11
$ head -10 tde_tbs_on.txt
}|{z
ORACLE19b
TDE_TEST1
vEz`
pGja
BUb]
5CQ8
X,vl
xWH|
<X#%

값들이 암호화 되어있어 읽을수 없게됨

 

 

참고1. 아래 파라미터는 21c 부터 사용가능함

1
2
3
4
5
SQL> show parameter tablespace_encryption_default_algorithm
 
NAME                                    TYPE        VALUE
--------------------------------------- ----------- ------------------------------
tablespace_encryption_default_algorithm string      AES256

 

 

참고2. sqlnet.ora에 encryption_wallet_location 설정 관련
sqlnet.ora의 이 설정은 12c 이전에는 필수였지만, 18c부터는 권장되지 않음, 이제는 wallet_root와 tde_configuration 파라미터 사용을 권장함
이전 방식으로 구성은 가능하지만 이는 기존 db를 새로운 TDE 파라미터를 지원하는 db로 업그레이드한 경우에만 사용하라고 함

1
2
3
4
5
6
# 예전 방식
ENCRYPTION_WALLET_LOCATION =
  (SOURCE=
    (METHOD=FILE)
    (METHOD_DATA=
      (DIRECTORY=/path/to/keystore)))

Note:In previous releases, the SQLNET.ENCRYPTION_WALLET_LOCATION parameter was used to define the keystore directory location. This parameter has been deprecated. Oracle recommends that you use the WALLET_ROOT static initialization parameter and TDE_CONFIGURATION dynamic initialization parameter instead.
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/configuring-transparent-data-encryption.html#GUID-C7989D41-F54B-4A48-ADE7-19175E88889C

https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/using-sqlnet-ora-to-configure-tde-keystores.html#GUID-692F595E-77D7-4E77-9875-8516BDC9811A

 

 

결론 :
tde는 테이블스페이스와 데이터파일에 저장된 정지 데이터(rest data)를 보호하기 위해 사용됨
이를 통해 운영체제나 디스크 탈취 상황에서도 데이터 노출을 방지할 수 있음
테스트 결과, 암호화 전 strings 명령으로는 테이블스페이스 이름, 사용자 SID, 일부 데이터까지 평문 확인 가능했지만
암호화 후에는 암호화된 문자열로 대체되어 사람이 읽을 수 없게 됨
tbs단위로 tde 설정시 alert log에 꽤나 상세하게 동작관련 로그가 표시됨
sqlnet.ora의 encryption_wallet_location는 18c부터 권장되지 않음, wallet_root와 tde_configuration 파라미터 사용이 권장됨

 

 

참조 : 

1228046.1
https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/introduction-to-transparent-data-encryption.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/configuring-transparent-data-encryption.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/ratug/release-changes.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/TABLESPACE_ENCRYPTION.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/using-sqlnet-ora-to-configure-tde-keystores.html#GUID-692F595E-77D7-4E77-9875-8516BDC9811A
https://guide-fin.ncloud-docs.com/docs/hsm-oracle
https://blog.goodusdata.com/105