암호화의 유형

  • 동적 데이터 : 네트워크를 통해 이동 데이터
  • 정적 데이터 : 데이터 파일 내에 저장된 데이터

동적 데이터

  • 데이터베이스로 부터 나오는 정보의 변화하는 스트림을 연속적으로 암호화해야 하고, 클라이언트에 도착했을 때는 복호화
  • 부인방지 데이터
  • 데이터 정확도 보호
  • 데이터 재생 방지

정적 데이터

일반 케이스 설정
{code:sql}
SQL> create tablespace new_in_the_clear datafile 'D:\app\LG\data_file\new_in_the_clear.dbf' size 1m;

테이블스페이스가 생성되었습니다.

SQL> create table new_t
2 ( id varchar2( 30 ) primary key,
3 ssn varchar2( 11 ) ,
4 address varchar2( 80 ) ,
5 credit_card varchar2( 30 )
6 )tablespace new_in_the_clear;

테이블이 생성되었습니다.

SQL> insert into new_t( id, ssn, address, credit_card ) values( 'Lock for me', '123-45-6789', '123 Main Street', '1234-5678-9876-5432' );

1 개의 행이 만들어졌습니다.

SQL> commit;

SQL> alter system checkpoint
2 ;

시스템이 변경되었습니다.

D:\app\LG>strings -a D:\app\LG\data_file\new_in_the_clear.dbf

Strings v2.51
Copyright © 1999-2013 Mark Russinovich
Sysinternals - www.sysinternals.com

}|{z
LQJHLEE68
NEW_IN_THE_CLEAR
Lock for me
123-45-6789
123 Main Street
1234-5678-9876-5432
/ec886133_HistogramHash
/c76191f4_LookupCRIF
/c46a4786_ConstantCRIF
/5c3572a5_MaxFilterXOpImage
/53b33dfb_MagnitudePhaseOpImag
/7574e0ae_DivideComplexCRIF
/a79ab000_TransposeBinaryOpIma
/9633a9ba_MultiplyCRIF
/18c763e5_FilteredSubsampleOpI
/2170a9c1_AndCRIF
...

{code}삭제시
{code:sql}
SQL> delete from new_t where id = 'Lock for me';

1 행이 삭제되었습니다.

SQL> COMMIT;

커밋이 완료되었습니다.

SQL> ALTER SYSTEM CHECKPOINT;

시스템이 변경되었습니다.

D:\app\LG>strings -a D:\app\LG\data_file\new_in_the_clear.dbf

Strings v2.51
Copyright © 1999-2013 Mark Russinovich
Sysinternals - www.sysinternals.com

}|{z
LQJHLEE68
NEW_IN_THE_CLEAR
Lock for me
123-45-6789
123 Main Street
1234-5678-9876-5432
/ec886133_HistogramHash
/c76191f4_LookupCRIF
/c46a4786_ConstantCRIF
/5c3572a5_MaxFilterXOpImage
/53b33dfb_MagnitudePhaseOpImag
/7574e0ae_DivideComplexCRIF
/a79ab000_TransposeBinaryOpIma
/9633a9ba_MultiplyCRIF
/18c763e5_FilteredSubsampleOpI
/2170a9c1_AndCRIF
/157a0d70_SubsampleBinaryToGra
/45f59a27_StreamImage
/5600a10a_AddConstToCollection
/8ada891e_MagnitudeCRIF
/91f23f8_DivideByConstCRIF
/27561cdd_MeanOpImage
/c321a3cb_ColorConvertOpImageI
...

SQL>


|| current online redo log ||
|{code:sql}
SQL> select a.member
  2    from v$logfile a, v$log b
  3   where a.group# = b.group#
  4     and b.status = 'CURRENT'
  5     and rownum = 1;

MEMBER
------------------------------------------------------------------------------
D:\APP\LG\ORADATA\JHLEE68\REDO02.LOG


D:\app\LG>strings -a D:\APP\LG\ORADATA\JHLEE68\REDO02.LOG
...
l memory b
Lock for me
Lock for me
Lock for me
segment header
segment header
segment header
...

SQL>


수작업 애플리케이션 암호화

  • 트리거
  • 저장 프로시저 ( SP, FN )
  • 단점 : 개발에 높은비용 발생, 암복화 키 관리 이슈

오라클 Wallet

Wallet의 이해

  • 암호화 키가 암호화되어 저장된 단순한 파일 이고, 데이터 베이스를 위해 암호화 키를 유지하거나, 다른 오라클 컴포넌트을 위해 일부 정보을 유지한다.
  • 모든 것을 하나의 wallet을 사용하는 것보다는 여러 개의 wallet을 사용하는 것을 오라클은 추천
  • 데이터베이스 외부에 저장됨

Wallet 사용 방법

  • 1. ALTER SYSTEM ... : 무언가을 소유하고 무언가를 알고 있다. ( 둘돠 )
  • 2. 자동 로그인 : 데이터베이스가 오픈 되었을 때 즉시 릴리즈
  • 3. HSM ( hardwar security module ) - 11gR1: 데이터베이스 서버 외부에 external 하드웨어 일부에 키를 저장할 수 있도록 한다.

오라클 Wallet 설정

생성 확인
{CODE:SQL}
D:\app\LG\product\11.2.0\dbhome_1\NETWORK\ADMIN>DIR
D 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 74FA-1C6B

D:\app\LG\product\11.2.0\dbhome_1\NETWORK\ADMIN 디렉터리

2015-01-26 오후 07:20 <DIR> .
2015-01-26 오후 07:20 <DIR> ..
2015-01-26 오후 07:04 <DIR> SAMPLE
2015-01-29 오후 09:34 402 sqlnet.ora
1개 파일 402 바이트
3개 디렉터리 242,302,930,944 바이트 남음

D:\app\LG\product\11.2.0\dbhome_1\NETWORK\ADMIN>

  1. This file is actually generated by netca. But if customers choose to
  2. install "Software Only", this file wont exist and without the native
  3. authentication, they will not be able to connect to the database on NT.

SQLNET.AUTHENTICATION_SERVICES = (NTS)

ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DIRECTORY=D:\app\LG\product\11.2.0\dbhome_1\admin\wallet)))

