제6장 데이터 암호화

내용 목차

6.1. 개요
6.2. 환경설정
6.3. 컬럼 암호화
6.3.1. 암호화 컬럼을 갖는 테이블 생성
6.3.2. 테이블에 암호화 컬럼 추가
6.3.3. 일반 컬럼을 암호화 컬럼으로 변경
6.3.4. 암호화 컬럼을 일반 컬럼으로 변경
6.3.5. 모든 암호화 컬럼의 알고리즘 변경
6.3.6. 암호화 컬럼에 대한 인덱스
6.4. 테이블 스페이스 암호화
6.4.1. 암호화된 테이블 스페이스 생성
6.4.2. 암호화된 테이블 스페이스 변경
6.4.3. 암호화된 테이블 스페이스 사용
6.4.4. 암호화된 테이블 스페이스 정보 조회
6.4.5. 암호화된 테이블 스페이스의 암호화 컬럼에 대한 인덱스
6.5. HSM 연동을 통한 키 분리
6.5.1. 환경설정
6.5.2. 사용 방법

본 장에서는 Tibero에서 데이터 암호화(Data Encryption) 기능을 사용하고 관리하기 위한 방법을 설명한다.

Tibero에서는 데이터 보안을 위해 “제5장 사용자 관리와 데이터베이스 보안”에서 설명한 것처럼 사용자 계정 및 특권, 역할 기능을 제공하고 있다. 하지만 데이터베이스 내에서 데이터에 접근하는 경우가 아니라 운영체제에서 데이터 파일에 직접 접근하는 경우라면 위의 기능만으로는 데이터를 안전하게 보호할 수가 없다. 따라서 이러한 경우에도 데이터를 보호하기 위해서 Tibero는 데이터를 암호화하여 디스크에 저장하는 기능을 제공하고 있다.

DBA가 암호화할 데이터(테이블의 컬럼 또는 테이블 스페이스)를 지정하면 Tibero는 데이터를 저장할 때 내부적으로 암호화하여 저장하고 검색할 때 복호화해서 보여준다. 이때 사용자나 애플리케이션 프로그램은 데이터의 암호화 여부를 고려할 필요가 없다.

Tibero는 다음과 같은 암호화 알고리즘을 제공한다.

데이터 암호화 기능을 사용하기 위해서는 우선 먼저 보안 지갑을 생성해야 한다. 보안 지갑은 암호화에 사용할 마스터 키를 보관하고 있다. Tibero는 마스터 키를 이용하여 각 데이터를 암호화할 암호화 키를 생성하고 이 암호화 키를 이용하여 데이터를 암호화한다.

데이터 암호화를 사용하기 위해서는 다음의 절차를 수행해야 한다.

  1. 보안 지갑의 생성

    $TB_HOME/bin/tbwallet_gen 프로그램을 실행하고 보안 지갑의 파일 이름과 패스워드를 입력하여 보안 지갑을 생성한다.


  2. 보안 지갑의 위치 설정

    $TB_SID.tip 파일에 WALLET_FILE 초기화 파라미터를 추가하여 보안 지갑의 위치를 설정한다.


  3. 보안 지갑의 사용

컬럼 암호화(Column Encryption)는 테이블의 특정 컬럼의 데이터를 암호화하여 저장하는 기능이다. 컬럼 암호화는 테이블을 생성 또는 변경하는 DDL 문장을 수행할 때 설정한다.

컬럼 암호화를 설정할 때는 암호화 알고리즘과 SALT 옵션을 사용할 것인지의 여부를 명시할 수 있다. 암호화 알고리즘은 Tibero에서 지원하는 범위에서만 설정할 수 있으며, 설정하지 않으면 AES192 알고리즘을 디폴트로 사용한다. 암호화된 컬럼은 한 테이블에 여러 개가 있을 수 있지만 한 테이블에는 하나의 암호화 알고리즘만 사용할 수 있다.

SALT 옵션은 같은 값의 데이터를 암호화할 때 항상 같은 암호로 암호화되지 않도록 하는 기능이다. 이 옵션을 사용할 경우 보안의 수준을 높일 수 있다. 하지만 SALT 옵션을 사용하여 암호화한 컬럼에는 인덱스를 생성할 수 없다. 컬럼 암호화를 설정할 때 이 옵션을 별도로 설정하지 않아도 디폴트는 SALT 옵션을 사용한다.

