MySQL과 MariaDB를 위한 새로운 암호화 방법,

Engine Level Encryption
박광근 팀장 / D’Amo 개발 2팀
Penta Security Systems Inc.
CONTENTS
1. 개발 배경
2. 개발 방향 & OSS와의 관계

3. Encryption Engine 구조 및 소스
4. What’s Next?
0. 시작하기에 앞서…
1. 개발 배경
1. 개발 배경
암호화를 위한 고려사항
보안, 성능, 기능 을 고려하여 암호화를 해야 한다.

보안

성능

기능

(Security)

(Performance)

(Functionality)

DBMS 암호화
1. 개발 배경
IT 시스템 구조

SERVE
R

CLIENT

AS

(Application Server)

DATABASE
1. 개발 배경
암호화 종류

CLIENT

SERVER

AS

(Application Server)

DATABASE

암호화 종류
사용자 인증 암호화

사용자 인증 암호화

사용자 인증 암호화

사용자 인증 암호화...
1. 개발 배경
DBMS 암호화 방식
DBMS 암호화 종류

SERVER
Database API
암호화
Plug-in 암호화
Application API
암호화

AS

(Application Server)

DATAB...
1. 개발 배경
DBMS 암호화 방식
DBMS 암호화 종류 – 암호화 단위

File-Level 암호화

Column-Level 암호화
1. 개발 배경
DBMS 암호화 방식
DBMS 암호화 종류 – 암호화 장소
1. Application API 암호화

SERVER

 Application Server 소스를 수정하여

Database API
암호화
...
1. 개발 배경
Engine Level 암호화
기존 Database Level Encryption 이 존재
ex) TDE (Transparent Database Encryption)

TDE

DATABASE

Encr...
1. 개발 배경
Engine Level 암호화
기존 Database Level Encryption 의 한계

What can I encrypt and decrypt?
Who can encrypt and decrypt?
...
1. 개발 배경
암호화는 보안이 아닌가?
접근제어, 감사, 안전한 키 관리가 가능할 때, 암호화는 보안이 될 수 있다.

Data
Encryption

Access
Control
Audit

Key
1. 개발 배경
Open Source Database, MySQL & MariaDB (1/3)
내부 소스가 공개된 Open Source DB 인 MySQL 와 MariaDB 는 좀 더 효율적인
암호화 소프트웨어 개발 가...
1. 개발 배경
Open Source Database, MySQL & MariaDB (2/3)
Application

Application

MySQL Server

Storage Engine

Data

Applica...
1. 개발 배경
Open Source Database, MySQL & MariaDB (3/3)
암호화 엔진 (Encryption Engine) 을 내부에 삽입하는 방식
Application

Application

My...
1. 개발 배경
Engine Level Encryption for MySQL & MariaDB
자체 개발 Encryption Engine을 통한 안전한 암호화 제공 가능

Encryption
Access Control
...
2. 개발 방향 & OSS와의 관계
2. 개발 방향 & OSS와의 관계
MySQL과 MariaDB 의 라이선스 정책
MySQL  GPL 라이선스

GPL

LGPL

BSD

MPL

QPL/상용QT

코드의 무료 이용

O

O

O

O

O/X

...
2. 개발 방향 & OSS와의 관계
MySQL과 MariaDB 의 라이선스 정책 활용
암호화 엔진  오픈 소스
암호화 엔진 + 암호 모듈  프리웨어
3. Encryption Engine 구조 및 소스
3. Encryption Engine 구조 및 소스
Application API 암호화 방식
SERVE
R

CLIENT

AS

(Application Server)

DATABASE

‘700101-1234567’ ...
3. Encryption Engine 구조 및 소스
Database API 암호화 방식
SERVE
R

CLIENT

AS

(Application Server)

DATABASE

‘700101-1234567’ 입력
...
3. Encryption Engine 구조 및 소스
Database API 암호화 방식 : MySQL과 MariaDB 기본 암호화 함수
SERVE
R

CLIENT

AS

(Application Server)

DAT...
3. Encryption Engine 구조 및 소스
Plug-in 암호화 방식
SERVE
R

CLIENT

AS

(Application Server)

DATABASE

‘700101-1234567’ 입력
INSER...
3. Encryption Engine 구조 및 소스
Engine Level 암호화 방식 : Encryption Engine
SERVE
R

CLIENT

AS

(Application Server)

DATABASE

...
3. Encryption Engine 구조 및 소스
Encryption Engine 구조

MySQL Server
MySQL Server

Storage Engine
Storage Engine
MyISAM

InnoDB...
3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 처리 방법

