ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Real MySQL 8.0 7장 - MySQL 암호화
    ✏️ 스터디 모음집/RealMySQL 스터디 2023. 2. 26.

    응용프로그램 단에서 암호화 VS 데이터 베이스 단에서 암호화

    응용프로그램 단에서 암호화

    데이터의 암호화과정을 응용프로그램 단에서 수행하는 경우를 말한다.

    주로 중요한 정보를 가진 컬럼 단위로 암호화를 수행한다.

    응용프로그램 단에서 데이터를 암호화 해 넣을 경우, 암호화된 컬럼은 인덱스를 생성 하더라도 인덱스를 100% 활용하지 못할 수 있다.

    where 절에서 = 검색을 제외 한, BETWEEN … AND 와 같은 범위 기반 검색이나 ORDER BY 후 LIMIT 을 걸어 몇개만 데이터를 가져오는 경우에 암호화 되기 전 값을 기준으로 정렬할 수 없기 때문이다.

     

    데이터베이스 단에서 암호화

    MySQL 자체에서 암호화를 수행하는 경우를 말한다.

    테이블 단위로 암호화를 적용한다.

    보안 감사에서 필수적으로 언급되는 부분이고, 핀테크 서비스처럼 중요한 정보는 응용프로그램에서 암호화 한 데이터를 또 한번 데이터베이스 서버에서 다시 암호화 하는 이중 암호화 방법을 선택하기도 한다.

    TDE(Transparent Data Encryption, Data at Rest Encryption)

    MySQL 에서의 데이터는 메모리나 네트워크 전송단계가 아닌 디스크에 저장 하는 단계에서만 암호화 되는 특성을 말한다.

    MySQL 에서 암호화된 데이터는 MySQL 서버와 디스크 사이에 읽기 쓰기 작업에서 만 일어나기 때문에 MySQL 서버 내에서 사용자의 쿼리를 처리하는 과정에서는 테이블의 데이터가 내부적으로 암호화 처리되어 있는지 여부를 식별하거나 신경쓸 필요가 없는데, 이러한 암호화 방식을 TDE(Transparent Data Encryption)라고 한다.

    MySQL TDE에서의 암호화 키 관리

    MySQL 서버의 TDE에서의 암호화 키는 키링(KeyRing) 플러그인에 의해 관리 된다.

    다양한 플러그인이 제공되지만, MySQL 8.0 버전 커뮤니티 에디션에서는 File-Based 플러그인 인 keyring_file 플러그인만 사용가능하고, 나머지 플러그인은 모든 엔터프라이즈 에디션에서만 사용가능하다.

    2단계(2-Tier) 키 관리

    각 키링 플러그인의 내부적인 동작 방식은 모두 동일 하게 2단계(2-Tier) 키 관리 방식을 사용한다.

    마스터키와 테이블스페이스키

    마스터키(master key)

    테이블스페이스 키를 암호화 하는데 사용되는 키

    KMS나 Vault같은 외부 키 관리 솔루션 또는 디스크에 파일 형태로 저장 된다.

    외부에 노출되는 키, 주기적으로 바꾸어주어야 한다.

     

    테이블 스페이스 키(tablespace key, private key)

    실제로 테이블 데이터를 암호화 하는데 사용하는 키

    마스터키로 암호화되어 디스크의 테이블의 데이터 파일 헤더에 저장된다.

    MySQL 서버 외부로 노출되지 않기 때문에 주기적으로 변경할 필요가 없고, 그리고 만약 변경 한다고 해도, 암호화된 테이블 데이터를 전부 다시 복호화 한 후, 다시 암호화 해야하기 때문에 과도한 시스템 부하가 생길 수 있다.

    AES-256 암호화 알고리즘

    MySQL TDE에서 사용되는 암호화 알고리즘으로 이 알고리즘 이외의 알고리즘은 지원되지 않는다.

    암호화 성능

    MySQL 서버에서의 암호화는 디스크로부터 데이터를 읽고 쓰는 부분에만 적용되기 때문에(TDE) 디스크로 부터 암호화된 데이터 페이지가 복호화 처리를 거친 후 한번 메모리에 적재되면 그 이후로는 암호화되지 않은 테이블과 동일한 성능을 보인다.

    즉, MySQL에서의 암호화 된 데이터는 디스크로부터 데이터를 읽거나 쓸때 암호화와 복호화 처리를 더 해야하므로 이때 추가 시간이 더 걸릴 수 있다.

    읽기 지연

    메모리내 버퍼풀에 읽으려는 데이터가 없다면 디스크로부터 데이터를 꺼내와야 하는데, 이때 데이터를 복호화 하는 과정을 해야하므로 이 복호화 시간 동안 쿼리가 지연될 수 있다.

    쓰기 지연

    암호화된 테이블 내 데이터가 변경되면 다시 디스크로 변경사항을 동기화 시킬때, 암호화 하는 과정을 해야하므로 디스크에 저장 할때도 추가로 시간이 더 걸린다. 하지만, 디스크 쓰기 작업의 경우 백그라운드 쓰레드에서 실행되기 때문에 실제 사용자의 쿼리를 처리하는 시간이 길어지지는 않는다.

    댓글

GitHub: https://github.com/Yesung-Han