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.
- MariaDB 소개
- MariaDB 서버 구성 및 아키텍처 이해
- MariaDB 스토리지 엔진
- MariaDB 데이터베이스 관리
- 트랜잭션 / Locking 의 이해
- MariaDB 보안
- 백업과 복구를 통한 데이터베이스 관리
- MariaDB upgrade
- MariaDB 모니터링
- MySQL 에서 MariaDB 로의 전환
MySQL Administrator
Basic course
- MySQL 개요
- MySQL 설치 / 설정
- MySQL 아키텍처 - MySQL 스토리지 엔진
- MySQL 관리
- MySQL 백업 / 복구
- MySQL 모니터링
Advanced course
- MySQL Optimization
- MariaDB / Percona
- MySQL HA (High Availability)
- MySQL troubleshooting
네오클로바
http://neoclova.co.kr/
Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...Amazon Web Services Korea
로그 및 지표 데이터를 쉽게 가져오고, OpenSearch 검색 API를 사용하고, OpenSearch 대시보드를 사용하여 시각화를 구축하는 등 Amazon OpenSearch의 새로운 기능과 기능에 대해 자세히 알아보십시오. 애플리케이션 문제를 디버깅할 수 있는 OpenSearch의 Observability 기능에 대해 알아보세요. Amazon OpenSearch Service를 통해 인프라 관리에 대해 걱정하지 않고 검색 또는 모니터링 문제에 집중할 수 있는 방법을 알아보십시오.
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...Amazon Web Services Korea
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study
이 세션에서는 데브시스터즈의 Case Study를 통하여 Data Lake를 만들고 사용하는데 있어 요구 되는 사항들에 대해 공유합니다. 여러 목적에 맞는 데이터를 전달하기 위해 AWS 를 활용하여 Data Lake 를 구축하게된 계기와 실제 구축 작업을 하면서 경험하게 된 것들에 대해 말씀드리고자 합니다. 기존 인프라 구조 대비 효율성 및 비용적 측면을 소개해드리고, 빅데이터를 이용한 부서별 데이터 세분화를 진행할 때 어떠한 Architecture가 사용되었는지 소개드리고자 합니다.
- MariaDB 소개
- MariaDB 서버 구성 및 아키텍처 이해
- MariaDB 스토리지 엔진
- MariaDB 데이터베이스 관리
- 트랜잭션 / Locking 의 이해
- MariaDB 보안
- 백업과 복구를 통한 데이터베이스 관리
- MariaDB upgrade
- MariaDB 모니터링
- MySQL 에서 MariaDB 로의 전환
MySQL Administrator
Basic course
- MySQL 개요
- MySQL 설치 / 설정
- MySQL 아키텍처 - MySQL 스토리지 엔진
- MySQL 관리
- MySQL 백업 / 복구
- MySQL 모니터링
Advanced course
- MySQL Optimization
- MariaDB / Percona
- MySQL HA (High Availability)
- MySQL troubleshooting
네오클로바
http://neoclova.co.kr/
Amazon OpenSearch - Use Cases, Security/Observability, Serverless and Enhance...Amazon Web Services Korea
로그 및 지표 데이터를 쉽게 가져오고, OpenSearch 검색 API를 사용하고, OpenSearch 대시보드를 사용하여 시각화를 구축하는 등 Amazon OpenSearch의 새로운 기능과 기능에 대해 자세히 알아보십시오. 애플리케이션 문제를 디버깅할 수 있는 OpenSearch의 Observability 기능에 대해 알아보세요. Amazon OpenSearch Service를 통해 인프라 관리에 대해 걱정하지 않고 검색 또는 모니터링 문제에 집중할 수 있는 방법을 알아보십시오.
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...Amazon Web Services Korea
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study
이 세션에서는 데브시스터즈의 Case Study를 통하여 Data Lake를 만들고 사용하는데 있어 요구 되는 사항들에 대해 공유합니다. 여러 목적에 맞는 데이터를 전달하기 위해 AWS 를 활용하여 Data Lake 를 구축하게된 계기와 실제 구축 작업을 하면서 경험하게 된 것들에 대해 말씀드리고자 합니다. 기존 인프라 구조 대비 효율성 및 비용적 측면을 소개해드리고, 빅데이터를 이용한 부서별 데이터 세분화를 진행할 때 어떠한 Architecture가 사용되었는지 소개드리고자 합니다.
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