암호화에 대해서 알아보자
들어가며
데이터를 저장할 때 암호화를 하지 않으면 악의적인 공격자가 데이터를 빼내어 사용할 수 있는 위험이 있습니다. 이러한 상황에서 데이터를 안전하게 보호하기 위해서는 저장할 때 암호화를 통해 데이터를 안전하게 보호해야 합니다.
데이터를 암호화 함으로써 데이터가 유출되더라도 암호화된 상태로 노출되기 때문에 해독하는데 어려움이 생겨 안전하게 보호할 수 있습니다.
MySQL 서버의 데이터 암호화
데이터 암호화는 데이터 파일을 읽고쓰는 InnoDb I/O 레이어에서 암호화 및 복호화 과정이 실행된다.
사용자는 암호화가 되어있는지 없는지 확일할 필요가없다. 암호화가 실행되어 있더라고 MySQL 내부와 사용자 입장에서는 아무런 차이가 없다. 이런 방식의 암호화를 TDE(Transparent Data Encryption)이라고한다.
2단계 키관리
MySQL은 마스터키와 더블스페이스 키(프라이빗 키)라는 두 가지의 키를 가지고 있다.
해시코프사의 볼트의 플러그인을 사용하는 MySQL에서는 마스터키를 가져오고 암호화된 테이블을 생성할 때마다 해당 테이블을 위한 임의의 테이블 스페이스 키를 발급한다. 발급한 키를 가지고 데이터를 저장할 때 사용해 각테이블의 테이터 파일 헤더를 저장한다. 이렇게 생성한 데이터 파일은 테이블 스페이스키가 삭제되지 않는 이상 삭제되지 않는다. 하지만 마스터키는 외부에 노출될 가능성이 있어서 주기적으로 변경해야 한다.
ALTER INSTANCE PROTATE INNODB MASTER KEY;
이 명령어를 통해서 변경할 수 있다.
마스터키를 변경한다고 해서 데이터 파일은 전혀 변경되지 않는다. 이러한 이유는 마스터키를 자주 변경하면 시스템에 무리를 줄 수 있어서 과도한 부하를 줄이기 위해서 이다.
암호화의 성능
암호화는 TED 방식을 사용하기 때문에 한번 복호화된 데이터 페이지는 InnoDB 버퍼풀에 적재된다. 그래서 I/O 과정에서 성능에 차이는 없다. 하지만 버버풀에 데이터가 없다면, 복호화하고 버퍼풀에 적재되는 기능이 실행하면서 느려지는 결과가 발생한다. 하지만 이런 기능은 백그라운드에서 실행되어서 사용자가 작성한 쿼리문 성능에는 지연되는 것이 아니다.
압축과 암호화를 동시에 적용하면 압축을 먼저 한 후에 암호화가 실행된다.
-> 암호화를 하면 랜덤 한 배열의 바이트를 가지게 되는데 이렇게 하면 압축률의 상당히 떨어트리기 때문이다.
암호화의 복제
만약 암호화 방식을 복제한 서버가 있을 때 마스터키는 동일한 키가 아닌 다른 키로 발급된다. 그래서 암호화된 데이터파일도 원래서버와 복제한 서버의 값이 아예달리지게된다.
언두 로그 및 리두 로그 암호화
암호화를 적용하더라도 언두로그, 리두 로그, 바이너리 로그에는 평문으로 저장된다. 그래서 8.0.16 버전부터는 innodb_redo_log_encrypt 시스템변수와 innodb_undo_log_encrypt 시스템변수를 이용해 엔진의 리두 로그와 언두로그를 암호화된 상태로 저장할 수 있어졌다.
테이블 암호화는 테이발 하나가 암호화가 적용되면 해당 테이블의 데이터는 암호화가 된다. 하지만 리두와 언두 로그는 이런 방식으로 적용할 수 없다.
리두로그와 언두로그는 암호화가 적용되기 전에는 평문으로 저장하다가 암호화하는 시점에 리두 로그와 언두 로그를 암호화해서 저 정하고 암호화를 비활성화를 하면 이때부터 다시 평문을 저장한다.
프라이빗 키와 테이블 스페이스키는 기존에 사용하던 값을 사용하는 것이 아니고 새로운 키를 발급받아 리두, 언두 로그의 키로 사용된다.
#언두로그 암호화 활성화
SET GLOBAL innodb_undo_log_encrypt = ON;
#언두로그 암호화 비활성화
SET GLOBAL innodb_undo_log_encrypt = OFF;
바이너리 로그 암호화
바이너리 로그도 언두나 리두 로그처럼 평문으로 저장됩니다.
바이너리 로그(Binary Log) 암호화는 MySQL에서 발생하는 데이터 변경 작업을 기록하는 바이너리 로그를 암호화하는 프로세스를 의미합니다. 이러한 암호화는 데이터베이스 보안을 강화하고 데이터 변경 내역이 노출되는 것을 방지합니다.
바이너리 로그는 데이터베이스에서 수행되는 모든 쓰기 작업을 기록하는 중요한 로그입니다. 이는 데이터 변경 내역을 추적하고 데이터베이스를 복구하는 데 사용됩니다. 그러나 바이너리 로그는 평문으로 저장되기 때문에 보안 상의 위험성이 있습니다. 따라서 암호화를 통해 바이너리 로그를 보호하는 것이 중요합니다.
참고
'MySQL' 카테고리의 다른 글
[MySQL] [2]인덱스(Index)란-"R-Tree, 전문검색(n-gram),함수 기반,멀티 밸류, 클러스터링,유니크"인덱스란? (0) | 2024.02.08 |
---|---|
[MySQL] [1]인덱스(Index)란-B-Tree? (0) | 2024.02.08 |
[MySQL] 데이터 압축이란? (1) | 2024.01.27 |
[MySQL] MySQL의 트랜잭션과 잠금 (1) | 2024.01.26 |
[MySQL] 사용자 및 권한 (1) | 2024.01.05 |