SQL> alter system set encryption key identified by foobar
2 ;
alter system set encryption key identified by foobar
*
1행에 오류:
ORA-28368: 전자 지갑을 자동으로 생성할 수 없습니다.

D:\app\LG\product\11.2.0\dbhome_1\admin\wallet>dir
D 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 74FA-1C6B

D:\app\LG\product\11.2.0\dbhome_1\admin\wallet 디렉터리

2015-01-29 오후 10:47 <DIR> .
2015-01-29 오후 10:47 <DIR> ..
0개 파일 0 바이트
2개 디렉터리 242,302,869,504 바이트 남음

SQLNET.AUTHENTICATION_SERVICES = (TNSNAMES, EZCONNECT)

ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)
(METHOD_DATA=
(DIRECTORY=D:\app\LG\product\11.2.0\dbhome_1\admin\wallet )
)
)

SQL> alter system set encryption key identified by foobar;
alter system set encryption key identified by foobar
*
1행에 오류:
ORA-28368: 전자 지갑을 자동으로 생성할 수 없습니다.

-- 재기동을 해야하는건가?

SQL> shutdown abort
ORACLE 인스턴스가 종료되었습니다.

SQL> conn sys/1111 as sysdba
휴지 인스턴스에 접속되었습니다.
SQL>
SQL>
SQL> startup
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area 2522038272 bytes
Fixed Size 2283864 bytes
Variable Size 620758696 bytes
Database Buffers 1879048192 bytes
Redo Buffers 19947520 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.
SQL>
SQL>
SQL>
SQL> alter system set encryption key identified by foobar;

시스템이 변경되었습니다.

D:\app\LG\product\11.2.0\dbhome_1\admin\wallet>dir
D 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 74FA-1C6B

D:\app\LG\product\11.2.0\dbhome_1\admin\wallet 디렉터리

2015-01-29 오후 10:53 <DIR> .
2015-01-29 오후 10:53 <DIR> ..
2015-01-29 오후 10:53 2,845 ewallet.p12
1개 파일 2,845 바이트
2개 디렉터리 242,302,746,624 바이트 남음