컬럼을 암호화하면 보안의 수준이 높아지는 장점이 있지만 SALT 옵션을 사용하지 않는 컬럼에 한해서만 인덱스를 생성할 수 있고, 인덱스 영역도 스캔할 수 없다는 단점이 있다. 또한 해당 컬럼에 DML 및 SELECT 명령을 실행하면 내부에서 암호화와 복호화를 수행하기 때문에 성능 저하가 발생한다.

암호화할 수 있는 컬럼의 데이터 타입은 다음과 같다.

  • CHAR

  • VARCHAR2

  • NUMBER

  • DATE

  • TIMESTAMP

  • INTERVAL DAY TO SECOND

  • INTERVAL YEAR TO MONTH

  • RAW

  • NCHAR

  • NVARCHAR2

일반 인덱스처럼 생성이 가능하지만 다음과 같은 제약사항이 있다. SALT 옵션이 지정안된 암호화 컬럼에 대해서만 인덱스를 생성할 수 있고 해당 인덱스에 대해서는 EQUAL('=') 조건만 사용하여 INDEX RANGE SCAN이 가능하다.


테이블 스페이스 암호화(Tablespace Encryption)는 컬럼 암호화와 마찬가지로 데이터베이스의 데이터를 보호하는 또 다른 방법이다. 컬럼 암호화와 다른 점은 테이블 또는 테이블의 컬럼 단위가 아닌 테이블 스페이스 전체에 대해 암호화 여부와 암호화 알고리즘을 지정한다는 것이다.

테이블 스페이스 암호화와 복호화 과정은 디스크에서 읽기와 쓰기를 한 후에 바로 수행되며 데이터베이스 내부의 SQL 처리 또한 기존과 동일하게 진행된다. 이 과정 때문에 컬럼 암호화에 존재했던 제약 즉, 일부 타입의 컬럼에 대해서만 컬럼 암호화를 할 수 있다거나 인덱스 영역을 스캔할 수 없다는 문제는 없어진다. 반면에 테이블 스페이스의 모든 데이터 블록에 암호화와 복호화가 발생하기 때문에 테이블 스페이스의 크기가 크거나 수정과 접근이 잦을수록 성능 저하가 높아질 수 있다. 또한 컬럼 암호화처럼 데이터 암호화 여부를 바꿀 수 없다는 문제도 있으므로 보호할 데이터의 성격에 따라 적절한 방법을 선택해야 한다.

테이블 스페이스를 생성하는 CREATE TABLESPACE 문에서 암호화 여부를 지정하는 ENCRYPT 절을 추가하면 그 테이블 스페이스는 암호화된 테이블 스페이스가 된다. 또한 USING를 사용하여 암호화 알고리즘도 지정할 수 있다. 여기서 암호화 알고리즘은 3DES168, AES128, AES192, AES256 중에서 하나만 지정할 수 있다. USING에서 '암호화 알고리즘'을 생략하면 AES128을 기본으로 사용한다.


암호화된 테이블 스페이스를 생성할 때에는 다음과 같은 사항을 주의한다.

테이블 또는 인덱스를 생성할 때 암호화된 테이블 스페이스를 지정하면 해당 세그먼트는 물리적으로 그 테이블 스페이스에 저장되고 데이터 블록을 읽고 쓰는 과정에서 자동으로 데이터 암호화와 복호화가 발생한다.


암호화된 테이블 스페이스에 테이블을 생성하고 SQL 문장을 통해 데이터를 조회하고 갱신하는 과정 동안에는 보안 지갑은 항상 열려 있어야 한다. 보안 지갑이 열리지 않은 상태에서 암호화된 테이블 스페이스가 포함된 동작을 수행하게 되면 [예 6.14]와 같은 에러가 발생한다.

