PostgreSQL 데이터베이스 보안을 위한 필수 구성 설정

pg_hba.conf 규칙, SCRAM 인증, TLS 적용, 수신자 제한, 최소 권한 및 감사 로그를 통해 PostgreSQL을 안전하게 보호하세요.

PostgreSQL 데이터베이스 보안을 위한 필수 구성 설정

PostgreSQL 보안은 간단한 질문에서 시작됩니다: 누가, 어디서, 어떤 인증 방법으로 연결할 수 있습니까? pg_hba.conf가 너무 광범위하거나 서버가 필요한 것보다 더 많은 인터페이스에서 수신 대기하면 데이터베이스의 공격 표면이 필요 이상으로 커집니다.

이 가이드에서는 먼저 검토해야 할 PostgreSQL 보안 설정인 pg_hba.conf, SCRAM 비밀번호 인증, TLS, 네트워크 수신자, 역할 권한 및 로그에 대해 다룹니다.

1. pg_hba.conf로 클라이언트 인증 강화

호스트 기반 인증 파일(pg_hba.conf)은 연결할 수 있는 호스트, 연결할 수 있는 PostgreSQL 사용자, 액세스할 수 있는 데이터베이스, 그리고 가장 중요한 해당 연결에 필요한 인증 방법을 지정합니다.

pg_hba.conf 구조 이해

pg_hba.conf의 각 줄은 특정 형식을 따릅니다:

TYPE DATABASE USER ADDRESS METHOD [OPTIONS]

  • TYPE: 연결 유형(예: local, host, hostnossl, hostssl).
  • DATABASE: 대상 데이터베이스 이름.
  • USER: 대상 데이터베이스 역할.
  • ADDRESS: 클라이언트 IP 주소 범위.
  • METHOD: 인증 메커니즘(예: scram-sha-256, md5, reject, trust).

인증 방법 모범 사례

프로덕션 환경에서는 trust 방법을 절대 사용하지 마십시오. 연결 기준과 일치하는 모든 사람이 비밀번호 없이 연결할 수 있기 때문입니다. 권장되는 최신 인증 방법은 다음과 같습니다:

권장: scram-sha-256

SCRAM(Salted Challenge Response Authentication Mechanism)은 더 강력한 해싱을 사용하고 재전송 공격을 방지하여 md5와 같은 이전 비밀번호 방법보다 크게 개선되었습니다. 원격 연결의 기본 선택이어야 합니다.

# 애플리케이션 서브넷에서 원격 연결에 SCRAM 적용
host    appdb   app_user 10.20.30.0/24  scram-sha-256

비밀번호를 생성하거나 교체하기 전에 postgresql.conf에서 password_encryption = 'scram-sha-256'을 설정하십시오. 이전 해시로 저장된 기존 비밀번호는 자동으로 변환되지 않습니다. SCRAM을 활성화한 후 재설정하십시오.

password_encryption = 'scram-sha-256'

다른 네트워크 제어가 이미 액세스를 제한하지 않는 한 다음과 같은 광범위한 규칙은 피하십시오:

host    all     all     0.0.0.0/0       scram-sha-256

로컬 연결

서버 자체에서 시작된 연결(예: 동일한 시스템에서 실행되는 애플리케이션)의 경우 로컬 소켓을 사용하십시오. 가장 안전한 설정은 종종 peer(Unix 도메인 소켓의 경우) 또는 소켓이 비활성화되거나 제한된 경우 scram-sha-256입니다.

# Unix 소켓을 통한 로컬 연결에 피어 인증 사용
local   all     all             peer

연결 명시적 거부

reject 방법을 사용하여 위험하거나 신뢰할 수 없는 네트워크의 연결을 명시적으로 차단하십시오.

# 알려진 안전하지 않은 IP 범위에서 모든 연결 차단
host    all     all     192.168.1.0/24  reject

실행 가능한 팁: pg_hba.conf를 수정한 후 변경 사항을 적용하려면 PostgreSQL을 다시 로드하십시오(예: sudo systemctl reload postgresql 또는 SELECT pg_reload_conf();).

2. SSL/TLS 암호화 구현

네트워크를 통해 비밀번호를 포함한 민감한 데이터가 가로채이는 것을 방지하려면 모든 원격 연결에 SSL/TLS 암호화를 적용하는 것이 필수입니다.

postgresql.conf 구성

기본 구성 파일에서 다음 매개변수가 올바르게 설정되었는지 확인하십시오:

  • ssl = on: 전역적으로 SSL 지원을 활성화합니다.
  • ssl_cert_file: 서버 인증서 파일 경로(예: server.crt).
  • ssl_key_file: 서버 개인 키 파일 경로(예: server.key).

pg_hba.conf에서 SSL 적용

클라이언트가 SSL을 사용하도록 강제하려면 pg_hba.conf에서 연결 유형을 host에서 hostssl로 변경하십시오:

# SSL/TLS를 통한 연결만 허용
hostssl all     all     0.0.0.0/0       scram-sha-256

hostssl은 SSL 연결만 일치시킵니다. 동일한 사용자가 TLS 없이 연결할 수 있도록 하는 이후 또는 이전 host 규칙이 없는지 확인하십시오. 정책을 명확하게 하려면 비SSL 연결에 대한 거부 규칙을 추가하십시오:

hostnossl all    all     0.0.0.0/0       reject

3. 공격 표면 영역 최소화

보안에는 데이터베이스 서버가 외부 위협에 노출되는 것을 줄이는 것이 포함됩니다. 이는 주로 네트워크 구성과 불필요한 기능 비활성화를 통해 관리됩니다.

네트워크 수신 주소 제한

PostgreSQL은 일반적으로 localhost에서 수신 대기하도록 기본 설정되어 있지만 패키지 배포 및 관리 이미지는 다를 수 있습니다. 액세스가 필요한 특정 인터페이스에서만 수신 대기하도록 명시적으로 구성하거나 로컬 애플리케이션만 연결하는 경우 localhost로 유지하십시오.

postgresql.conf에서:

# 가능하면 localhost(127.0.0.1)에서만 수신 대기
listen_addresses = 'localhost'

# 또는 특정 개인 네트워크 인터페이스에서만 수신 대기
# listen_addresses = '192.168.1.10'

보안 경고: listen_addresses*로 설정된 경우 모든 인터페이스가 사용됩니다. pg_hba.conf가 연결할 수 있는 IP 범위를 엄격하게 제어하는지 확인하십시오.

불필요한 확장 및 기능 비활성화

활성화된 모든 확장은 잠재적인 복잡성과 공격 벡터를 추가합니다. 설치된 확장을 정기적으로 감사하고 프로덕션 워크로드에 적극적으로 사용되지 않는 확장을 제거하십시오. 이는 전체 공격 표면을 최소화합니다.

비밀번호 보안 및 역할

모든 관리 역할(예: 기본 postgres 사용자)이 ALTER USER를 사용하여 강력하고 복잡한 비밀번호를 가지고 있는지 확인하십시오:

ALTER USER postgres WITH PASSWORD 'YourStrongAndComplexPassword123!';

최소 권한 원칙을 사용하십시오: 애플리케이션 사용자는 슈퍼유저 상태 대신 필요한 특정 테이블에 대해서만 SELECT, INSERT, UPDATEDELETE 권한을 가져야 합니다.

4. 감사 및 로깅 구성

엄밀히 말해 액세스 제어 메커니즘은 아니지만 강력한 로깅은 보안 사고를 감지하고 조사하는 데 중요합니다. 관련 이벤트를 캡처하려면 postgresql.conf에서 로깅 매개변수를 구성하십시오.

보안 감사를 위한 주요 설정:

  • log_statement = 'ddl' 또는 'all': CREATE TABLEALTER USER와 같은 모든 데이터 정의 언어(DDL) 명령을 기록합니다. 'all'은 로그 볼륨이 높아지고 민감한 쿼리 텍스트를 캡처할 수 있으므로 주의해서 사용하십시오.
  • log_connections = on: 모든 성공적인 연결 시도를 기록합니다.
  • log_disconnections = on: 클라이언트 연결이 끊어질 때 기록합니다.
  • log_duration = on: 모든 문의 실행 시간을 기록하며, 이는 때때로 비정상적인 활동 패턴을 드러낼 수 있습니다.

pg_hba.conf의 엄격한 액세스 규칙, SSL을 통한 암호화 적용, 제한된 수신 주소 및 포괄적인 로깅을 결합하여 PostgreSQL 배포를 보호하기 위한 견고한 기반을 구축할 수 있습니다.

필수 보안 단계

  1. pg_hba.conf 업데이트: 인증 방법에 scram-sha-256 또는 peer를 사용하십시오.
  2. 암호화 적용: postgresql.conf에서 ssl = on을 설정하고 pg_hba.conf에서 hostssl 항목을 사용하십시오.
  3. 수신 제한: listen_addresses를 필요한 인터페이스로만 구성하고 가능하면 기본 *를 피하십시오.
  4. 최소 권한 적용: 데이터베이스 역할을 해당 기능에 절대적으로 필요한 권한으로만 제한하십시오.
  5. 구성 다시 로드: 보안 파일을 수정한 후 변경 사항을 적용하려면 항상 PostgreSQL을 다시 로드하거나 다시 시작하십시오.

이러한 설정이 기본입니다. 적용한 후에는 허용된 클라이언트에서 테스트하고, 차단된 클라이언트에서 테스트하며, 로그에 예상한 연결 동작이 표시되는지 확인하십시오.