TDE와 전자지갑
RAC의 Keystore와 마스터 키, 컬럼 암호화 및 지갑 의존성 점검, 로컬 지갑 복사와 공유 지갑 구성 비교
#핵심 요약
TDE는 Keystore(전자지갑)에 둔 마스터 키로 데이터를 암호화함
실습 순서는 Keystore 생성 → 열기 → 마스터 키 설정(WITH BACKUP) → 컬럼 암호화임
지갑이 열려 있지 않은 인스턴스에서 암호화 컬럼을 읽으면 ORA-28365: wallet is not open이 남
비밀번호 Keystore는 DB를 재기동하면 다시 닫힐 수 있어, 실습에서는 재기동 뒤 ORA-28365를 보고 다시 열었음
수업 자료 정리 메모는 19c RAC에서 지갑을 모든 인스턴스가 접근하는 공유 위치에 두어야 하며, 수업처럼 노드 1의 로컬 지갑을 노드 2로 scp 복사하는 방식은 수업 기록으로만 남긴다고 적었음
#개념과 동작 원리
두 실습에서는 수업 기록(로컬 지갑)과 정리 메모(공유 지갑 권장)를 함께 담고 있음
| 항목 | 실습의 노드별 로컬 지갑 | 공유 지갑 구성과 권장 설정 |
|---|---|---|
| 지갑 위치 | 노드별 로컬 디렉터리, 노드 1에서 만든 파일을 노드 2로 scp |
모든 인스턴스가 접근하는 공유 위치(ASM, ACFS 등) |
| 위치 지정 | sqlnet.ora의 ENCRYPTION_WALLET_LOCATION |
WALLET_ROOT, TDE_CONFIGURATION 권장, ENCRYPTION_WALLET_LOCATION은 deprecated라고 설명 |
| 열기, 닫기 | 노드마다 따로 OPEN, CLOSE | 공유 지갑에서는 한 인스턴스의 OPEN, CLOSE가 다른 인스턴스에 동기화된다고 설명 |
| 원복 | 노드마다 sqlnet.ora 수정과 지갑 디렉터리 삭제 |
지갑 위치, TDE 파라미터, 백업 의존성을 확인한 뒤 설계 |
수업 기록에서 노드 1만 지갑을 열었을 때 GV$ENCRYPTION_WALLET은 인스턴스 1 PASSWORD/OPEN, 인스턴스 2 UNKNOWN/NOT_AVAILABLE이었음
수업 자료 메모는 이것이 당시 노드별 로컬 파일 구성의 관찰 결과이며, 정상 공유 지갑 RAC에서도 같은 복사 절차가 필요하다는 근거는 아니라고 적었음
암호화 컬럼의 DDL은 RAC에서 한 인스턴스에서 실행해도 같은 DB에 반영됨
#Oracle Database 19c의 RAC 지갑 기준
RAC는 인스턴스들이 공유하는 TDE 지갑 또는 Oracle Key Vault의 공통 가상 지갑을 사용해야 함
노드마다 개별 TDE 지갑을 두는 구성은 지원되지 않으므로 수업의 로컬 파일 복사 방식을 정상 RAC 구성 절차로 적용하지 않음
공유 파일 기반 구성에서는 모든 인스턴스의 WALLET_ROOT가 같은 공유 위치를 가리켜야 함
ENCRYPTION_WALLET_LOCATION은 deprecated이며 WALLET_ROOT와 TDE_CONFIGURATION 사용이 권장됨
정상 RAC 공유 지갑에서는 한 인스턴스에서 수행한 열기, 닫기, 마스터 키 갱신의 컨텍스트가 다른 인스턴스에도 동기화됨
실습에서는 노드별 로컬 지갑을 사용했으므로 공유 지갑과 동작이 다를 수 있음
#필수 명령어 또는 SQL
#Keystore와 마스터 키
ADMINISTER KEY MANAGEMENT
CREATE KEYSTORE '<WALLET_PATH>'
IDENTIFIED BY "<PASSWORD>";
ADMINISTER KEY MANAGEMENT
SET KEYSTORE OPEN
IDENTIFIED BY "<PASSWORD>";
ADMINISTER KEY MANAGEMENT
SET KEY IDENTIFIED BY "<PASSWORD>"
WITH BACKUP;결과 해석: 수업에서는 Keystore 생성 뒤 지갑 디렉터리에 ewallet.p12가 생겼고, WITH BACKUP으로 마스터 키를 설정하자 날짜가 붙은 백업 지갑 파일이 하나 더 생겼음
수업 자료 메모는 지갑 위치, root와 PDB 컨테이너, 공유 저장소 구성을 확인한 뒤 적용하라고 적었음
#컬럼 암호화
CREATE TABLE emp100 AS SELECT * FROM emp;
ALTER TABLE emp100 MODIFY sal ENCRYPT USING 'AES256';
SELECT ename, sal FROM emp100;결과 해석: 지갑이 열린 인스턴스에서는 SAL이 평소처럼 조회됨
지갑이 열리지 않은 인스턴스에서 같은 조회를 하면 ORA-28365가 남
#인스턴스별 지갑 상태
SELECT inst_id, con_id, wallet_type, status
FROM gv$encryption_wallet
ORDER BY inst_id, con_id;결과 해석: 인스턴스마다 지갑 종류와 상태(OPEN, CLOSED, NOT_AVAILABLE 등)가 나옴
수업 자료 메모는 재기동 뒤에는 이 조회와 암호화 컬럼 조회 성공 여부를 함께 확인하라고 적었음
#재기동 뒤 다시 열기
srvctl stop database -db <DB_NAME>
srvctl start database -db <DB_NAME>결과 해석: 수업에서는 재기동 뒤 암호화 컬럼 조회가 ORA-28365로 실패했고, SET KEYSTORE OPEN으로 다시 연 뒤 조회됐음
실습에서는 -db와 -d 두 표기를 섞어 썼음
자동으로 열리는 지갑 구성은 기재 없음
#복호화와 의존성 확인
ALTER TABLE emp100 MODIFY sal DECRYPT;
SELECT ename, sal FROM emp100;SELECT owner, table_name, column_name, encryption_alg
FROM dba_encrypted_columns;
SELECT tablespace_name, encrypted
FROM dba_tablespaces
WHERE encrypted = 'YES';결과 해석: 수업은 복호화 뒤 DBA_ENCRYPTED_COLUMNS가 no rows selected였음
수업 자료 메모는 이 조회가 현재 컨테이너의 암호화 컬럼만 보므로 지갑의 모든 의존성을 배제하지 못한다고 적었음
ADMINISTER KEY MANAGEMENT
SET KEYSTORE CLOSE
IDENTIFIED BY "<PASSWORD>";결과 해석: 키 사용이 끝난 뒤 닫고 GV$ENCRYPTION_WALLET으로 상태를 다시 봄
수업은 지갑 설정과 디렉터리까지 지운 뒤 재기동했고, 상태가 두 인스턴스 모두 UNKNOWN/NOT_AVAILABLE이었음
#사용 조건과 주의사항
수업의 지갑 디렉터리 삭제(rm -rf)와 테스트 테이블 삭제(`DROP TABLE ... 수업 자료 메모도 테스트 테이블 삭제는 필요한 경우에만 하라고 적었음
수업 기록은 노드 1의 지갑 파일 크기와 노드 2로 복사한 뒤의 파일 크기가 다르고, 백업 지갑 파일 이름의 날짜가 수업 연도와 다름
값을 고쳐 적지 않았음
공유 지갑의 요구사항과 동기화 동작은 위 19c 기준으로 구분하며 실습 서버가 그 공유 구성을 충족했는지는 확인 불가