PostgreSQL · 2026-02-13

PostgreSQL SSL/TLS 적용과 인증서 관리

PostgreSQL에 SSL/TLS 적용 방법과 서버·클라이언트 인증서 생성, 배포, 갱신 절차 및 설정 항목을 초보자도 이해하기 쉬운 기술자료

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

개요

데이터 전송을 암호화하면 도청과 중간자 공격을 방지할 수 있다. PostgreSQL은 SSL/TLS를 통해 클라이언트와 서버 간 통신을 보호한다. 이 문서는 인증서 준비부터 서버 설정, 클라이언트 연결과 실무적 인증서 관리를 단계적으로 다룬다. 처음 접하는 사람도 따라 할 수 있도록 예제와 체크리스트를 함께 제공한다.

SSL/TLS의 목적과 적용 범위

목적

SSL/TLS는 전송 계층 암호화를 제공한다. 이를 통해 패킷 내용 노출을 막고 서버 인증으로 연결 대상의 신뢰성을 확보한다. 내부 네트워크라도 민감한 데이터가 오가면 암호화 적용이 권장된다.

적용 범위

서버 인증서로 서버 식별을 보장한다. 클라이언트 인증서(optional)는 클라이언트 권한을 강화한다. 로드밸런서나 리버스 프록시가 있는 환경에서는 프록시-백엔드 간 설정도 검토해야 한다.

준비: 인증서와 키

자체 서명 CA와 인증서 생성(개발/테스트)

운영 환경은 공인 CA 사용을 권장한다. 테스트나 내부용으로 자체 서명 CA를 만드는 방법은 다음과 같다.

openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=MyCA"

# 서버 키와 CSR
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/CN=postgres.example.com"

# 서버 인증서 서명
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256

server.key는 PostgreSQL이 읽을 수 있는 위치에 두고 권한을 0600으로 제한한다.

공인 인증서 사용(운영)

Let's Encrypt 등 공인 CA로 발급받는 경우 인증서 체인과 개인키를 준비한다. 인증서 경로와 키 경로를 postgresql.conf에 설정하면 된다.

PostgreSQL 서버 설정

postgresql.conf 주요 항목

postgreSQL 설정 파일에서 SSL 활성화와 인증서 파일 위치를 지정한다.

# postgresql.conf 예시
ssl = on
ssl_cert_file = '/etc/postgresql/certs/server.crt'
ssl_key_file = '/etc/postgresql/certs/server.key'
ssl_ca_file = '/etc/postgresql/certs/ca.crt'  # 클라이언트 인증 검증 시 사용

pg_hba.conf: 연결 유형별 정책

pg_hba.conf는 연결 허용 규칙을 담당한다. SSL 전용으로 강제하거나 클라이언트 인증서 검증을 추가할 수 있다.

# 호스트 연결을 SSL로 강제
hostssl all all 0.0.0.0/0 md5

# 클라이언트 인증서 검증을 요구할 때
hostssl all all 10.0.0.0/24 cert clientcert=1

hostssl는 SSL 연결만 허용한다. cert 방식은 클라이언트 인증서를 검증한다.

인증서 관리

갱신 주기와 자동화

인증서는 만료일이 있다. 만료로 인한 서비스 중단을 방지하려면 갱신 주기를 파악하고 자동화 스크립트를 마련한다. Let's Encrypt는 자동 갱신 도구(certbot)를 사용한다. 자체 CA도 만료 관리를 정책으로 운영한다.

권한 및 파일 보호

비밀키 파일(server.key)은 오직 DB 프로세스가 읽을 수 있도록 소유자와 권한을 제한한다. 일반적인 권한 설정 예시는 다음과 같다.

chown postgres:postgres /etc/postgresql/certs/server.key
chmod 0600 /etc/postgresql/certs/server.key

CA 파일은 읽기 전용으로 배포하되, 공개 정보로 취급할 수 있다. 다만 무단 변경은 신뢰 체계를 깨므로 배포 채널을 통제한다.

클라이언트 연결 설정

psql 및 libpq 옵션

클라이언트는 sslmode 또는 sslrootcert 옵션으로 SSL 동작을 제어한다. 주요 모드는 다음과 같다.

  • disable: SSL 사용 안함
  • require: 암호화는 하지만 서버 인증서 검증은 하지 않음
  • verify-ca: CA 검증 수행
  • verify-full: CA와 호스트명(공통이름) 검증 수행
# psql 예시 (CA 검증)
psql "host=postgres.example.com port=5432 dbname=mydb user=appuser sslmode=verify-ca sslrootcert=/path/to/ca.crt"

# libpq connection string 예시 (호스트명 검증)
postgresql://appuser@postgres.example.com/mydb?sslmode=verify-full&sslrootcert=/path/to/ca.crt

운영환경에서는 verify-full을 사용해 호스트 증명을 함께 수행하는 것이 안전하다.

문제 해결과 체크리스트

자주 발생하는 오류

  • SSL 세션이 수립되지 않음: postgresql.conf의 ssl 옵션과 파일 경로 확인
  • 권한 오류: server.key 파일 권한이 너무 넓음(서버 재시작 후 로그 확인)
  • 클라이언트 검증 실패: sslrootcert 경로와 인증서 체인이 정확한지 확인
  • 호스트명 불일치: 인증서 CN 또는 SAN에 사용 중인 호스트명이 포함되어 있는지 확인

디버깅 팁

  • Postgres 로그(로그 레벨을 info→debug1로 올려 SSL 관련 메시지 확인)
  • 클라이언트에서 openssl s_client로 직접 연결해 인증서 체인과 호스트명 확인
  • pg_hba.conf 규칙 순서를 점검하여 의도한 규칙이 적용되는지 확인

마무리 요약

SSL/TLS 적용은 데이터 전송의 기본 보안 수단이다. 인증서 준비, postgresql.conf와 pg_hba.conf 설정, 클라이언트의 sslmode 설정, 그리고 인증서 갱신 정책을 차례로 점검하면 안정적으로 운영할 수 있다. 특히 권한 설정과 인증서 만료 관리가 실무에서 문제를 일으키는 빈도가 높으므로 우선 점검 대상에 포함해야 한다.

postgres ssl 설정 postgresql tls 인증서 ssl 연결 postgres 설정 postgresql 인증서 관리 postgresql 보안 postgresql openssl 데이터베이스 보안 pg_hba ssl