본문 바로가기
서버구축 (WEB,DB)

데이터베이스 암호화 TDE (Transparent Data Encryption) 방법

by 날으는물고기 2023. 10. 27.

데이터베이스 암호화 TDE (Transparent Data Encryption) 방법

데이터베이스 자체 암호화를 구현하려면 MySQL 또는 PostgreSQL과 같은 관계형 데이터베이스 시스템에서 제공하는 내장 암호화 기능을 사용해야 합니다.

Transparent Data Encryption (TDE) - PERCONA

다음은 각 데이터베이스 시스템에서 데이터베이스와 테이블 수준에서 암호화를 구현하는 방법에 대한 간단한 코드 예제입니다.

 

MySQL에서 데이터베이스 및 테이블 암호화

  1. MySQL에서 InnoDB 스토리지 엔진을 사용하는 경우, 테이블 수준에서 암호화를 구현할 수 있습니다.
    a. 먼저, 마스터 키를 생성합니다.
    CREATE MASTER KEY ENCRYPTION BY PASSWORD 'YourMasterPassword';
    b. 다음으로, 암호화할 테이블을 생성하고 암호화 옵션을 설정합니다.
    CREATE TABLE encrypted_table (
        id INT AUTO_INCREMENT PRIMARY KEY,
        sensitive_data VARBINARY(256)
    ) ENGINE = InnoDB
    ENCRYPTION = 'Y'
    KEYS_BLOCK_SIZE = 8;
    c. 마스터 키를 사용하여 데이터를 암호화하거나 복호화합니다.
    -- 데이터 암호화
    INSERT INTO encrypted_table (sensitive_data)
    VALUES (AES_ENCRYPT('SensitiveInfo', 'YourMasterPassword'));
    
    -- 데이터 복호화
    SELECT AES_DECRYPT(sensitive_data, 'YourMasterPassword') FROM encrypted_table;

PostgreSQL에서 데이터베이스 및 테이블 암호화

  1. PostgreSQL에서 데이터베이스와 테이블 수준의 암호화를 구현하려면, pgcrypto 확장을 사용해야 합니다.
    a. 먼저, pgcrypto 확장을 활성화합니다.
    CREATE EXTENSION IF NOT EXISTS pgcrypto;
    b. 암호화할 테이블을 생성하고 암호화 옵션을 설정합니다.
    CREATE TABLE encrypted_table (
        id SERIAL PRIMARY KEY,
        sensitive_data BYTEA
    );
    
    ALTER TABLE encrypted_table
    ADD COLUMN encrypted_sensitive_data BYTEA;
    c. 데이터를 암호화하고 저장합니다.
    -- 데이터 암호화 및 저장
    UPDATE encrypted_table
    SET encrypted_sensitive_data = pgp_sym_encrypt('SensitiveInfo', 'YourEncryptionKey')
    WHERE id = 1;
    d. 데이터를 복호화하여 검색합니다.
    -- 데이터 복호화
    SELECT pgp_sym_decrypt(encrypted_sensitive_data, 'YourEncryptionKey')
    FROM encrypted_table
    WHERE id = 1;

위의 예제 코드는 MySQL 및 PostgreSQL에서 데이터베이스와 테이블 수준의 암호화를 구현하는 단계입니다. 중요한 점은 데이터 암호화와 복호화에 사용되는 키를 안전하게 보호해야 하며, 데이터베이스 관리 및 보안 규칙을 준수해야 합니다. 또한 데이터베이스 버전 및 설정에 따라 구현 방법이 다를 수 있으므로 해당 데이터베이스 시스템의 공식 문서를 참조하는 것이 중요합니다.

 

데이터베이스 전체를 암호화하는 방법은 데이터베이스 시스템 및 데이터베이스 관리 시스템에 따라 다를 수 있지만, 일반적으로 디스크 암호화(Disk Encryption) 또는 데이터베이스 암호화 솔루션을 사용하여 구현할 수 있습니다.

 

다음은 MySQL 및 PostgreSQL 데이터베이스 시스템에서 데이터베이스 전체를 암호화하는 방법에 대한 개요입니다.

 

