반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

가끔 보자, 하늘.

MariaDB TDE 적용 본문

개발 이야기/DB, 데이터분석, AI

MariaDB TDE 적용

가온아 2023. 11. 30. 12:15

Transparent Data Encryption - 데이터 저장 시 암호화해서 저장합니다. (공식문서 링크)

원하는 Table만 암호화 할 수도 있고 테이블 마다 다른 암호화 키를 사용할 수 있으며 DB 전체, 그리고 로그도 선택적으로 암호화 할 수 있습니다.

MariaDB에서는 암호화 키를 지원하는 세 가지의 plugin이 있습니다.

  • File Key Management Encryption Plugin(파일 키 관리 암호화 플러그인)
    키 파일은 MariaDB 서버 자체 내에 저장됩니다. 가장 좋은 방법은 키 파일을 서버의 일부가 아닌 별도의 마운트에 보관하는 것입니다.
  • AWS Key Management Encryption Plugin(AWS 키 관리 암호화 플러그인)
    키 파일은 AWS에 저장되고 AWS에서 관리합니다. 이 방법은 매우 안전하지만 일부 클라이언트는 프로덕션 서버에서 인터넷에 액세스하지 못할 수 있습니다. 데이터베이스가 AWS에서 실행되는 경우 이 옵션을 선택하는 것이 좋습니다.
  • HashiCorp Vault Encryption Plugin(해시코프 볼트 암호화 플러그인)
    해시코프 볼트 및 MariaDB
    고객 환경 내에서 해시코프(오픈소스) 볼트를 설정할 수 있으며, MariaDB 해시코프 볼트 암호화 플러그인이 이 볼트에 액세스하여 보안 키를 가져올 수 있습니다. 이는 인터넷에 액세스할 수 없는 경우 암호화 키를 설정하는 가장 안전한 방법입니다.

만약 여러분의 DB가 AWS에 있다면  AWS의 Key Managment Service를 사용하는게 가장 안전한 방법입니다. On Promise로 운영 중이시라면 해시코프 볼트 암호화 플러그인을  사용하는게 안전하겠죠. 유료 서비스도 있고 직접 Vault를 설치해서 운영하는 방법도 있습니다. (참고링크

여기서는 파일 키 관리 방식을 살펴보겠습니다. 사실 암호화 키 파일을 별도 마운트에 관리 한다고 해도 그리 안전한 방법은 아닙니다. 한국인터넷진흥원(KISA)에서 공개한 <암호기술 구현 안내서>를 봐도 암호화 키는 별도의 분리된 장소에 보관을 권고하고 있어 개인정보를 취급하는 DB라면 파일 키 관리 방식은 적절하지 않습니다. 뽀너스로 io가 발생하는 순간 리소스를 추가적으로 사용하니 꼭 필요한 테이블만 사용할 것을 추천드립니다.

서론이 너무 길어졌네요. 각설하고 작업 순서를 정리해 보겠습니다. 

시작에 앞서 /db에 mariadb의 실제 데이터가 저장된다고 가정하고, /etc/mysql에 my.cnf 파일이 있다고 가정합니다. 그리고 암호화에 사용할 키 파일은 /etc/mysql/key.enc에 저장하고, 이 파일을 암호화하는 키는 /kms에 저장한다고 가정해 보겠습니다. 이 과정은 Ubuntu/MariaDB 11.0.4 버전을 기준으로 진행하였습니다.

우선 암호화에 사용할 키를 먼저 생성해 보겠습니다. 

$ (echo -n "1;" ; openssl rand -hex 32 ) | sudo tee -a key.src
$ (echo -n "2;" ; openssl rand -hex 32 ) | sudo tee -a key.src

암호화에 사용할 키값은 1;xxxx 형태로 앞에 인덱스 값을 붙이고 ;으로 구분하여 저장합니다. 여기서는 두 개의 키 값을 사용한다고 가정해 보겠습니다. AES(Advanced Encryption Standard) 키는 세 가지 길이(128, 192 또는 256비트)의 대칭 키인데 여기서는 256bit(32byte)로 생성하겠습니다.

그리고 이 파일을 암호하하는 키 값을 가진 파일을 하나 더 만들겠습니다. 

$ openssl rand -hex 32 | sudo tee -a /kms/key.dec

key.dec 파일을 이용해 key.src 파일을 암호화 하여 key.enc 파일을 생성한 후 key.src 파일은 삭제합니다. 

$ opensssl enc -aes-256-cbc -md sha1 -pass file:/kms/key.dec -in key.src -out /db/key.enc
$ rm key.src

암호화에 필요한 파일은 만들었으니 이제 mariadb에 적용해 봅니다. my.cnf 혹은 사용하시는 config 파일을 열어 아래 항목을 추가하세요.

[mariadb]
plugin_dir = /usr/lib/mysql/plugin
plugin_load_add = file_key_management
file_key_management_filename = /db/key.enc
file_key_management_filekey = FILE:/kms/key.dec

그리고 MariaDB를 재시작해 줍니다. 잘 실행되었다면 DB에서 플러그인이 잘 설치되었는지 확인해 봅니다.

 # plugin list에 file_key_management가 잘 로드되어 있는지 확인합니다.
 SELECT * FROM information_schema.PLUGINS WHERE PLUGIN_NAME like 'file_key%';
 
# file_key_management 관련 설정값을 확인합니다.
SHOW GLOBAL VARIABLES LIKE 'file_key%';

이제 아래와 같이 암호화 설정이 가능합니다.

# 암호화된 test라는 이름의 table 생성
CREATE TABLE test (i int) ENGINE=InnoDB ENCRYPTED=YES
# 암호화 키 인덱스를 임의로 지정할 수 있습니다.
CREATE TABLE test2 (i int) ENGINE=InnoDB ENCRYPTED=YES  ENCRYPTION_KEY_ID=2

# 현재 암호화된 테이블 리스트 확인
SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM information_schema.TABLES
	WHERE TABLE_SCHEMA NOT IN ('information_schema', 'mysql')
	AND CREATE_OPTIONS LIKE '`ENCRYPTED`=YES%';

# 암호화된 테이블 정보를 이렇게 확인할 수도 있습니다.
SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID
FROM information_schema.INNODB_TABLESPACES_ENCRYPTION
    
# 암호화 키 인덱스를 변경할 수 있습니다.
ALTER TABLE test ENCRYPTED=YES  ENCRYPTION_KEY_ID=2

# 암호화 설정을 해제 할 수 있습니다.
ALTER TABLE test ENCRYPTED=NO ENCRYPTION_KEY_ID=0

정리하고 보면 별고 없는데 중간 중간 이슈들이 좀 생기긴 하네요. 다들 무탈히 적용되셨기를 빕니다. 

끝!!

반응형