테이블 스페이스 중에서 SYSTEM, UNDO, TEMP 테이블 스페이스는 암호화 여부를 지정할 수 없다. 즉, 모든 테이블 스페이스를 암호화할 수 있는 것은 아니다. 또한 Redo 로그 파일에 대해서도 암호화 여부를 지정할 수 없다. 하지만 암호화된 테이블 스페이스에 포함된 데이터를 수정하는 과정에서 생성된 Undo, Redo 로그는 자동으로 암호화되어 디스크에 저장되고 이 두 로그가 필요한 순간에는 자동으로 복호화되어 데이터베이스 내부적으로 사용된다.

그리고 정렬을 수행하는 과정에서 TEMP 테이블 스페이스에 임시로 저장되는 데이터가 암호화된 테이블 스페이스에 속한 것이라면 TEMP 영역도 자동으로 암호화하고 복호화된다. 따라서 데이터베이스의 다른 파일(Undo, Redo, TEMP 등)을 통해 암호화된 테이블 스페이스의 데이터가 일부라도 노출되지 않도록 보호할 수 있다.

암호화된 테이블 스페이스를 이용한 암호화 컬럼에 대하여 일반 인덱스 생성은 NO_SALT 암호화 컬럼에만 가능하고 범위 조건에 대한 INDEX RANGE SCAN이 안되는 제약사항이 있다. 이런 제약사항이 없으면서 데이타 보안은 제공하기 위해 암호화된 테이블 스페이스를 이용한 암호화된 컬럼에 대한 인덱스를 제공한다.


HSM(Hardware Security Module)은 데이터 암호화 및 복호화에 사용되는 키를 안전하게 저장/관리할 수 있도록 제작된 전용 하드웨어 장비이다. HSM 장비와의 연동을 통하여 Tibero에서 테이블 및 테이블 스페이스 암호화를 위해 사용되는 마스터키를 외부 장비로 분리할 수 있다. 해당 기능을 사용 시 데이터 암호화 키가 DB와는 독립적으로 보관되어 관리되기 때문에 더 높은 수준의 보안을 기대할 수 있다.

현재는 Linux와 AIX만 지원하며, HSM 장비 지원 목록은 다음과 같다.

  • D'Amo KMS (펜타시큐리티)

  • Vormetric Data Security Manager (탈레스)

데이터 암호화 기능을 사용하기 위해서는 우선 먼저 보안 지갑을 생성해야 한다. 보안 지갑의 생성 및 사용 방법에 대해서는 “6.2. 환경설정”에 서술되어 있다.

HSM 장비와의 연동을 위해서 필요한 설정은 다음과 같다.

  1. 라이브러리 세팅

    연동하고자 하는 HSM 장비에 따라서 필요한 라이브러리 파일이 다를 수 있다. 해당 파일들은 HSM 장비를 관리하는 각 업체를 통해서 제공받아야하며 제공 받은 파일을 $TB_HOME/lib에 배치하면 된다. 각각의 장비에 따라 필요한 라이브러리 파일은 다음과 같다.

    주의

    현 문서는 HSM 장비를 이미 정상적으로 설치 및 구축해두었다는 가정 하에 서술 되어있다. 따라서 각 HSM 장비의 설치 및 라이브러리에 대한 추가적인 문의 사항이 있다면 이는 해당 HSM 장비의 담당 업체에 따로 문의하여야 한다.

  2. 파라미터 설정

    $TB_SID.tip 파일에 HSM 연동 관련 초기화 파라미터들을 추가 작성하여 보안 지갑의 위치를 설정한다.



HSM 장비를 통해 데이터 암호화 키를 분리한 뒤, 이를 이용한 데이터 암호화 기능을 활성화하고자 하면 DBA 권한을 가진 사용자가 다음의 명령을 수행해야 한다. 이 때, HSM 장비에 따라 IDENTIFIED 절 뒤에 입력하는 아이디와 USING 절 뒤에 입력하는 패스워드로 입력해야 하는 값이 다르기 때문에 이 점 유의해야한다. 각 장비에 따른 명령은 다음과 같다.



데이터 암호화 기능을 사용하지 못하도록 비활성화하려면, DBA 권한을 가진 사용자가 다음의 명령을 수행해야 한다.


주의

보안 지갑과 마찬가지로 데이터베이스 인스턴스를 종료하면 데이터 암호화 기능이 비활성화되므로 다시 기동할 때마다 활성화 해줘야한다.

주의

마스터키가 변경되는 경우 미디어 복구는 지원하지 않는다.