D:\app\LG\product\11.2.0\dbhome_1\admin\wallet>

SQL> alter system set encryption wallet open identified by foobar;
alter system set encryption wallet open identified by foobar
*
1행에 오류:
ORA-28354: 암호화 전자 지갑, 자동 로그인 전자 지갑 또는 HSM이 이미 열려
있습니다.

-- 머지? ㅠ

-- 암호화된 데이터의 액세스을 차단( 읽기 및 쓰기 불가능 )
SQL> alter system set encryption wallet close identified by foobar;

시스템이 변경되었습니다.

SQL>

{CODE}

transparent 컬럼 레벨 암호화

  • 10gR2
  • 투명화게 복호화 및 암호화
  • 컬럼과 연관된 모든 리두, 언두, 템프 데이터 암호화


SQL> create tablespace tde_test datafile 'D:\app\LG\data_file\tde_test.dbf' size 1m
  2  ;

테이블스페이스가 생성되었습니다.

SQL>

SQL>  create table tde_col_t
  2   ( c1        varchar2( 30 ) ,
  3     c2        varchar2( 30 ) encrypt
  4   )tablespace tde_test;
   c2        varchar2( 30 ) encrypt
   *
3행에 오류:
ORA-28336: SYS 소유 객체를 암호화할 수 없습니다. -- 헐

SQL>  create table SCOTT.tde_col_t
  2   ( c1        varchar2( 30 ) ,
  3     c2        varchar2( 30 ) encrypt
  4   )tablespace tde_test;
 create table SCOTT.tde_col_t
*
1행에 오류:
ORA-28365: 전자 지갑이 열려 있지 않습니다.

SQL> alter system set encryption wallet open identified by foobar;

시스템이 변경되었습니다.

SQL>
SQL>  create table SCOTT.tde_col_t      
  2   ( c1        varchar2( 30 ) ,      
  3     c2        varchar2( 30 ) encrypt
  4   )tablespace tde_test;             
                                        
테이블이 생성되었습니다.                
                                        
SQL>    

SQL> insert into SCOTT.tde_col_t  values( 'this_is_NOT_encrypted', 'this_is_encrypted' );

1 개의 행이 만들어졌습니다.

SQL> select * from SCOTT.tde_col_t
  2  ;

C1                             C2
------------------------------ ------------------------------
this_is_NOT_encrypted          this_is_encrypted

SQL>

SQL>                                


|| 누군가 절취한 상황 연출 wallet close||



SQL> alter system set encryption wallet close identified by foobar;

시스템이 변경되었습니다.
SQL> select * from SCOTT.tde_col_t        
  2  ;                                    
select * from SCOTT.tde_col_t             
                    *                     
1행에 오류:                               
ORA-28365: 전자 지갑이 열려 있지 않습니다.
                                          
                                          
SQL>                                      
SQL>  select c1 from SCOTT.tde_col_t ;

C1
------------------------------
this_is_NOT_encrypted

SQL>
SQL> insert into SCOTT.tde_col_t  values( 'this_is_NOT_encrypted', 'this_is_encrypted' );
insert into SCOTT.tde_col_t  values( 'this_is_NOT_encrypted', 'this_is_encrypted' )
                  *
1행에 오류:
ORA-28365: 전자 지갑이 열려 있지 않습니다.

SQL> insert into SCOTT.tde_col_t  values( 'this_is_NOT_encrypted',   null );

1 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> alter system set encryption wallet open identified by foobar;

시스템이 변경되었습니다.

SQL>  select * from SCOTT.tde_col_t;

C1                             C2
------------------------------ ------------------------------
this_is_NOT_encrypted          this_is_encrypted
this_is_NOT_encrypted

SQL>



|| 데이터파일 내용 확인 ||



SQL> alter system checkpoint
  2  ;

시스템이 변경되었습니다.

D:\app\LG>strings  -a D:\app\LG\data_file\tde_test.dbf

