Presentation for DEVIEW 2013, developer conference by NHN.
This session have introduced encryption technology, engine-level encryption for MySQL & MariaDB.
This is main technology of MyDiamo.
Although this is Korean one, you can understand what we said.
See more at http://www.mydiamo.com
Thanks.
5. 1. 개발 배경
암호화를 위한 고려사항
보안, 성능, 기능 을 고려하여 암호화를 해야 한다.
보안
성능
기능
(Security)
(Performance)
(Functionality)
DBMS 암호화
6. 1. 개발 배경
IT 시스템 구조
SERVE
R
CLIENT
AS
(Application Server)
DATABASE
7. 1. 개발 배경
암호화 종류
CLIENT
SERVER
AS
(Application Server)
DATABASE
암호화 종류
사용자 인증 암호화
사용자 인증 암호화
사용자 인증 암호화
사용자 인증 암호화
전송 구간 암호화
전송 구간 암호화
구간 암호화
주요 파일 암호화
주요 파일 암호화
파일 암호화
개인정보 암호화
암호화된 데이터 접근제어
암호화 키 안전한 관리
(저장 및 접근제어)
암호화 키 안전한 관리
(저장 및 접근제어)
DBMS 암호화
암호화 키 안전한 관리
(저장 및 접근제어)
키 관리
8. 1. 개발 배경
DBMS 암호화 방식
DBMS 암호화 종류
SERVER
Database API
암호화
Plug-in 암호화
Application API
암호화
AS
(Application Server)
DATABASE
9. 1. 개발 배경
DBMS 암호화 방식
DBMS 암호화 종류 – 암호화 단위
File-Level 암호화
Column-Level 암호화
10. 1. 개발 배경
DBMS 암호화 방식
DBMS 암호화 종류 – 암호화 장소
1. Application API 암호화
SERVER
Application Server 소스를 수정하여
Database API
암호화
암호화
2. Database API 암호화
Database 소스를 수정하여 암호화
3. Plug-in 암호화
Database 서버 내부에 암호화 모듈
을 삽입하여 암호화
4. Engine Level 암호화
Database 내부에 암호화 Engine을
삽입하여 암호화
API Application
암호화
AS
(Application Server)
Plug-in 암호화
DATABASE
11. 1. 개발 배경
Engine Level 암호화
기존 Database Level Encryption 이 존재
ex) TDE (Transparent Database Encryption)
TDE
DATABASE
Encrypted
DATABASE
12. 1. 개발 배경
Engine Level 암호화
기존 Database Level Encryption 의 한계
What can I encrypt and decrypt?
Who can encrypt and decrypt?
When can I encrypt and decrypt?
Who manage the encryption key?
Encryption is not Security
13. 1. 개발 배경
암호화는 보안이 아닌가?
접근제어, 감사, 안전한 키 관리가 가능할 때, 암호화는 보안이 될 수 있다.
Data
Encryption
Access
Control
Audit
Key
14. 1. 개발 배경
Open Source Database, MySQL & MariaDB (1/3)
내부 소스가 공개된 Open Source DB 인 MySQL 와 MariaDB 는 좀 더 효율적인
암호화 소프트웨어 개발 가능
MySQL & MariaDB 에 가장 최적화된 암호화 방식은 Engine Level Encryption
15. 1. 개발 배경
Open Source Database, MySQL & MariaDB (2/3)
Application
Application
MySQL Server
Storage Engine
Data
Application
16. 1. 개발 배경
Open Source Database, MySQL & MariaDB (3/3)
암호화 엔진 (Encryption Engine) 을 내부에 삽입하는 방식
Application
Application
MySQL Server
Storage Engine
Data
Application
17. 1. 개발 배경
Engine Level Encryption for MySQL & MariaDB
자체 개발 Encryption Engine을 통한 안전한 암호화 제공 가능
Encryption
Access Control
Audit
Key Management
19. 2. 개발 방향 & OSS와의 관계
MySQL과 MariaDB 의 라이선스 정책
MySQL GPL 라이선스
GPL
LGPL
BSD
MPL
QPL/상용QT
코드의 무료 이용
O
O
O
O
O/X
코드의 자유 배포
O
O
O
O
O/X
소스 코드의 공개
O
O
O
O
O/X
소스 코드의 수정
O
O
O
O
O/O
수정 코드의 소스 공개
O
O
X
O
O/X
상용 소프트웨어와의 링크
X
O
O
O
X/O
20. 2. 개발 방향 & OSS와의 관계
MySQL과 MariaDB 의 라이선스 정책 활용
암호화 엔진 오픈 소스
암호화 엔진 + 암호 모듈 프리웨어
22. 3. Encryption Engine 구조 및 소스
Application API 암호화 방식
SERVE
R
CLIENT
AS
(Application Server)
DATABASE
‘700101-1234567’ 입력
ENC = Enc_Str(‘700101-1234567’)
INSERT INTO TABLE(SSN) VALUE
(ENC)
8078DE5E30D1C706BCE816D6759CBD
FE
SELECT SSN as ENC_SSN FROM
TABLE
SSN = Dec_Str(ENC_SSN)
‘700101-1234567’ 조회
23. 3. Encryption Engine 구조 및 소스
Database API 암호화 방식
SERVE
R
CLIENT
AS
(Application Server)
DATABASE
‘700101-1234567’ 입력
INSERT INTO TABLE(SSN)
VALUE (ENC_UDF(‘700101-1234567’))
8078DE5E30D1C706BCE816D6759CBD
FE
SELECT DEC_UDF(SSN) FROM
TABLE
‘700101-1234567’ 조회
24. 3. Encryption Engine 구조 및 소스
Database API 암호화 방식 : MySQL과 MariaDB 기본 암호화 함수
SERVE
R
CLIENT
AS
(Application Server)
DATABASE
‘700101-1234567’ 입력
INSERT INTO TABLE(SSN)
VALUE (AES_Encrypt(‘700101-1234567’,
‘KEY’))
8078DE5E30D1C706BCE816D6759CBD
FE
SELECT AES_Decrypt(SSN, ‘KEY’) FROM
TABLE
‘700101-1234567’ 조회
25. 3. Encryption Engine 구조 및 소스
Plug-in 암호화 방식
SERVE
R
CLIENT
AS
(Application Server)
DATABASE
‘700101-1234567’ 입력
INSERT INTO TABLE(SSN) VALUE (‘7001011234567’)
INSERT INTO TABLE(SSN)
VALUE(ENC_UDF(‘700101-1234567’)
8078DE5E30D1C706BCE816D6759CBD
FE
SELECT DEC_UDF(SSN) FROM TABLE
SELECT SSN FROM TABLE
‘700101-1234567’ 출력
26. 3. Encryption Engine 구조 및 소스
Engine Level 암호화 방식 : Encryption Engine
SERVE
R
CLIENT
AS
(Application Server)
DATABASE
‘700101-1234567’ 입력
INSERT INTO TABLE(SSN)
VALUE (‘700101-1234567’)
8078DE5E30D1C706BCE816D6759CBD
FE
SELECT SSN FROM TABLE
‘700101-1234567’ 출력
27. 3. Encryption Engine 구조 및 소스
Encryption Engine 구조
MySQL Server
MySQL Server
Storage Engine
Storage Engine
MyISAM
InnoDB
Data
…
MyISAM
InnoDB
Encrypted Data
& Data
…
28. 3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 처리 방법
• Record 단위로 처리
• 컬럼 타입
• VARCHAR : 컬럼길이+데이터
• 컬럼 사이즈가 256 이상일 경우 : 컬럼길이(2byte)+데이터
• 컬럼 사이즈가 256 미만일 경우 : 컬럼길이(1byte)+데이터
• CHAR
• 컬럼 사이즈
• 예) CREATE TABLE MEMBER ( C1 VARCHAR(20), C2 CHAR(10) );
• INSERT INTO MEMBER VALUES ( ‘1234’, ‘12345’);
• 0x 04
31323334 31323334352020202020
• 컬럼길이 ‘1234’
‘12345 ’
29. 3. Encryption Engine 구조 및 소스
Encryption Engine : 암호화 함수 1
bool ha_example::encData(TABLE *table, uchar *buf)
{
unsigned int fieldCount = table->s->fields;
for (unsigned int i = 0; i < fieldCount; i++)
{
Field *field = table->field[i];
if (!checkAccessPrivilege(field->field_index)) return false;
if (!isEncryptedColumn(field->field_index)) continue;
if (!checkEncPrivilege(field->field_index))
return false;
암호화 함수 2
}
}
return true;
30. 3. Encryption Engine 구조 및 소스
Encryption Engine : 암호화 함수 2
Field *field = table->field[i];
uchar* record = table->record[0];
uint offset = field->offset(record);
enum_field_types type = (enum_field_types) field->type();
switch (type)
{
case MYSQL_TYPE_VARCHAR:
{
data_length = *(buf + offset);
dataPos = buf + offset + 1;
outLen = encDataVar(field->field_index, dataPos, data_length, out);
}
}
*(buf + offset) = (uchar) (outLen & 0xFF);
memcpy(dataPos, (uchar*) out, (size_t) outLen);
break;
31. 3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 입력 ( INSERT )
Int ha_example::write_row(uchar *buf)
{
int error = HA_ERR_INTERNAL_ERROR;
if ( encData(table, buf) )
error = storage_handler->write_row(buf);
}
return error;
32. 3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 조회 ( SELECT )
Int ha_example::rnd_next(uchar *buf)
{
int error = 0;
error = storage_handler->rnd_next(buf)
if ( error )
return error;
if ( !decData(table, buf) )
{
return HA_ERR_INTERNAL_ERROR;
}
}
return error;
33. 3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 수정 ( UPDATE )
int ha_example::update_row(const uchar *old_data, uchar *new_data)
{
int error = HA_ERR_INTERNAL_ERROR;
uchar* tmpBuf = (uchar*) malloc(table->s->reclength);
memcpy(tmpBuf, old_data, table->s->reclength);
if (encData(table, new_data))
{
if (encData(table, tmpBuf))
{
error = storage_handler->update_row(tmpBuf, new_data);
}
}
}
free(tmpBuf);
return error;
34. 3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 검색 조회 ( WHERE ) – INDEX 없을 경우
Int ha_example::rnd_next(uchar *buf)
{
int error = 0;
error = storage_handler->rnd_next(buf)
if ( error )
return error;
if ( !decData(table, buf) )
{
return HA_ERR_INTERNAL_ERROR;
}
}
return error;
35. 3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 검색 조회 ( WHERE ) – INDEX 있을 경우
int ha_damo::index_read_map(uchar *buf, const uchar *key, key_part_map
keypart_map, enum ha_rkey_function find_flag)
{
int error = 0;
int keyLen = calculate_key_len(table, active_index, key, keypart_map);
uchar* keyTmp = (uchar*) malloc(keyLen);
memcpy(keyTmp, key, keyLen);
if ( !keyEncrypt(active_index, keyTemp, keyLen) )
return HA_ERR_INTERNAL_ERROR;
error = storage_handler->index_read_map(buf, keyTemp, keypart_map, find_flag)
if (error) return error;
if ( !decData(table, buf) )
return HA_ERR_INTERNAL_ERROR;
}
return 0;
36. 3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 삭제 ( DELETE )
int ha_example::delete_row(const uchar *buf)
{
int error = HA_ERR_INTERNAL_ERROR;
uchar* tmpBuf = (uchar*) malloc(table->s->reclength);
memcpy(tmpBuf, buf, table->s->reclength);
if (encData(table, tmpBuf))
{
error = storage_handler->delete_row(tmpBuf);
}
}
free(tmpBuf);
return error;
37. 3. Encryption Engine 구조 및 소스
Custom Storage Engine 관련 자료
• MySQL Source
• storage/example/ha_example.h
• storage/example/ha_example.cc
• MySQL Dev Page
• Storage Engine
• http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html
• Custom Storage Engine
• http://dev.mysql.com/doc/internals/en/custom-engine.html
• Data Type Storage Requirements
• http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html