SlideShare une entreprise Scribd logo
1  sur  42
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

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

사용자 인증 암호화

사용자 인증 암호화

사용자 인증 암호화

전송 구간 암호화

전송 구간 암호화

구간 암호화

주요 파일 암호화

주요 파일 암호화

파일 암호화
개인정보 암호화
암호화된 데이터 접근제어

암호화 키 안전한 관리
(저장 및 접근제어)

암호화 키 안전한 관리
(저장 및 접근제어)

DBMS 암호화

암호화 키 안전한 관리
(저장 및 접근제어)

키 관리
1. 개발 배경
DBMS 암호화 방식
DBMS 암호화 종류

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

AS

(Application Server)

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

File-Level 암호화

Column-Level 암호화
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
1. 개발 배경
Engine Level 암호화
기존 Database Level Encryption 이 존재
ex) TDE (Transparent Database Encryption)

TDE

DATABASE

Encrypted
DATABASE
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
1. 개발 배경
암호화는 보안이 아닌가?
접근제어, 감사, 안전한 키 관리가 가능할 때, 암호화는 보안이 될 수 있다.

Data
Encryption

Access
Control
Audit

Key
1. 개발 배경
Open Source Database, MySQL & MariaDB (1/3)
내부 소스가 공개된 Open Source DB 인 MySQL 와 MariaDB 는 좀 더 효율적인
암호화 소프트웨어 개발 가능
 MySQL & MariaDB 에 가장 최적화된 암호화 방식은 Engine Level Encryption
1. 개발 배경
Open Source Database, MySQL & MariaDB (2/3)
Application

Application

MySQL Server

Storage Engine

Data

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

Application

MySQL Server

Storage Engine

Data

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

Encryption
Access Control
Audit
Key Management
2. 개발 방향 & OSS와의 관계
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
2. 개발 방향 & OSS와의 관계
MySQL과 MariaDB 의 라이선스 정책 활용
암호화 엔진  오픈 소스
암호화 엔진 + 암호 모듈  프리웨어
3. Encryption Engine 구조 및 소스
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’ 조회
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’ 조회
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’ 조회
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’ 출력
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’ 출력
3. Encryption Engine 구조 및 소스
Encryption Engine 구조

MySQL Server
MySQL Server

Storage Engine
Storage Engine
MyISAM

InnoDB

Data

…

MyISAM

InnoDB

Encrypted Data
& Data

…
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 ’
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;
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;
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;
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;
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;
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;
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;
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;
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
4. What’s Next?
4. What’s Next?
현재 상황
비상업적 개인을 대상으로 프리웨어로 배포 중
4. What’s Next?
미래 계획
다른 OSS DB에 대한 개발도 검토중
Q&A
THANK YOU

Contenu connexe

Similaire à DEVIEW 2013 Presentation

Migration to Azure Database for MySQL
Migration to Azure Database for MySQLMigration to Azure Database for MySQL
Migration to Azure Database for MySQLrockplace
 
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀EXEM
 
MariaDB Administrator 교육
MariaDB Administrator 교육 MariaDB Administrator 교육
MariaDB Administrator 교육 Sangmo Kim
 
MySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxMySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxNeoClova
 
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 인프라 연동 (CB-Spider)
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 인프라 연동 (CB-Spider)Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 인프라 연동 (CB-Spider)
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 인프라 연동 (CB-Spider)Cloud-Barista Community
 
MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바NeoClova
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQLI Goo Lee
 
Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...
Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...
Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...Amazon Web Services Korea
 
DB Migration to Azure Database for MySQL
DB Migration to Azure Database for MySQLDB Migration to Azure Database for MySQL
DB Migration to Azure Database for MySQLrockplace
 
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...Amazon Web Services Korea
 
Azure Database for MySQL
Azure Database for MySQLAzure Database for MySQL
Azure Database for MySQLrockplace
 
Azure Databases for PostgreSQL MYSQL and MariaDB
Azure Databases for PostgreSQL MYSQL and MariaDBAzure Databases for PostgreSQL MYSQL and MariaDB
Azure Databases for PostgreSQL MYSQL and MariaDBrockplace
 
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)Sang Don Kim
 
Amazon Redshift 아키텍처 및 모범사례::김민성::AWS Summit Seoul 2018
Amazon Redshift 아키텍처 및 모범사례::김민성::AWS Summit Seoul 2018Amazon Redshift 아키텍처 및 모범사례::김민성::AWS Summit Seoul 2018
Amazon Redshift 아키텍처 및 모범사례::김민성::AWS Summit Seoul 2018Amazon Web Services Korea
 
Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...
Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...
Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...Cloud-Barista Community
 
폴라리스오피스 운영시스템
폴라리스오피스 운영시스템폴라리스오피스 운영시스템
폴라리스오피스 운영시스템SANGGI CHOI
 
