바이너리 로그 암호화

공부하는 감자·2024년 4월 22일
0

MySQL

목록 보기
59/74
post-thumbnail

바이너리 로그 암호화

바이너리 로그 암호화의 중요도

  • 바이너리 로그와 릴레이 로그 파일 또한, 테이블 암호화가 적용돼도 평문을 저장한다.
  • 바이너리 로그는 의도적으로 상당히 긴 시간 동안 보관하는 서비스도 있고, 때로는 증분 백업(Incremental Backup)을 위해 바이너리 로그를 보관하기도 한다.
  • 이런 이유로 바이너리 로그의 암호화는 상황에 따라 중요도가 높아질 수 있다.

네트워크 구간에서의 암호화

  • 바이너리 로그와 릴레이 로그 파일 암호화 기능은 디스크에 저장된 로그 파일에 대한 암호화만 담당한다.
    • MySQL 서버의 메모리 내부 또는 소스 서버와 레플리카 서버 간의 네트워크 구간에서 로그 데이터를 암호화하지는 않는다.
  • 복제 멤버 간의 네트워크 구간에서도 바이너리 로그를 암호화하고자 한다면 MySQL 복제를 위한 계정이 SSL을 사용하도록 설정하면 된다.

바이너리 로그 암호화 키 관리

2단계 암호화 키 관리 방식

MySQL 서버는 바이너리 로그와 릴레이 로그 파일 데이터의 암호화를 위해서도 2단계 암호화 키 관리 방식을 사용한다.

  1. 바이너리 로그와 릴레이 로그 파일의 데이터는 파일 키(File Key)로 암호화해서 디스크로 저장한다.
    • 파일 키는 바이너리 로그와 릴레이 로그 파일 단위로 자동 생성되며, 해당 로그 파일의 데이터 암호화에만 사용된다.
  2. 파일 키는 “바이너리 로그 암호화 키”로 암호화해서 각 바이너리 로그와 릴레이 로그 파일의 헤더에 저장된다.
    • “바이너리 로그 암호화 키”는 테이블 암호화의 마스터 키와 동일한 역할을 한다.

바이너리 로그 암호화 키 변경

  • 바이너리 로그 암호화 키는 다음과 같이 변경(로테이션)할 수 있다.
    ALTER INSTANCE ROTATE BINLOG MASTER KEY;
  • 바이너리 로그 암호화 키가 변경되면 다음의 과정을 거친다.
    1. 증가된 시퀀스 번호와 함께 새로운 바이너리 로그 암호화 키 발급 후 키링 파일에 저장
    2. 바이너리 로그 파일과 릴레이 로그 파일 스위치 (새로운 로그 파일로 로테이션)
    3. 새로 생성되는 바이너리 로그와 릴레이 로그 파일의 암호화를 위해 파일 키를 생성하고, 파일 키는 바이너리 로그 파일 키(마스터 키)로 암호화해서 각 로그 파일에 저장
    4. 기존 바이너리 로그와 릴레이 로그 파일 키를 읽어서 새로운 바이너리 로그 파일 키로 암호화해서 다시 저장 (암호화되지 않은 로그 파일은 무시)
    5. 모든 바이너리 로그와 릴레이 로그 파일이 새로운 바이너리 로그 암호화 키로 다시 암호화됐다면 기존 바이너리 로그 암호화 키를 키링 파일에서 제거
  • 4번 과정을 위해 키링 파일에서 “바이너리 로그 암호화 키”는 내부적으로 버전(시퀀스 번호) 관리가 이뤄진다.
    • 바이너리 로그 암호화 키는 순차적인 시퀀스 번호를 가진다.
  • MySQL 서버의 바이너리 로그 파일이 암호화돼 있는지 여부는 다음과 같이 확인할 수 있다.
    SHOW BINARY LOGS;

mysqlbinlog 도구 활용

바이너리 로그 복호화

  • MySQL 서버에서는 트랜잭션의 내용을 추적하거나 백업 복구를 위해 암호화된 바이너리 로그를 평문으로 복호화할 일이 자주 발생한다.
  • 하지만 한 번 바이너리 로그 파일이 암호화되면 다음과 같은 이유로 복호화가 불가능하다.
    • 암호화된 파일은 바이너리 로그 암호화 키가 없으면 복호화할 수 없다.
    • 바이너리 로그 암호화 키는 MySQL 서버만 가지고 있으므로 복호화가 불가능하다.

mysqlbinlog 도구로 복호화

  • mysqlbinlog 도구를 이용해 암호화된 바이너리 로그 파일의 내용을 SQL 문장으로 풀어보면 암호화된 바이너리 로그 파일을 직접 열어 볼 수는 없다는 에러 메시지를 출력한다.
    ## mysqlbinlog로 'mysql-bin.000011' 파일 확인 시도
    mysqlbinlog -vvv mysql-bin.000011
  • 바이너리 로그 암호화 키는 그 바이너리 로그나 릴레이 로그 파일을 생성한 MySQL 서버만 가지고 있기 때문에, MySQL 서버와 관계없이 mysqlbinlog 도구만으로는 복호화할 방법이 없다.

MySQL 서버를 통해 확인

  • 바이너리 로그 파일의 내용을 볼 수 있는 방법은 MySQL 서버를 통해 가져오는 방법이 유일하다.
  • MySQL 서버가 로그 파일을 가지고 있다는 가정하에, 로그 파일의 내용을 확인하고자 한다면 mysqlbinlog 도구가 MySQL 서버에 접속해서 바이너리 로그를 가져오는 방법밖에 없다.
    • 파라미터로 주어진 ‘mysql-bin.000011’은 MySQL 서버에게 요청할 바이너리 로그 파일의 이름일 뿐이다.
    • mysqlbinlog 도구가 직접 ‘mysql-bin.000011’ 파일을 읽는 것이 아니다.
    • mysqlbinlog 명령을 실행 할 때 --read-from-remote-server 파라미터와 함께 MySQL 서버 접속 정보를 입력한다.
## mysqlbinlog로 내용 확인
mysqlbinlog --read-from-remote-server -uroot -p -vvv mysql-bin.000011

Reference

참고 서적

📔 Real MySQL 8.0

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글