데이터 암호화: 테이블 암호화

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

MySQL

목록 보기
57/74
post-thumbnail

테이블 암호화

  • 키링 플러그인은 마스터 키를 생성하고 관리하는 부분까지만 담당한다.
  • 즉, 어떤 키링 플러그인을 사용하든 관계없이 암호화된 테이블을 생성하고 활용하는 방법은 모두 동일하다.

테이블 생성

  • TDE를 이용하는 테이블은 생성 시 마지막에 ENCRYPTION='Y' 옵션만 추가로 넣으면 된다.
    CREATE TABLE tab_encrypted (
    	id INT,
    	data VARCHAR(100),
    	PRIMARY KEY(id)
    ) ENCRYPTION='Y';
  • 테이블의 데이터가 디스크에 기록될 때는 데이터가 자동으로 암호화되어 저장되고, 다시 디스크에서 메모리로 읽어올 때 복호화된다.
  • MySQL 서버에서 암호화된 테이블만 검색할 때는 information_schemaTABLES 뷰를 이용한다.
    -- TDE를 이용하는 테이블인 'tab_encrypted' 검색
    SELECT table_schema, table_name, create_options
    FROM information_schema.tables
    WHERE table_name='tab_encrypted';
  • MySQL 서버의 모든 테이블에 대해 암호화를 적용하려면 default_table_encryption 시스템 변수를 ON으로 설정하면 된다.
    • ON으로 설정하면 ENCRYPTION 옵션을 별도로 설정하지 않아도 암호화된 테이블로 생성된다.

응용 프로그램 암호화의 비교

응용 프로그램 암호화와 MySQL 서버의 암호화 기능 중 선택해야 한다면, MySQL 서버의 암호화 기능을 선택할 것을 권장한다.

인덱스의 제약

  • 응용 프로그램에서 직접 암호화해서 MySQL 서버에 저장하는 경우도 있다.
    • 이 경우 MySQL 서버는 저장되는 칼럼의 값이 이미 암호화된 것인지 여부를 인지하지 못한다.
  • 응용 프로그램에서 암호화된 칼럼은 인덱스를 생성하더라도 인덱스의 기능을 100% 활용할 수 없다.
    • 예를 들어, 암호화된 칼럼은 암호화되기 전의 값을 기준으로 정렬할 수가 없다.
  • MySQL 서버의 암호화 기능(TDE)을 사용한다면 MySQL 서버는 인덱스 관련된 작업을 모두 처리한 후 최종 디스크에 데이터 페이지를 저장할 때만 암호화하기 때문에 이 같은 제약은 없다.

목적과 용도에 따라

  • MySQL 서버의 TDE 기능으로 암호화한다면 실행 중인 MySQL 서버에 로그인만 할 수 있다면 모든 데이터를 평문으로 확인할 수 있다.
  • 응용 프로그램 암호화는 MySQL 서버에 로그인할 수 있다고 하더라도 평문의 내용을 확인할 수 없다.
  • 따라서 응용 프로그램에서의 암호화 기능은 서비스의 요건과 성능을 고려해서 선택해야 하고, MySQL 서버의 암호화 기능과 혼합해서 사용한다면 더 안전한 서비스를 구축할 수 있을 것이다.

테이블스페이스 이동

  • MySQL 서버의 데이터베이스 관리자라면 테이블스페이스만 이동하는 기능을 자주 사용하게 될 것이다.
  • 다음 경우라면 테이블스페이스 이동(Export & Import) 기능이 레코드를 덤프했다가 복구하는 방식보다 훨씬 효율적이고 빠르다.
    • 테이블을 다른 서버로 복사해야 하는 경우
    • 특정 테이블의 데이터 파일만 백업했다가 복구하는 경우

암호화되지 않은 테이블에서

  • MySQL 서버에서 FLUSH TABLES 명령으로 테이블스페이스를 Export할 수 있다.
    -- 테이블스페이스 익스포트(Export)
    FLUSH TABLES source_table FOR EXPORT;
  • 이 명령이 실행되면 MySQL 서버는 다음 작업을 한다.
    1. source_table 의 저장되지 않은 변경 사항을 모두 디스크로 기록하고, 더이상 source_table 에 접근할 수 없게 잠금을 건다.
    2. 그와 동시에 source_table 의 구조를 source_table.cfg 파일로 기록해둔다.
    3. source_table.idb 파일과 source_table.cfg 파일을 목적지 서버로 복사한다.
    4. 복사가 모두 완료되면 UNLOCK TABLES 명령을 실행해 source_table 을 사용할 수 있게 한다.
  • *.cfg 파일은 단순히 테이블의 구조만 가지고 있기 때문에 파일이 없어져도 경고만 발생하고 테이블스페이스를 복구할 수 있다.

암호화된 테이블에서

  • TDE로 암호화된 테이블에 대해 FLUSH TABLES 명령을 실행한다.
    • 이는 암호화되지 않은 테이블과 동일한 명령어를 사용한다.

      -- 테이블스페이스 익스포트(Export)
      FLUSH TABLES source_table FOR EXPORT;
  • 이 명령이 실행되면 MySQL 서버는 다음 작업을 한다.
    1. MySQL 서버는 임시로 사용할 마스터 키를 발급해서 source_table.cfp 라는 파일로 기록한다.
    2. 암호화된 테이블의 테이블스페이스 키를 기존 마스터 키로 복호화한다.
    3. 복호화한 키를 임시로 발급한 마스터 키를 이용해 다시 암호화해서 데이터 파일의 헤더 부분에 저장한다.
  • 암호화된 테이블의 경우 테이블스페이스 이동 기능을 사용할 때는 반드시 데이터 파일과 임시 마스터 키가 저장된 *.cfp 파일을 함께 복사해야 한다.
  • *.cfp 파일이 없어지면 복구가 불가능해진다.

Reference

참고 서적

📔 Real MySQL 8.0

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

0개의 댓글