Strings v2.51
Copyright (C) 1999-2013 Mark Russinovich
Sysinternals - www.sysinternals.com

}|{z
LQJHLEE68
TDE_TEST
this_is_NOT_encrypted,
this_is_NOT_encryptedDA,H]
Ge^L
zyh
zqZ


Transparent 테이블 스페이스 암호화

  • 11gR1
  • 테이블 스페이스에 저장되는 모든 세그먼트는 암호화 포맷( INDEX, LOBSEGMENT, TABLE PARTITION )으로 디스크에 저장


SQL> create tablespace clear datafile 'D:\app\LG\data_file\clear.dbf' size 1m;

테이블스페이스가 생성되었습니다.

SQL> create tablespace encrypted datafile 'D:\app\LG\data_file\encrypted.dbf' size 1m
  2  encryption default storage ( encrypt );

테이블스페이스가 생성되었습니다.

SQL> create table SCOTT.ts_clear_t tablespace clear
  2  as
  3  select *
  4    from all_users;

테이블이 생성되었습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> create index SCOTT.ts_clear_t_ix01 on SCOTT.ts_clear_t ( lower( username )) tablespace clear;

인덱스가 생성되었습니다.

SQL> alter system checkpoint
  2  ;

시스템이 변경되었습니다.

SQL>

D:\app\LG>strings  -a D:\app\LG\data_file\clear.dbf

