[PostgreSQL] 인증 및 보안 강화하기

🔐 PostgreSQL 인증 강화 가이드 — 비밀번호만으로는 부족하다

PostgreSQL은 기본적으로 username + password 조합으로 인증하지만,
그 외에도 여러 보안 강화 방법을 제공하여 MFA(다단계 인증) 수준의 보호를 구축할 수 있습니다.
이 글에서는 PostgreSQL의 인증 강화 방안을 단계별로 정리합니다.

1️⃣ 비밀번호 보안 강화 (기본 강화)

기본적인 로그인 방식을 유지하면서도 훨씬 안전하게 만드는 방법입니다.

✅ SCRAM-SHA-256 전환

md5보다 훨씬 안전한 해시 알고리즘입니다.

# postgresql.conf
password_encryption = scram-sha-256
# pg_hba.conf
host all all 10.0.0.0/8 scram-sha-256

✅ 채널 바인딩 (MITM 방어)

클라이언트 설정에 다음 옵션을 추가합니다.

channel_binding=require

이를 통해 중간자 공격 시 인증이 실패하도록 보호할 수 있습니다.

2️⃣ TLS(SSL) + 클라이언트 인증서 (소유요소 추가)

TLS는 기본이며, 클라이언트 인증서를 추가하면 “소유요소”를 확보할 수 있습니다.

# postgresql.conf
ssl = on
ssl_min_protocol_version = 'TLSv1.2'

pg_hba.conf 예시:

hostssl  all  all  0.0.0.0/0  scram-sha-256  clientcert=verify-full

클라이언트 인증서의 CN(Common Name)을 DB 유저로 매핑하려면 pg_ident.conf를 사용합니다.

# pg_ident.conf
certmap CN=alice@example.com alice

3️⃣ 외부 인증 연동 (진짜 2FA)

PostgreSQL은 PAM, LDAP, RADIUS, GSSAPI를 지원하므로 기업용 MFA와 직접 연동할 수 있습니다.

✅ PAM (Pluggable Authentication Modules)

# pg_hba.conf
host all all 0.0.0.0/0 pam

서버의 /etc/pam.d/postgresql에 MFA 모듈을 추가하면
예: pam_unix.so(비밀번호) + pam_google_authenticator.so(OTP) → 2단계 인증 완성.

✅ LDAP (AD/SSO 통합)

host  all  all  0.0.0.0/0  ldap ldapserver=ldap.example.com ldapprefix="uid=" ldapsuffix=",ou=people,dc=example,dc=com" ldaptls=1

LDAP(AD, Okta, FreeIPA 등)에 MFA 정책이 있다면 그대로 적용됩니다.

✅ RADIUS

host  all  all  0.0.0.0/0  radius radiusserver=radius.example.com radiussecret=YOURSECRET

RADIUS 서버(Duo, FreeRADIUS 등)에서 OTP나 푸시 인증을 수행합니다.

✅ GSSAPI (Kerberos SSO)

조직 내 Kerberos 환경이 있다면 SSO 기반으로 비밀번호 없는 인증을 구현할 수 있습니다.

4️⃣ 프록시/게이트웨이 기반 단기 인증

“짧은 수명의 자격증명”을 사용하면 키 유출 위험을 최소화할 수 있습니다.

솔루션 설명
Teleport Database Access MFA로 로그인 후 임시 X.509 인증서로 DB 접근
AWS RDS IAM Auth IAM 토큰 기반 단기 인증 (SSO + MFA 연동 가능)
GCP Cloud SQL IAM Auth Identity-Aware Proxy(IAP) 통해 MFA 적용
HashiCorp Vault DB Engine SSO 이후 짧은 TTL의 동적 크리덴셜 발급

5️⃣ 네트워크 및 접근 통제

  • pg_hba.conf 최소화 (CIDR 제한)
  • hostssl만 허용
  • Bastion 서버 + SSH 터널에 MFA 적용
  • PostgreSQL 감사 기능:
log_connections = on
log_disconnections = on
shared_preload_libraries = 'pgaudit'

6️⃣ 현실적인 구성 예시

# pg_hba.conf
hostssl all all 10.0.0.0/8 scram-sha-256 clientcert=verify-full
hostssl all all 0.0.0.0/0 pam clientcert=verify-full

/etc/pam.d/postgresql

auth required pam_unix.so
auth required pam_google_authenticator.so

이 조합으로

  • TLS 암호화 (채널 보호)
  • 클라이언트 인증서 (소유요소)
  • 비밀번호 (지식요소)
  • OTP (2차 인증)

까지 모두 포함됩니다.

7️⃣ Kubernetes (CNPG) 환경이라면

  • DB는 ClusterIP로 내부망만 노출
  • 외부 접근은 Bastion 또는 Teleport 게이트웨이 경유
  • 인증서는 Vault 또는 Kubernetes Secret 자동 갱신
  • pg_hba는 hostssl + scram + clientcert 조합 유지

✅ 마무리 체크리스트

항목 상태
TLS(SSL) 활성화
SCRAM-SHA-256 사용
채널 바인딩
클라이언트 인증서 검증
PAM/LDAP/RADIUS MFA 연동
단기 토큰 기반 접근
접속 CIDR 제한 및 감사 로깅

🔎 결론

PostgreSQL도 구성만 잘 하면 SSO + MFA + TLS + 동적 크리덴셜을 모두 지원하는
기업급 보안 체계를 구현할 수 있습니다.
단순한 비밀번호 인증은 이제 그만,
TLS + 인증서 + PAM(또는 LDAP/RADIUS) 조합으로 한 단계 업그레이드하세요.

Share