MySQL에서 데이터베이스 전체 암호화 (디스크 암호화)

MySQL 데이터베이스를 전체적으로 암호화하는 가장 일반적인 방법은 디스크 암호화를 사용하는 것입니다. 이것은 데이터베이스 파일 자체를 암호화하는 것을 의미하며, 데이터베이스 관리 시스템에 대한 추가 설정이 필요하지 않습니다.

  1. 디스크 암호화 솔루션을 사용하여 데이터베이스 서버의 디스크를 암호화합니다. 대부분의 운영체제는 디스크 암호화를 지원하며, 이를 활성화하려면 운영체제 레벨에서 설정을 변경해야 할 수 있습니다.
  2. MySQL 데이터베이스를 정상적으로 설치하고 설정합니다. MySQL 서버 자체에 대한 특별한 설정은 필요하지 않습니다.
  3. 암호화된 디스크에 데이터베이스를 생성하거나 마이그레이션합니다. MySQL은 암호화된 디스크에서 데이터를 읽고 쓸 수 있으므로 추가 설정은 필요하지 않습니다.

PostgreSQL에서 데이터베이스 전체 암호화 (디스크 암호화)

PostgreSQL 데이터베이스를 전체적으로 암호화하는 방법은 MySQL과 유사합니다. 디스크 암호화를 사용하여 데이터베이스 파일을 암호화하면 됩니다.

  1. 디스크 암호화 솔루션을 사용하여 데이터베이스 서버의 디스크를 암호화합니다. 이 단계는 운영체제 수준에서 수행됩니다.
  2. PostgreSQL 데이터베이스를 설치하고 설정합니다. PostgreSQL 서버 자체에 대한 특별한 설정은 필요하지 않습니다.
  3. 암호화된 디스크에 PostgreSQL 데이터베이스를 생성하거나 마이그레이션합니다. PostgreSQL은 암호화된 디스크에서 데이터를 읽고 쓸 수 있으므로 추가 설정은 필요하지 않습니다.

디스크 암호화를 사용하면 데이터베이스 전체가 암호화되므로 데이터베이스 시스템 자체를 암호화할 필요가 없습니다. 그러나 이러한 방법은 주로 데이터베이스 파일을 보호하는 데 사용되며, 데이터베이스에 액세스하는 사용자의 권한 및 데이터베이스 내부의 암호화는 고려해야 할 다른 보안 측면입니다.

 

데이터베이스 암호화를 위해 TDE (Transparent Data Encryption) 방법을 사용하면 디스크 암호화와는 다르게 데이터베이스 내의 데이터를 암호화할 수 있습니다. 이 방법은 데이터베이스 엔진 내에 내장된 암호화 기능을 활용하여 데이터베이스를 암호화합니다.

 

아래에서 MySQL 및 PostgreSQL 데이터베이스에서 TDE를 설정하는 방법을 설명합니다.

 

MySQL에서 TDE 설정

MySQL에서 TDE를 구현하려면 InnoDB 스토리지 엔진과 InnoDB Transparent Tablespace Encryption을 사용해야 합니다.

  1. MySQL 설정 파일(my.cnf)을 열고 InnoDB Transparent Tablespace Encryption을 활성화합니다.
    [mysqld]
    innodb_encrypt_tables = ON
    innodb_encryption_threads = 4  # 적절한 스레드 수를 설정합니다.
  2. 마스터 키를 생성하고 설정합니다. 마스터 키는 데이터베이스를 암호화하는 데 사용됩니다.
    CREATE MASTER KEY ENCRYPTION BY PASSWORD 'YourMasterPassword';
  3. 암호화할 테이블을 생성하고 암호화 옵션을 설정합니다.
    CREATE TABLE encrypted_table (
        id INT AUTO_INCREMENT PRIMARY KEY,
        sensitive_data VARBINARY(256)
    ) ENGINE = InnoDB;
  4. 암호화된 테이블에서 데이터를 쓰거나 읽을 때 자동으로 암호화 및 복호화가 수행됩니다.

PostgreSQL에서 TDE 설정