Strings v2.51
Copyright (C) 1999-2013 Mark Russinovich
Sysinternals - www.sysinternals.com

}|{z
LQJHLEE68
CLEAR
SYS
SYSTEM
OUTLN
DIP
ORACLE_OCM
DBSNMP
APPQOSSYS
WMSYS
 #,
XS$NULL
01%'
EXFSYS
&),
CTXSYS
&6,
XDB
' ,
ANONYMOUS
' ,
ORDSYS
)$,
ORDDATA
)$,
ORDPLUGINS
)$,
SI_INFORMTN_SCHEMA
)$,
MDSYS
)$,
OLAPSYS
. ,
MDDATA
SPATIAL_WFS_ADMIN_USR
3$,
SPATIAL_CSW_ADMIN_USR
3(,
SYSMAN
3;,
MGMT_VIEW
FLOWS_FILES
APEX_PUBLIC_USER
APEX_030200
OWBSYS
OWBSYS_AUDIT
SCOTT
xs$null
xdb
wmsys
system
sysman
sys
spatial_wfs_admin_usr
spatial_csw_admin_usr
si_informtn_schema
scott
owbsys_audit
owbsys
outln
ordsys
ordplugins
orddata
oracle_ocm
olapsys
mgmt_view
mdsys
mddata
flows_files
exfsys
dip
dbsnmp
ctxsys
appqossys
apex_public_user
apex_030200
anonymous

D:\app\LG>




|| 컬럼레벨 암호화 제약 조건 FBI 불가 ||
{CODE:SQL}

SQL> ALTER TABLE SCOTT.ts_clear_t MODIFY USERNAME ENCRYPT;
ALTER TABLE SCOTT.ts_clear_t MODIFY USERNAME ENCRYPT
*
1행에 오류:
ORA-28348: 지정된 열에 정의된 인덱스를 암호화할 수 없습니다.

SQL> DROP INDEX SCOTT.ts_clear_t_ix01;

인덱스가 삭제되었습니다.

SQL> ALTER TABLE SCOTT.ts_clear_t MODIFY USERNAME ENCRYPT;

테이블이 변경되었습니다.

SQL> -- 테이블 초기화 및 생성

SQL> ALTER TABLE SCOTT.ts_clear_t MOVE TABLESPACE ENCRYPTED;

테이블이 변경되었습니다.

SQL> ALTER INDEX SCOTT.ts_clear_t_ix01 REBUILD TABLESPACE ENCRYPTED
2 ;

인덱스가 변경되었습니다.

D:\app\LG>strings -a D:\app\LG\data_file\encrypted.dbf

Strings v2.51
Copyright © 1999-2013 Mark Russinovich
Sysinternals - www.sysinternals.com

}|{z
LQJHLEE68
ENCRYPTED
>cN
+?uU
fvi
^,z
Odn
G2{
~$w
k[^*{
X!?]
_;7
H.K
MBQ8
N9&
b+7
s^^
PF2GrF
J>~
r,,
qjV
)DYr
!^,
%or
.q.
SYg"
RDQE
9 @
UOt8
yaL
ny1dJ
[7K
*M$
DEW
ecl
dx?
/Ye(
QP!o}y*qox
g>N
;?!
vWm
QDbP
\@(
Sl1\
'F:
2rH
R 8
j_K!
vxZ~>
o0Y
.c7X
d2n
$.,
>x\
s,;
csv
Yt5
ji/
wW:}
`LpI
{tHMf
g%`0W
agn
1j0
VaRQ
Qli
Wr?`
>)cl
72<
fES
6qV
aaH
G9y
x?g
X [
Z\9
9j
;`d{
/u`
I7[
vN=U
Kc/
8P9e
c!~
p_!
@G8
S],
x&L
k^;
g1Y
]Y0
!cN
\oJ+
*Vl
`0i
.kN
L4@N4CBb6
}#g
p2$
AM#@
7cW
{G`
7!zS>C
v:C
OqG
f3?d
71>~B?
=@G
&R)cP
Wim
o58@
Had
PEyq
91Jb
d^J
i?ZAI
Jgb7
6{g
7RN
v!4
y{vL
q09F
AxK
b#s'c
?I3
P )
[N!
.OR
B%
=0F
Nu'
X^O
8@c
NVu
y/~*
{Lg
3ecW
`nQ
0#Q8
[ 0u>,
jVk
0A|
e5}-
_kN
_$g
>4y
YUn))
U K(4EeF
_v]
W:p
/HUE{
ru/T
0^}
pRS(
eE.YY
WC=/
/3=
o$A

{CODE} || MOVE == COPY ||
{CODE:SQL}
D:\app\LG>strings -a D:\app\LG\data_file\clear.dbf

Strings v2.51
Copyright © 1999-2013 Mark Russinovich
Sysinternals - www.sysinternals.com

}|{z
LQJHLEE68
CLEAR
SYS
SYSTEM
OUTLN
DIP
ORACLE_OCM
DBSNMP
APPQOSSYS
WMSYS
#,
XS$NULL
01%'
EXFSYS
&),
CTXSYS
&6,
XDB
' ,
ANONYMOUS
' ,
ORDSYS
)$,
ORDDATA
)$,
ORDPLUGINS
)$,
SI_INFORMTN_SCHEMA
)$,
MDSYS
)$,
OLAPSYS
. ,
MDDATA
SPATIAL_WFS_ADMIN_USR
3$,
SPATIAL_CSW_ADMIN_USR
3(,
SYSMAN
3;,
MGMT_VIEW
FLOWS_FILES
APEX_PUBLIC_USER
APEX_030200
OWBSYS
OWBSYS_AUDIT
SCOTT
xs$null
xdb
wmsys
system
sysman
sys
spatial_wfs_admin_usr
spatial_csw_admin_usr
si_informtn_schema
scott
owbsys_audit
owbsys
outln
ordsys
ordplugins
orddata
oracle_ocm
olapsys
mgmt_view
mdsys
mddata
flows_files
exfsys
dip
dbsnmp
ctxsys
appqossys
apex_public_user
apex_030200
anonymous

D:\app\LG>

{CODE}

암호화와 관련 없는 것

  • 암호화 : 절도 또는 분실로부터 정적 제이터을 보호하는 것
  • 접근 제어 : 어떠한 규칙에 따라 데이터에 실시간으로 접근하는 것을 제한하는 것

접근 제어 규칙

  • GRANT 와 REVOKE : 사용자 또는 시스템전체 객체 레벨 접근을 허용한다.
  • 로우 레벨 보안 : 특정 로우에 접근을 허용 또한 방지
  • 컬럼 레벨 보안 : 특정 컬럼에 접근을 허용 또한 방지

수작업 애플리케이션 암호화 구현

  • DBMS_OBFUSCATION_TOOLKIT : 8i ~ 10g, DES( DATA