제11장 데이터 암호화

내용 목차

11.1. 개요
11.2. 환경설정
11.3. 컬럼 암호화
11.3.1. 암호화 컬럼을 갖는 테이블 생성
11.3.2. 테이블에 암호화 컬럼 추가
11.3.3. 일반 컬럼을 암호화 컬럼으로 변경
11.3.4. 암호화 컬럼을 일반 컬럼으로 변경
11.3.5. 모든 암호화 컬럼의 알고리즘 변경
11.4. 테이블 스페이스 암호화
11.4.1. 암호화된 테이블 스페이스 생성
11.4.2. 암호화된 테이블 스페이스 변경
11.4.3. 암호화된 테이블 스페이스 사용
11.4.4. 암호화된 테이블 스페이스 정보 조회

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

11.1. 개요

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

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

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

키워드설명
DESDES 64bits key
3DES1683 key Triple DES 168bits key
AES128AES 128bits key
AES192AES 192bits key
AES256AES 256bits key

11.2. 환경설정

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

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

  1. 보안 지갑의 생성

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

    [예 11.1] 보안 지갑의 생성

    $ tbwallet_gen
    
    [ Tibero Security Wallet Generator ]
    Enter wallet file name: TBWALLET
    Enter wallet password: tibero
    generate wallet success

  2. 보안 지갑의 위치 설정

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

    [예 11.2] 보안 지갑의 위치 설정

    <$TB_SID.tip>

    WALLET_FILE=/path/to/TBWALLET

  3. 보안 지갑의 사용

    생성한 보안 지갑을 열고 데이터 암호화 기능을 사용하려면 DBA 권한을 가진 사용자가 다음의 명령을 수행해야 한다. 단, IDENTIFIED BY 절 뒤에 입력하는 패스워드는 보안 지갑을 생성할 때 입력했던 패스워드를 입력한다.

    [예 11.3] 보안 지갑 열기

    SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "tibero";
    System altered.

    데이터 암호화 기능을 사용하지 못하도록 보안 지갑을 닫으려면 이 역시 DBA 권한을 가진 사용자가 다음의 명령을 수행한다.

    [예 11.4] 보안 지갑 닫기

    SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
    System altered.

    주의

    보안 지갑은 데이터베이스 인스턴스를 종료하면 닫히므로 다시 기동할 때마다 보안 지갑을 열어야 한다. TAC에서 각 노드가 가지고 있는 보안 지갑은 반드시 동일해야 한다.

11.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

11.3.1. 암호화 컬럼을 갖는 테이블 생성

CREATE TABLE 문에서 암호화할 컬럼을 정의할 때 ENCRYPT 절을 지정하여 테이블을 생성한다.

[예 11.5] 암호화 컬럼을 갖는 테이블 생성 - 디폴트 암호화 옵션(AES192 알고리즘, SALT)

SQL> CREATE TABLE customer (
       cust_id       CHAR(4) CONSTRAINT cust_id_pk PRIMARY KEY NOT NULL,
       cust_name     VARCHAR(20) NULL,
       cust_type     VARCHAR(18) NULL,
       cust_addr     VARCHAR(40) NULL,
       cust_tel      VARCHAR(15) ENCRYPT NULL,
       reg_date      DATE NULL
);
Table 'CUSTOMER' created.

암호화 알고리즘은 USING 절을 사용하여 지정할 수 있으며 SALT 옵션의 사용 여부도 지정할 수 있다. 특히 암호화 알고리즘은 한 테이블에 하나만 지정할 수 있기 때문에 다른 컬럼에 또 다른 알고리즘을 지정하면 에러가 발생한다.

[예 11.6] 암호화 컬럼을 갖는 테이블 생성 - AES256 알고리즘, NO SALT 옵션 설정

SQL> CREATE TABLE customer (
       cust_id       CHAR(4) CONSTRAINT cust_id_pk PRIMARY KEY NOT NULL,
       cust_name     VARCHAR(20) NULL,
       cust_type     VARCHAR(18) NULL,
       cust_addr     VARCHAR(40) ENCRYPT USING 'AES256' NULL,
       cust_tel      VARCHAR(15) ENCRYPT NO SALT NULL,
       reg_date      DATE NULL
);
Table 'CUSTOMER' created.

11.3.2. 테이블에 암호화 컬럼 추가

ALTER TABLE 문에서 컬럼을 추가할 때 ENCRYPT 절을 지정하면 암호화 컬럼이 된다. 기존 테이블에 이미 암호화 컬럼이 있으면 기존 컬럼과 동일한 암호화 알고리즘을 사용한다. 반면에 암호화 컬럼이 없으면 새로운 알고리즘을 지정할 수 있다. 또한 SALT 옵션의 사용 여부도 지정할 수 있다.

[예 11.7] 암호화 컬럼 추가

SQL> ALTER TABLE customer ADD (cust_password VARCHAR(12) ENCRYPT NO SALT);
Table 'CUSTOMER' altered.

11.3.3. 일반 컬럼을 암호화 컬럼으로 변경

ALTER TABLE 문에서 컬럼을 변경할 때 ENCRYPT 절을 지정하면 암호화 컬럼이 된다. 테이블에 암호화 컬럼을 추가할 경우와 마찬가지로 기존 테이블에 이미 암호화 컬럼이 있으면 기존 컬럼과 동일한 암호화 알고리즘을 사용한다. 반면에 암호화 컬럼이 없으면 새로운 알고리즘을 지정할 수 있다. 또한 SALT 옵션의 사용 여부도 지정할 수 있다.

[예 11.8] 일반 컬럼을 암호화 컬럼으로 변경

SQL> ALTER TABLE customer MODIFY (reg_date ENCRYPT NO SALT);
Table 'CUSTOMER' altered.