• Record 단위로 처리
• 컬럼 타입
• VARCHAR : 컬럼길이+데이터
• 컬럼 사이즈가 256 이상일...
3. Encryption Engine 구조 및 소스
Encryption Engine : 암호화 함수 1
bool ha_example::encData(TABLE *table, uchar *buf)
{
unsigned in...
3. Encryption Engine 구조 및 소스
Encryption Engine : 암호화 함수 2
Field *field = table->field[i];
uchar* record = table->record[0]...
3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 입력 ( INSERT )
Int ha_example::write_row(uchar *buf)
{
int error = HA_...
3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 조회 ( SELECT )
Int ha_example::rnd_next(uchar *buf)
{
int error = 0;
e...
3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 수정 ( UPDATE )
int ha_example::update_row(const uchar *old_data, uchar...
3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 검색 조회 ( WHERE ) – INDEX 없을 경우
Int ha_example::rnd_next(uchar *buf)
{
...
3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 검색 조회 ( WHERE ) – INDEX 있을 경우
int ha_damo::index_read_map(uchar *buf,...
3. Encryption Engine 구조 및 소스
Encryption Engine : 데이터 삭제 ( DELETE )
int ha_example::delete_row(const uchar *buf)
{
int erro...
3. Encryption Engine 구조 및 소스
Custom Storage Engine 관련 자료

• MySQL Source
• storage/example/ha_example.h
• storage/example/...
4. What’s Next?
4. What’s Next?
현재 상황
비상업적 개인을 대상으로 프리웨어로 배포 중
4. What’s Next?
미래 계획
다른 OSS DB에 대한 개발도 검토중
Q&A
THANK YOU
Upcoming SlideShare
Loading in...5
×

DEVIEW 2013 Presentation

1,894

Published on

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.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,894
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

DEVIEW 2013 Presentation

  1. 1. MySQL과 MariaDB를 위한 새로운 암호화 방법, Engine Level Encryption 박광근 팀장 / D’Amo 개발 2팀 Penta Security Systems Inc.
  2. 2. CONTENTS 1. 개발 배경 2. 개발 방향 & OSS와의 관계 3. Encryption Engine 구조 및 소스 4. What’s Next?
  3. 3. 0. 시작하기에 앞서…
  4. 4. 1. 개발 배경
  5. 5. 1. 개발 배경 암호화를 위한 고려사항 보안, 성능, 기능 을 고려하여 암호화를 해야 한다. 보안 성능 기능 (Security) (Performance) (Functionality) DBMS 암호화
  6. 6. 1. 개발 배경 IT 시스템 구조 SERVE R CLIENT AS (Application Server) DATABASE
  7. 7. 1. 개발 배경 암호화 종류 CLIENT SERVER AS (Application Server) DATABASE 암호화 종류 사용자 인증 암호화 사용자 인증 암호화 사용자 인증 암호화 사용자 인증 암호화 전송 구간 암호화 전송 구간 암호화 구간 암호화 주요 파일 암호화 주요 파일 암호화 파일 암호화 개인정보 암호화 암호화된 데이터 접근제어 암호화 키 안전한 관리 (저장 및 접근제어) 암호화 키 안전한 관리 (저장 및 접근제어) DBMS 암호화 암호화 키 안전한 관리 (저장 및 접근제어) 키 관리
  8. 8. 1. 개발 배경 DBMS 암호화 방식 DBMS 암호화 종류 SERVER Database API 암호화 Plug-in 암호화 Application API 암호화 AS (Application Server) DATABASE
  9. 9. 1. 개발 배경 DBMS 암호화 방식 DBMS 암호화 종류 – 암호화 단위 File-Level 암호화 Column-Level 암호화
  10. 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. 11. 1. 개발 배경 Engine Level 암호화 기존 Database Level Encryption 이 존재 ex) TDE (Transparent Database Encryption) TDE DATABASE Encrypted DATABASE
  12. 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. 13. 1. 개발 배경 암호화는 보안이 아닌가? 접근제어, 감사, 안전한 키 관리가 가능할 때, 암호화는 보안이 될 수 있다. Data Encryption Access Control Audit Key
  14. 14. 1. 개발 배경 Open Source Database, MySQL & MariaDB (1/3) 내부 소스가 공개된 Open Source DB 인 MySQL 와 MariaDB 는 좀 더 효율적인 암호화 소프트웨어 개발 가능  MySQL & MariaDB 에 가장 최적화된 암호화 방식은 Engine Level Encryption
  15. 15. 1. 개발 배경 Open Source Database, MySQL & MariaDB (2/3) Application Application MySQL Server Storage Engine Data Application
  16. 16. 1. 개발 배경 Open Source Database, MySQL & MariaDB (3/3) 암호화 엔진 (Encryption Engine) 을 내부에 삽입하는 방식 Application Application MySQL Server Storage Engine Data Application
  17. 17. 1. 개발 배경 Engine Level Encryption for MySQL & MariaDB 자체 개발 Encryption Engine을 통한 안전한 암호화 제공 가능 Encryption Access Control Audit Key Management
  18. 18. 2. 개발 방향 & OSS와의 관계
  19. 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. 20. 2. 개발 방향 & OSS와의 관계 MySQL과 MariaDB 의 라이선스 정책 활용 암호화 엔진  오픈 소스 암호화 엔진 + 암호 모듈  프리웨어
  21. 21. 3. Encryption Engine 구조 및 소스
  22. 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. 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. 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. 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. 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. 27. 3. Encryption Engine 구조 및 소스 Encryption Engine 구조 MySQL Server MySQL Server Storage Engine Storage Engine MyISAM InnoDB Data … MyISAM InnoDB Encrypted Data & Data …
  28. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  38. 38. 4. What’s Next?
  39. 39. 4. What’s Next? 현재 상황 비상업적 개인을 대상으로 프리웨어로 배포 중
  40. 40. 4. What’s Next? 미래 계획 다른 OSS DB에 대한 개발도 검토중
  41. 41. Q&A
  42. 42. THANK YOU
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×