Amazon Redshift로 데이터웨어하우스(DW) 구축하기
Amazon Redshift로 데이터웨어하우스(DW) 구축하기Amazon Redshift로 데이터웨어하우스(DW) 구축하기
Amazon Redshift로 데이터웨어하우스(DW) 구축하기Amazon Web Services Korea
 
AWS 6월 웨비나 | AWS에서 MS SQL 서버 운영하기 (김민성 솔루션즈아키텍트)
AWS 6월 웨비나 | AWS에서 MS SQL 서버 운영하기 (김민성 솔루션즈아키텍트)AWS 6월 웨비나 | AWS에서 MS SQL 서버 운영하기 (김민성 솔루션즈아키텍트)
AWS 6월 웨비나 | AWS에서 MS SQL 서버 운영하기 (김민성 솔루션즈아키텍트)Amazon Web Services Korea
 
손쉬운 데이터 연결 방법(라이브바인딩 활용)
손쉬운 데이터 연결 방법(라이브바인딩 활용)손쉬운 데이터 연결 방법(라이브바인딩 활용)
손쉬운 데이터 연결 방법(라이브바인딩 활용)Devgear
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드cranbe95
 

Similaire à DEVIEW 2013 Presentation (20)

Migration to Azure Database for MySQL
Migration to Azure Database for MySQLMigration to Azure Database for MySQL
Migration to Azure Database for MySQL
 
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
 
MariaDB Administrator 교육
MariaDB Administrator 교육 MariaDB Administrator 교육
MariaDB Administrator 교육
 
MySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxMySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docx
 
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 인프라 연동 (CB-Spider)
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 인프라 연동 (CB-Spider)Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 인프라 연동 (CB-Spider)
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 인프라 연동 (CB-Spider)
 
MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQL
 
Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...
Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...
Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...
 
DB Migration to Azure Database for MySQL
DB Migration to Azure Database for MySQLDB Migration to Azure Database for MySQL
DB Migration to Azure Database for MySQL
 
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
 
Azure Database for MySQL
Azure Database for MySQLAzure Database for MySQL
Azure Database for MySQL
 
Azure Databases for PostgreSQL MYSQL and MariaDB
Azure Databases for PostgreSQL MYSQL and MariaDBAzure Databases for PostgreSQL MYSQL and MariaDB
Azure Databases for PostgreSQL MYSQL and MariaDB
 
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
 
Amazon Redshift 아키텍처 및 모범사례::김민성::AWS Summit Seoul 2018
Amazon Redshift 아키텍처 및 모범사례::김민성::AWS Summit Seoul 2018Amazon Redshift 아키텍처 및 모범사례::김민성::AWS Summit Seoul 2018
Amazon Redshift 아키텍처 및 모범사례::김민성::AWS Summit Seoul 2018
 
Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...
Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...
Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...
 
폴라리스오피스 운영시스템
폴라리스오피스 운영시스템폴라리스오피스 운영시스템
폴라리스오피스 운영시스템
 
Amazon Redshift로 데이터웨어하우스(DW) 구축하기
Amazon Redshift로 데이터웨어하우스(DW) 구축하기Amazon Redshift로 데이터웨어하우스(DW) 구축하기
Amazon Redshift로 데이터웨어하우스(DW) 구축하기
 
AWS 6월 웨비나 | AWS에서 MS SQL 서버 운영하기 (김민성 솔루션즈아키텍트)
AWS 6월 웨비나 | AWS에서 MS SQL 서버 운영하기 (김민성 솔루션즈아키텍트)AWS 6월 웨비나 | AWS에서 MS SQL 서버 운영하기 (김민성 솔루션즈아키텍트)
AWS 6월 웨비나 | AWS에서 MS SQL 서버 운영하기 (김민성 솔루션즈아키텍트)
 
손쉬운 데이터 연결 방법(라이브바인딩 활용)
손쉬운 데이터 연결 방법(라이브바인딩 활용)손쉬운 데이터 연결 방법(라이브바인딩 활용)
손쉬운 데이터 연결 방법(라이브바인딩 활용)
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
 

DEVIEW 2013 Presentation

  • 1. MySQL과 MariaDB를 위한 새로운 암호화 방법, Engine Level Encryption 박광근 팀장 / D’Amo 개발 2팀 Penta Security Systems Inc.
  • 2. CONTENTS 1. 개발 배경 2. 개발 방향 & OSS와의 관계 3. Encryption Engine 구조 및 소스 4. What’s Next?
  • 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
  • 18. 2. 개발 방향 & OSS와의 관계
  • 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 의 라이선스 정책 활용 암호화 엔진  오픈 소스 암호화 엔진 + 암호 모듈  프리웨어
  • 21. 3. Encryption Engine 구조 및 소스
  • 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
  • 39. 4. What’s Next? 현재 상황 비상업적 개인을 대상으로 프리웨어로 배포 중
  • 40. 4. What’s Next? 미래 계획 다른 OSS DB에 대한 개발도 검토중
  • 41. Q&A