11.3.4. 암호화 컬럼을 일반 컬럼으로 변경

ALTER TABLE 문에서 컬럼을 변경할 때 DECRYPT 절을 지정하면 일반 컬럼이 된다.

[예 11.9] 암호화 컬럼을 일반 컬럼으로 변경

SQL> ALTER TABLE customer MODIFY (reg_date DECRYPT);
Table 'CUSTOMER' altered.

11.3.5. 모든 암호화 컬럼의 알고리즘 변경

ALTER TABLE 문에서 REKEY 명령을 지정하면 해당 테이블의 모든 암호화 컬럼의 암호화 알고리즘이 변경된다.

[예 11.10] 모든 암호화 컬럼의 암호화 알고리즘 변경

SQL> ALTER TABLE customer REKEY USING '3DES168';
Table 'CUSTOMER' altered.

11.4. 테이블 스페이스 암호화

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

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

11.4.1. 암호화된 테이블 스페이스 생성

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

[예 11.11] 암호화된 테이블 스페이스 생성 - 3DES168 알고리즘 지정

SQL> CREATE TABLESPACE encrypted_space
     DATAFILE '/usr/tibero/data/encrypted001.dtf' SIZE 50M
     AUTOEXTEND ON NEXT 1M
     EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K
     ENCRYPTION USING '3DES168'
     DEFAULT STORAGE (ENCRYPT);
Tablespace 'ENCRYPTED_SPACE' created.

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

  • 암호화 알고리즘 지정

    테이블 스페이스 암호화에 사용할 수 있는 암호화 알고리즘의 종류가 컬럼 암호화에 비해 적다. 따라서 3DES168, AES128, AES192, AES256 이외의 암호화 알고리즘을 지정하게 되면 암호화된 테이블 스페이스는 생성할 수 없다.

  • 보안 지갑 열기

    암호화된 테이블 스페이스를 생성하기 전에 반드시 보안 지갑이 열려 있어야 한다. 보안 지갑이 열리지 않은 상태에서 CREATE TABLESPACE 문을 실행하게 되면 다음의 예처럼 에러가 발생하게 되고 테이블 스페이스와 데이터 파일이 생성되지 않게 된다. 따라서 이를 해결하기 위해서는 보안 지갑을 열고 다시 시도하면 된다.

    [예 11.12] 암호화된 테이블 스페이스 - 생성 실패

    SQL> CREATE TABLESPACE encrypted_space
         DATAFILE '/usr/tibero/data/encrypted001.dtf' SIZE 50M
         AUTOEXTEND ON NEXT 1M
         EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K
         ENCRYPTION USING '3DES168'
         DEFAULT STORAGE (ENCRYPT);
    TBR-12073: wallet not opened.

11.4.2. 암호화된 테이블 스페이스 변경

암호화된 테이블 스페이스의 저장 공간이 더 필요한 경우 ALTER TABLESPACE 문ADD DATAFILE 절을 이용하여 새로운 데이터 파일을 테이블 스페이스에 추가할 수 있다. 새로 추가된 데이터 파일은 처음 테이블 스페이스를 생성했을 때 지정한 암호화 여부와 암호화 알고리즘의 속성을 그대로 가지게 된다.

[예 11.13] 암호화된 테이블 스페이스 - 데이터 파일 추가

SQL> ALTER TABLESPACE encrypted_space
     ADD DATAFILE '/usr/tibero/data/encrypted002.dtf' SIZE 50M;
Tablespace 'ENCRYPTED_SPACE' altered.

일반 테이블 스페이스를 암호화된 테이블 스페이스로 바꾸거나 암호화된 테이블 스페이스를 일반 테이블 스페이스로 바꾸는 것은 불가능하다. 또한 한 테이블 스페이스에 포함된 데이터 파일에 대해서도 암호화 여부와 암호와 알고리즘을 다르게 지정하는 것도 불가능하다. 따라서 테이블 스페이스를 생성할 때에는 이러한 사항을 고려하고 신중히 결정해야 한다.

이러한 사항에도 일반 테이블 스페이스를 암호화된 테이블 스페이스로 바꾸기 위해서는 새로 암호화된 테이블 스페이스를 만든 다음 일반 테이블 스페이스에 포함된 데이터를 모두 암호화된 테이블 스페이스로 옮겨야 한다.

11.4.3. 암호화된 테이블 스페이스 사용

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

[예 11.14] 암호화된 테이블 스페이스 - 테이블 생성

SQL> CREATE TABLE customer (
       cust_id       CHAR(4) NOT NULL CONSTRAINT cust_id_pk PRIMARY KEY,
       cust_name     VARCHAR(20) NULL,
       cust_type     VARCHAR(18) NULL,
       cust_addr     VARCHAR(40) NULL,
       cust_tel      VARCHAR(15) NULL,
       reg_date      DATE NULL
     ) TABLESPACE secure_space;
Table 'CUSTOMER' created.

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

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

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

11.4.4. 암호화된 테이블 스페이스 정보 조회

Tibero에서는 암호화된 테이블 스페이스의 정보를 관리하기 위해 다음 표에 나열된 뷰를 제공하고 있다.

설명
DBA_TABLESPACES

테이블 스페이스의 전체 정보를 조회하는 뷰이다.

ENCRYPTED 컬럼을 통해 암호화 여부를 조회할 수 있다.

V$ENCRYPTED_TABLESPACES

암호화된 테이블 스페이스의 정보만을 조회하는 뷰이다.

테이블 스페이스 ID와 암호화 알고리즘을 조회할 수 있다.

참고

정적 뷰와 동적 뷰에 대한 자세한 내용은 "Tibero 참조 안내서"를 참고한다.