PostgreSQL · 2026-02-20

PostgreSQL 암호화: at-rest와 in-transit 설정

PostgreSQL에서 저장 데이터 암호화(at-rest)와 전송 암호화(in-transit)의 개념, 구현 방법, 구성 예시를 쉽게 이해할 수 있는 설명서

작성일 : 2026-02-20 ㆍ 작성자 : 관리자
post
목차

소개

데이터베이스 보안에서 암호화는 두 축으로 나뉜다. 하나는 저장된 데이터를 보호하는 at-rest 암호화이고, 다른 하나는 네트워크로 오가는 데이터를 보호하는 in-transit 암호화다. PostgreSQL 환경에서는 물리적 디스크, 백업, WAL(Write-Ahead Log), 컬럼 단위 암호화, 그리고 TLS 기반 전송 암호화를 조합해 전체적인 보안 수준을 높인다. 이하 내용은 처음 접하는 독자도 이해할 수 있도록 개념과 설정 예시를 정리한 자료이다.

at-rest 암호화 개요

at-rest 암호화는 데이터베이스가 저장하는 모든 형태의 데이터를 대상으로 한다. 여기에는 데이터 파일, WAL, 로그, 스냅샷, 백업이 포함된다. PostgreSQL 자체에는 전면적인 TDE(Transparent Data Encryption) 기능이 내장되어 있지 않으므로, 주로 다음 세 가지 방식으로 구현한다.

1. 디스크/파일시스템 암호화

OS 수준에서 디스크를 암호화하면 모든 파일과 로그를 투명하게 보호할 수 있다. 대표적으로 Linux의 LUKS(dm-crypt)나 클라우드 제공자의 볼륨 암호화를 활용한다. 장점은 설정 한 번으로 데이터 전반을 보호하는 점이며 단점은 키 관리와 성능 영향을 고려해야 한다.

2. 백업과 WAL 암호화

백업과 WAL은 별도로 암호화되지 않으면 복구 시 데이터 노출 지점이 된다. 백업 툴(예: pg_basebackup)으로 덤프를 받을 때 암호화된 스토리지에 저장하거나, 전송 시 암호화 계층을 적용해야 한다. S3 같은 오브젝트 스토리지로 보관할 경우 서버사이드 암호화 또는 클라이언트 사이드 암호화를 병행한다.

3. 컬럼/애플리케이션 레벨 암호화

민감한 필드만 선별적으로 보호하려면 컬럼 수준 암호화가 유리하다. PostgreSQL의 pgcrypto 확장으로 대칭/비대칭 암호화를 적용할 수 있으며, 애플리케이션에서 암호화·복호화 로직을 제어하면 키 노출 위험을 줄인다.

pgcrypto 예시

CREATE EXTENSION IF NOT EXISTS pgcrypto;

-- 대칭 암호화
SELECT pgp_sym_encrypt('비밀데이터', '대칭키') AS ciphertext;
-- 복호화
SELECT pgp_sym_decrypt(ciphertext, '대칭키')::text AS plaintext;

-- 비대칭 암호화(공개키)
-- 공개키는 안전한 방식으로 배포되어야 함
SELECT pgp_pub_encrypt('비밀', dearmor('-----BEGIN PGP PUBLIC KEY BLOCK-----...-----END PGP PUBLIC KEY BLOCK-----'));

at-rest 구현 시 고려사항

  • 키 관리: 키는 HSM이나 클라우드 KMS에 보관해 접근 제어 및 교체 주기를 관리한다.
  • 백업 정책: 암호화된 백업의 복호화 권한을 최소권한 원칙으로 설정한다.
  • 성능 테스트: 디스크 암호화나 pgcrypto 사용 시 성능 영향(특히 대량 쓰기)을 사전 검증한다.

in-transit 암호화(TLS) 개요

in-transit 암호화는 클라이언트와 서버 간 통신을 보호한다. PostgreSQL은 TLS(SSL)를 통해 연결 암호화를 지원하며, 서버 인증뿐 아니라 클라이언트 인증도 설정할 수 있다. TLS를 활성화하면 중간자 공격과 도청을 방지할 수 있다.

TLS 설정 개요

기본 절차는 인증서 생성, PostgreSQL 설정 파일 수정, 클라이언트 연결 모드 지정이다. 인증서는 자체 서명이나 CA 서명 인증서를 사용할 수 있으며, 운영 환경에서는 신뢰할 수 있는 CA 또는 내부 PKI 기반 인증서를 권장한다.

서버 인증서 생성 예시

# 개인키 생성
openssl genrsa -out server.key 2048
# 인증서 요청 및 자체 서명
openssl req -new -x509 -days 365 -key server.key -out server.crt -subj "/CN=postgres.example.com"
# 권한과 소유권 설정(예시)
chown postgres:postgres server.key server.crt
chmod 600 server.key

postgresql.conf와 pg_hba.conf 예시

-- postgresql.conf
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ciphers = 'HIGH:!aNULL:!MD5'
ssl_prefer_server_ciphers = on
ssl_min_protocol_version = 'TLSv1.2'

-- pg_hba.conf (SSL만 허용)
hostssl all all 0.0.0.0/0 scram-sha-256

클라이언트 연결 예시

# psql에서 TLS 강제 연결
psql "host=postgres.example.com port=5432 dbname=mydb user=myuser sslmode=require"

# 클라이언트 인증서 사용 시
psql "host=postgres.example.com sslmode=verify-ca sslrootcert=ca.crt sslcert=client.crt sslkey=client.key"

in-transit 구현 시 고려사항

  • sslmode 옵션: 애플리케이션 드라이버에서 sslmode를 적절히 설정해 중간자 공격 위험을 줄인다.
  • 프로토콜 제약: TLS 1.2 이상을 권장하고 약한 암호화 스위트를 비활성화한다.
  • 클라이언트 인증: 민감 환경은 클라이언트 인증(cert)으로 추가 인증 계층을 확보한다.

운영 관행과 권장 사항

  • 키 관리 시스템(KMS/HSM) 통합으로 키 수명 주기와 접근 제어를 관리한다.
  • 로그와 감사: 암호화 및 복호화 이벤트, 키 접근 로그를 수집해 이상 행위를 감지한다.
  • 암호화 대상 분류: 모든 컬럼을 암호화하기보다 민감도에 따라 분류해 적용한다.
  • 비상 복구 플랜: 키 손실 시 복구 프로세스와 책임자를 명확히 한다.
  • 정기 점검: TLS 설정, 인증서 만료, 암호화 라이브러리 취약점을 주기적으로 점검한다.

요약

PostgreSQL에서 안전한 데이터 관리를 위해서는 at-rest와 in-transit 암호화를 함께 고려하는 것이 핵심이다. 파일시스템 암호화는 광범위한 보호를 제공하고, pgcrypto는 민감 필드의 세분화된 제어를 가능케 한다. TLS 설정은 네트워크 계층의 기밀성과 무결성을 보장한다. 마지막으로 키 관리와 운영 절차가 암호화의 실효성을 결정하므로 KMS/HSM, 백업 정책, 감사 로깅을 반드시 포함하는 보안 설계를 권장한다.

postgres 데이터 암호화 at rest postgres 암호화 설정 postgres tls 암호화 전송 PostgreSQL 암호화 pgcrypto 디스크 암호화 TLS 설정 데이터베이스 보안