PostgreSQL에서 TDE를 설정하려면 pgcrypto 확장을 사용하여 데이터를 암호화합니다.

  1. pgcrypto 확장을 활성화합니다.
    CREATE EXTENSION IF NOT EXISTS pgcrypto;
  2. 암호화할 테이블을 생성하고 암호화 옵션을 설정합니다.
    CREATE TABLE encrypted_table (
        id SERIAL PRIMARY KEY,
        sensitive_data BYTEA
    );
    
    ALTER TABLE encrypted_table
    ADD COLUMN encrypted_sensitive_data BYTEA;
  3. 데이터를 암호화하여 저장합니다.
    -- 데이터 암호화 및 저장
    UPDATE encrypted_table
    SET encrypted_sensitive_data = pgp_sym_encrypt('SensitiveInfo', 'YourEncryptionKey')
    WHERE id = 1;
  4. 데이터를 복호화하여 검색합니다.
    -- 데이터 복호화
    SELECT pgp_sym_decrypt(encrypted_sensitive_data, 'YourEncryptionKey')
    FROM encrypted_table
    WHERE id = 1;

TDE를 사용하면 데이터베이스 내의 데이터를 암호화할 수 있으며, 암호화 및 복호화 작업은 데이터베이스 엔진 자체에서 자동으로 처리됩니다. 이러한 설정을 사용하면 데이터베이스에 저장된 데이터가 안전하게 보호됩니다.

 

데이터베이스 암호화를 위한 다른 방법은 TFA(Two-Factor Authentication), 애플리케이션 수준 암호화 및 컬럼 레벨 암호화 등이 있습니다. 이러한 방법은 데이터베이스 시스템과 독립적으로 구현될 수 있으며, 특정 데이터나 사용 사례에 따라 선택할 수 있습니다.

  1. 애플리케이션 수준 암호화 (Application-Level Encryption)
    이 방법은 데이터를 데이터베이스에 저장하기 전에 애플리케이션 내에서 데이터를 암호화하는 것을 의미합니다. 데이터베이스 자체는 암호화하지 않고, 데이터는 애플리케이션 내에서 암호화되고 복호화됩니다. 이를 구현하려면 애플리케이션 코드에서 암호화 라이브러리를 사용하고 데이터를 저장 및 검색할 때 암호화 및 복호화 프로세스를 수행해야 합니다. 이 방법은 데이터베이스 시스템에 대한 변경이 필요하지 않으며, 데이터의 보안을 애플리케이션 수준에서 제어할 수 있습니다.
  2. 컬럼 레벨 암호화 (Column-Level Encryption)
    이 방법은 특정 컬럼의 데이터만 암호화하는 것을 의미합니다. 데이터베이스 시스템 내에서 지정된 컬럼에만 암호화를 적용하며, 나머지 데이터는 암호화되지 않습니다. 컬럼 레벨 암호화를 구현하려면 데이터베이스 시스템이 제공하는 암호화 함수나 라이브러리를 사용하여 특정 컬럼의 데이터를 암호화 및 복호화해야 합니다. 이 방법은 데이터베이스 시스템에 대한 변경이 필요하지만, 특정 컬럼에만 암호화를 적용할 수 있어 더 세밀한 제어가 가능합니다.
  3. Two-Factor Authentication (2FA)
    Two-Factor Authentication을 데이터베이스에 적용하는 것도 데이터 보안을 강화하는 중요한 방법 중 하나입니다. 이 방법은 사용자가 데이터베이스에 액세스할 때 추가적인 인증 단계를 필요로 합니다. 예를 들어, 사용자가 데이터베이스에 로그인할 때 사용자 이름과 암호 외에도 OTP(One-Time Password)나 생체 인식과 같은 추가 인증 단계를 거쳐야 합니다.

이러한 다양한 방법 중에서 선택할 때는 보안 요구 사항과 데이터베이스 시스템, 애플리케이션 아키텍처에 따른 적합한 방법을 선택해야 합니다. 데이터베이스 전문가나 보안 전문가와 함께 해당 데이터베이스 시스템 및 애플리케이션에 맞는 적절한 보안 솔루션을 평가하고 구현하는 것이 중요합니다.

728x90

댓글