PostgreSQL 데이터베이스 암호화

Bilal Shahid 2023년6월20일
  1. 암호화 소개
  2. PostgreSQL 데이터베이스 암호화
PostgreSQL 데이터베이스 암호화

이 자습서에서는 PostgreSQL에서 데이터를 암호화하기 위해 선택할 수 있는 다양한 방법을 설명합니다.

암호화 소개

간단히 말해서 암호화는 데이터를 보호할 수 있는 방법입니다. 콘텐츠를 숨기고 의도된 사용자 이외의 사람이 읽을 수 없도록 체계적으로 변경됩니다.

의도된 수신자만이 데이터를 해독할 수 있는 를 가지므로 가능합니다. 결과적으로 모든 민감한 정보는 항상 숨겨집니다.

모든 경우에 데이터를 암호화하는 것이 좋습니다. 그러나 민감한 정보가 보안되지 않은 서버에서 또는 데이터가 위협받는 다른 상황에서 송수신되는 경우 중요합니다.

PostgreSQL 데이터베이스 암호화

데이터베이스는 요구 사항에 따라 세 가지 다른 계층에서 암호화될 수 있습니다. 여기에는 다음이 포함됩니다.

  • 클라이언트 애플리케이션
  • 저장 장치
  • 데이터베이스 자체

자체 데이터베이스 암호화는 대부분의 위협 모델을 처리하는 것으로 알려진 최상의 암호화 형식인 경우가 많습니다.

다른 방법을 적용할 수 있지만 주요 목표는 클라이언트 응용 프로그램을 보호하는 것입니다. 따라서 다음은 PostgreSQL에서 데이터를 암호화하기 위해 선택할 수 있는 몇 가지 접근 방식입니다.

시스템 디스크 암호화

이름에서 알 수 있듯이 시스템 디스크 암호화는 디스크 암호화 소프트웨어/하드웨어가 디스크에 저장된 모든 데이터 비트를 암호화하는 프로세스입니다.

즉, 소프트웨어나 하드웨어가 동시에 암호화하도록 프로그래밍된 경우 사용자 데이터가 생성되는 즉시 암호화할 수 있습니다.

이를 위해 디스크가 암호화되어 있으므로 PostgreSQL 설정을 수정할 필요가 없습니다. 시스템 디스크 암호화를 수행하는 쉬운 방법은 Linux에서 VM을 사용하는 것입니다.

수행해야 할 작업은 다음과 같습니다.

먼저 대상 머신의 복제본이 될 임시 VM을 만듭니다. 대상 디스크는 기존 디스크일 수 있지만 새 디스크를 만들고 나중에 데이터베이스를 추가하는 것이 가장 좋습니다.

결정에 관계없이 대상 디스크는 소스 디스크보다 최소 256MB 이상 커야 합니다. 다음으로 아래 지침을 따를 수 있습니다.

  1. 타겟 및 소스 디스크를 임시 VM에 마운트해야 합니다.

  2. 직렬 포트를 통해 VM을 연결합니다. 이 단계를 수행하려면 직렬 포트 연결을 활성화해야 합니다. 직렬 포트 연결을 허용하려면 메타데이터에서 TRUE 값으로 serial-port-enable을 추가할 수 있습니다.

  3. 다음으로 grub에 액세스할 수 있도록 해야 합니다. 이렇게 하려면 다음 명령을 사용합니다.

    grub2-mkconfig -o/boot/grub2/grub.cfg
    

    그런 다음 시스템을 재부팅하면 직렬 콘솔에서 grub에 액세스할 수 있습니다.

  4. 디스크를 포맷하여 암호화되지 않은(부팅) 시스템과 암호화된 시스템을 만듭니다. 이를 통해 시스템은 grub을 부팅할 수 있으므로 사용자는 를 입력하여 데이터를 해독할 수 있습니다.

    fdisk /dev/sdb 명령을 사용하여 이를 수행할 수 있습니다.

  5. cryptsetup을 사용하여 디스크를 암호화합니다. 암호화할 디스크의 특정 부분을 매핑할 수도 있습니다. 그런 다음 데이터베이스가 이 디스크에 존재하는 한 데이터베이스를 암호화할 수 있습니다.

디스크 크기 조정 또는 백업 생성과 같은 추가 단계는 이 후에 수행할 수 있습니다.

투명한 데이터 암호화

PostgreSQL TDE는 사용자가 클러스터 암호화를 사용하여 전체 데이터베이스에 대해 PostgreSQL 암호화를 수행할 수 있도록 하는 기능입니다. 디스크에 쓰는 동안 암호화하고 디스크에서 읽는 동안 암호를 해독합니다.

기본적으로 적용되도록 PostgreSQL 설치 중에 다음 단계를 수행할 수 있습니다.

  • PostgreSQL용 디렉터리를 만듭니다. 기본 위치가 자주 사용됩니다.
  • bison, readline, flex, zlib, opensslcrypto용 라이브러리를 설치해야 합니다. 필요한 경우 추가 라이브러리를 설치할 수 있습니다.
  • 시스템에 PostgreSQL을 설치합니다.
  • su - postgres를 사용하여 postgres 사용자로 전환합니다.
  • -K를 사용하여 암호화된 클러스터를 생성합니다.

    예: initdb -D /user/pgsql/xyz -K/user/pgsql/key. 여기서 user/pgsql/key는 암호화 키를 반환합니다.

  • initdb는 암호화 key 명령을 postgresql.conf에 저장합니다.

클러스터가 성공적으로 생성되었으며 이제 데이터를 암호화합니다. 사용자가 Postgres를 실행할 때 이러한 암호화된 클러스터는 암호화되지 않은 클러스터와 다르지 않습니다.

유일한 차이점은 데이터 암호화 변수가 설정된다는 것입니다.

데이터베이스의 특정 섹션 암호화

위의 방법을 사용하면 전체 데이터베이스 또는 PostgreSQL의 모든 데이터베이스가 암호화됩니다. 그러나 개별 데이터베이스 또는 데이터베이스의 특정 부분을 암호화할 수도 있습니다.

이를 위해서는 pgcrypto와 같은 확장 프로그램을 사용하는 것이 가장 좋습니다. pgcrypto를 사용하는 선택적 Postgres 암호화가 작동하는 방식은 다음과 같습니다.

  1. CREATE EXTENSION IF NOT EXISTS pgcrypto를 사용하여 pgcrypto 확장을 활성화합니다.
  2. 일반적으로 PGP_SYM_ENCRYPT 명령은 데이터를 암호화하고 PGP_SYM_DECRYPT는 데이터를 해독합니다.

다음은 PostgreSQL에서 열을 암호화하고 해독하는 방법입니다.

열에 암호화된 데이터 삽입

INSERT INTO temp (x, y)
VALUES
('xx', PGP_SYM_ENCRYPT('yy', 'key')::text);

이미 암호화된 데이터 업데이트

UPDATE temp
SET y= PGP_SYM_ENCRYPT('content', 'key')::text
WHERE x= 'xx';

읽을 데이터 해독

SELECT x, PGP_SYM_DECRYPT(y::bytea, 'key') as data
FROM temp WHERE x= 'xx';

이는 요구 사항에 따라 데이터베이스를 암호화할 수 있는 몇 가지 다양한 방법을 요약한 것입니다. PostgreSQL 암호화는 언뜻 보기에는 어려워 보일 수 있지만 수행하는 것은 매우 간단합니다.

귀하의 데이터가 항상 보호될 수 있도록 어떤 종류의 암호화 서비스가 귀하에게 가장 적합한지 식별하는 데 도움이 되었기를 바랍니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub