SSL/TLS 구성을 통한 PostgreSQL 연결 보안 설정: 완벽 가이드

SSL/TLS 암호화를 사용하여 PostgreSQL 연결을 안전하게 보호하는 방법을 알아보세요. 이 종합 가이드는 인증서 생성, `postgresql.conf` 및 `pg_hba.conf` 수정, 보안 암호화 통신을 위한 클라이언트 설정 등 서버 및 클라이언트 측 구성을 다룹니다. 전송 중인 민감한 데이터를 보호하고 최신 보안 표준을 준수하십시오.

96 조회수

SSL/TLS 구성을 통한 PostgreSQL 연결 보안: 완벽 가이드

오늘날 상호 연결된 디지털 환경에서 전송 중인 데이터를 보호하는 것은 매우 중요합니다. 강력한 오픈 소스 관계형 데이터베이스인 PostgreSQL은 SSL/TLS를 사용하여 연결을 암호화하는 강력한 메커니즘을 제공합니다. 이 가이드는 PostgreSQL 서버와 클라이언트 모두를 구성하여 SSL/TLS 암호화를 적용하는 포괄적인 과정을 안내하며, 신뢰할 수 없는 네트워크에서 발생하는 도청 및 중간자 공격(man-in-the-middle attacks)으로부터 민감한 정보를 보호합니다. 이러한 보안 조치를 구현하는 것은 데이터 무결성을 유지하고, 엄격한 보안 표준을 준수하며, 사용자 신뢰를 구축하는 데 필수적입니다.

이 문서는 SSL 인증서를 생성하거나 확보하는 것부터 PostgreSQL이 이를 사용하도록 구성하는 과정, 그리고 보안 연결을 위한 클라이언트 설정에 이르기까지 필수적인 단계를 다룰 것입니다. 필요한 구성 매개변수를 자세히 살펴보고, 이러한 보안 강화를 효과적으로 구현하는 데 도움이 되는 실용적인 예제를 제공합니다.

PostgreSQL에서 SSL/TLS 이해하기

SSL/TLS (Secure Sockets Layer/Transport Layer Security)는 컴퓨터 네트워크를 통한 통신 보안을 제공하도록 설계된 암호화 프로토콜입니다. PostgreSQL에 적용될 때, 이는 데이터베이스 서버와 클라이언트 간에 교환되는 데이터를 암호화합니다. 이를 통해 권한이 없는 당사자가 자격 증명, 금융 데이터 또는 개인 정보와 같은 민감한 정보를 가로채고 읽는 것을 방지합니다.

PostgreSQL은 SSL/TLS에 대해 주로 다음 세 가지 모드를 지원합니다.

  • ssl=on: SSL 연결을 허용하지만 필수는 아닙니다. 클라이언트는 SSL 또는 비(非) SSL 연결을 사용하여 연결할 수 있습니다.
  • ssl=prefer: SSL 연결을 설정하려고 시도하지만 실패할 경우 비(非) SSL 연결로 대체합니다.
  • ssl=require: SSL 연결을 필수로 요구합니다. SSL 연결을 설정할 수 없는 경우, 클라이언트 연결은 거부됩니다.

ssl=require를 적용하는 것이 전송 중인 데이터를 보호하는 가장 안전한 옵션입니다.

SSL/TLS 구성을 위한 전제 조건

SSL/TLS를 위해 PostgreSQL 구성을 시작하기 전에 다음 사항을 확인하십시오.

  1. OpenSSL 설치: OpenSSL 툴킷은 SSL 인증서를 생성하고 관리하는 데 필수적입니다. 일반적으로 Linux 및 macOS 시스템에는 사전 설치되어 있습니다. Windows의 경우 별도로 다운로드하여 설치해야 할 수도 있습니다.
  2. PostgreSQL 구성 파일 접근 권한: postgresql.confpg_hba.conf 파일을 수정하려면 관리 권한이 필요합니다.
  3. 인증 기관(CA)에 대한 이해: 테스트를 위해 자체 서명(self-signed) 인증서를 생성할 수 있지만, 프로덕션 환경에서는 신뢰할 수 있는 인증 기관(CA) 또는 내부 엔터프라이즈 CA가 서명한 인증서를 사용하는 것이 이상적입니다.

서버 측 SSL/TLS 구성

서버 측 구성에는 SSL 활성화, SSL 인증서 및 키 위치 지정, 클라이언트 인증 구성이 포함됩니다.

1. SSL 인증서 및 키 생성 또는 확보

PostgreSQL 서버용 SSL 인증서를 얻는 주요 방법에는 두 가지가 있습니다.

  • 자체 서명(Self-Signed) 인증서 (테스트/개발용): OpenSSL을 사용하여 생성되며 기본적으로 외부 클라이언트가 신뢰하지 않습니다. 초기 설정 및 내부 테스트에 유용합니다.
  • 인증 기관(CA)의 인증서 (프로덕션용): 신뢰할 수 있는 공개 CA(예: Let's Encrypt, DigiCert) 또는 내부 엔터프라이즈 CA로부터 인증서를 확보합니다. 이는 클라이언트가 서버의 ID를 확인할 수 있도록 보장합니다.

OpenSSL을 사용한 자체 서명(Self-Signed) 인증서 생성:

이는 개발 및 내부 환경에서 흔히 사용되는 접근 방식입니다. PostgreSQL 서버 또는 OpenSSL이 설치된 시스템에서 다음 명령을 실행하십시오.

  1. 인증서용 디렉토리 생성: 인증서를 체계적으로 관리하는 것이 좋습니다.
    bash sudo mkdir -p /etc/postgresql/ssl sudo chown postgres:postgres /etc/postgresql/ssl cd /etc/postgresql/ssl

  2. 서버 개인 키 생성: 이 키는 기밀로 유지되어야 합니다.
    bash sudo openssl genrsa -des3 -out server.key 2048
    암호를 입력하라는 메시지가 표시됩니다. PostgreSQL이 시작될 때 이 암호가 필요하므로 기억해야 합니다.

  3. 암호 제거 (선택 사항이지만 자동 재시작을 위해 권장됨): 수동 암호 입력 없이 자동 시작을 하려면 암호를 제거합니다. 이 파일에 액세스하는 사람은 누구나 서버를 위장할 수 있으므로 극도로 주의해야 합니다.
    bash sudo openssl rsa -in server.key -out server.key

  4. 서버 인증서 서명 요청(CSR) 생성: 여기에는 서버에 대한 정보가 포함됩니다.
    bash sudo openssl req -new -key server.key -out server.csr
    국가 이름, 주, 지역 이름, 조직 이름, 일반 이름(Common Name, 서버의 호스트 이름 또는 IP 주소여야 함), 이메일 주소와 같은 정보를 입력하라는 메시지가 표시됩니다.

  5. 자체 CA를 사용하여 인증서 서명 (내부 사용):

    • 루트 CA 개인 키 및 인증서 생성 (아직 없는 경우):
      bash # CA 개인 키 생성 sudo openssl genrsa -des3 -out root.key 2048 # CA 인증서 생성 (3650일 유효) sudo openssl req -new -x509 -days 3650 -key root.key -out root.crt
    • CA로 서버 CSR 서명: 신뢰할 수 있는 서버 인증서가 생성됩니다.
      bash sudo openssl x509 -req -days 365 -in server.csr -CA root.crt -CAkey root.key -set_serial 01 -out server.crt
  6. 권한 설정: PostgreSQL 사용자가 이 파일들을 읽을 수 있도록 합니다.
    bash sudo chown postgres:postgres server.key server.crt root.crt sudo chmod 600 server.key sudo chmod 644 server.crt root.crt

공용/엔터프라이즈 CA의 인증서 사용:

CA로부터 인증서를 확보하는 경우, 일반적으로 다음을 받게 됩니다.

  • server.crt: 서버의 공개 인증서.
  • server.key: 서버의 개인 키.
  • root.crt (또는 유사한 파일): CA의 루트 인증서 (잠재적으로 중간 인증서).

이 파일들을 보안 디렉토리(예: /etc/postgresql/ssl/)에 배치하고 PostgreSQL 사용자가 읽기 권한을 가지고 있는지 확인하십시오.

2. postgresql.conf 구성

postgresql.conf 파일(일반적으로 PostgreSQL 데이터 디렉토리에 위치)을 편집하여 SSL을 활성화하고 인증서 파일을 지정합니다.

#------------------------------------------------------------------------------
# SSL
#------------------------------------------------------------------------------

ssl = on

# These are all in PEM format, and are ignored if server key/certificate are
# not configured.  By default, the files are expected to be in the server's
# data directory.  Alternatively, they can be specified as full paths.
ssl_cert_file = '/etc/postgresql/ssl/server.crt'     # (필요시 파일명 변경)
ssl_key_file = '/etc/postgresql/ssl/server.key'      # (필요시 파일명 변경)
ssl_ca_file = '/etc/postgresql/ssl/root.crt'         # (선택 사항, 클라이언트 인증서 확인용)

# Optional: specify cipher list if needed
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'

# Optional: enable client certificate verification
#ssl_ca_file must be set to a file containing the CA certificate(s) to trust
#ssl_crl_file = ''
#ssl_crl_dir = ''
  • ssl = on: 서버에서 SSL 지원을 활성화합니다.
  • ssl_cert_file: 서버의 공개 인증서 경로.
  • ssl_key_file: 서버의 개인 키 경로.
  • ssl_ca_file: CA 인증서 경로 (클라이언트 인증서를 확인하려는 경우 또는 서버 인증서가 사용자 지정 CA에 의해 서명된 경우).

3. SSL 적용을 위한 pg_hba.conf 구성

pg_hba.conf 파일은 클라이언트 인증을 제어합니다. SSL 연결을 적용하도록 항목을 수정해야 합니다.

기본적으로 pg_hba.conf의 항목은 다음과 같습니다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256

SSL을 적용하려면 host 항목을 hostssl로 변경하십시오.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer
# IPv4 local connections:
hostssl all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
hostssl all             all             ::1/128                 scram-sha-256

# Example for external network access - requires SSL (외부 네트워크 접속 예시 - SSL 필수)
hostssl all             all             0.0.0.0/0               scram-sha-256
hostssl all             all             ::/0                    scram-sha-256
  • hostssl: 이 레코드 유형은 SSL 연결을 필수로 요구합니다. SSL 없이 시도된 모든 연결 시도는 거부됩니다.
  • hostnossl: 이 레코드 유형은 SSL 연결을 명시적으로 금지합니다.
  • host: SSL 및 비(非) SSL 연결을 모두 허용합니다 (이것이 기본값이며 보안성이 낮습니다).

4. PostgreSQL 서버 재시작

postgresql.confpg_hba.conf를 수정한 후에는 변경 사항을 적용하려면 PostgreSQL 서비스를 재시작해야 합니다.

# For systems using systemd (대부분의 최신 Linux 배포판)
sudo systemctl restart postgresql

# For systems using init.d
sudo service postgresql restart

클라이언트 측 SSL/TLS 구성

클라이언트도 보안 연결을 위해 구성해야 합니다. 여기에는 연결 매개변수 지정, 잠재적으로 클라이언트 인증서 제공, 서버 인증서 확인 등이 포함됩니다.

1. 연결 문자열 매개변수

psql 또는 모든 PostgreSQL 클라이언트 라이브러리를 통해 연결할 때, 연결 문자열 또는 개별 옵션으로 SSL 매개변수를 지정할 수 있습니다.

기본 SSL 연결 (서버 인증만):

psql "sslmode=require host=your_server_hostname dbname=your_db user=your_user"
  • sslmode: 클라이언트의 SSL 동작을 제어합니다.
    • disable: 비(非) SSL 연결만 허용합니다.
    • allow: 비(非) SSL을 허용하지만, 서버가 지원하면 SSL을 선호합니다.
    • prefer (기본값): SSL을 선호하지만, SSL이 실패하면 비(非) SSL을 허용합니다.
    • require: SSL 연결만 허용합니다. 서버가 SSL을 지원하지 않으면 연결이 실패합니다.
    • verify-ca: SSL 연결만 허용하고 서버 인증서가 신뢰할 수 있는 CA에 의해 서명되었는지 확인합니다. sslrootcert 매개변수가 설정되어야 합니다.
    • verify-full: SSL 연결만 허용하고, 신뢰할 수 있는 CA에 대해 서버 인증서를 확인하며, 서버 호스트 이름이 인증서의 CN(Common Name) 또는 SAN(Subject Alternative Name)과 일치하는지 확인합니다.

서버 인증서 확인 (verify-ca 또는 verify-full):

보안 강화를 위해 클라이언트는 서버의 ID를 확인해야 합니다. 이를 위해서는 클라이언트가 서버 인증서에 서명한 CA를 신뢰해야 합니다.

  1. CA 인증서 확보: 서버 인증서 서명에 사용된 root.crt 파일(또는 적절한 CA 인증서)을 가져옵니다.
  2. sslrootcert 지정: 클라이언트에게 이 CA 인증서의 위치를 알려줍니다.
psql "sslmode=verify-full host=your_server_hostname dbname=your_db user=your_user sslrootcert=/path/to/your/root.crt"

2. 클라이언트 인증서 (상호 인증)

더 높은 수준의 보안을 위해, 서버도 클라이언트 인증서를 사용하여 클라이언트의 ID를 확인하는 상호 인증을 구현할 수 있습니다.

클라이언트 인증서 생성:

서버 인증서와 유사하게, 서버가 신뢰하는 CA(종종 서버 인증서와 동일한 CA)에 의해 서명된 클라이언트 개인 키와 클라이언트 인증서가 필요합니다.

  1. 클라이언트 개인 키 생성:
    bash openssl genrsa -des3 -out client.key 2048

  2. 클라이언트 CSR 생성:
    bash openssl req -new -key client.key -out client.csr
    세부 정보를 제공하며, 일반 이름(Common Name)이 클라이언트에 대해 고유한지 확인하십시오.

  3. CA로 클라이언트 CSR 서명:
    bash sudo openssl x509 -req -days 365 -in client.csr -CA root.crt -CAkey root.key -set_serial <unique_serial> -out client.crt

  4. 권한 설정:
    bash chmod 600 client.key chmod 644 client.crt

클라이언트 인증서 인증을 위한 pg_hba.conf 구성:

서버에서 클라이언트 인증서 인증을 수락하도록 pg_hba.conf를 구성해야 합니다. 이는 종종 cert 인증 방법을 사용합니다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# Require SSL and client certificate authentication for specific user/db
hostssl all             your_user       your_client_ip/32       cert map=your_cert_map

특정 클라이언트 인증서 세부 정보(예: Subject 또는 SubjectAltName)를 PostgreSQL 사용자에 매핑하려면 인증서 맵 파일(cert_map 옵션)을 정의해야 할 수도 있습니다. 자세한 cert 인증 및 인증서 매핑 설정은 PostgreSQL 공식 문서를 참조하십시오.

인증서를 사용하도록 클라이언트 구성:

클라이언트의 연결 문자열을 업데이트하여 해당 인증서 및 키 경로를 포함합니다.

psql "sslmode=verify-full host=your_server_hostname dbname=your_db user=your_user \nsslrootcert=/path/to/your/root.crt sslcert=/path/to/your/client.crt sslkey=/path/to/your/client.key"

모범 사례 및 팁

  • verify-full sslmode 사용: 중간자 공격(Man-in-the-Middle attacks)을 방지하기 위해 클라이언트 측에서는 항상 verify-full을 사용하는 것을 목표로 하십시오.
  • 개인 키 보호: 개인 키(.key 파일)에 엄격한 파일 권한(예: chmod 600)이 설정되어 서버에서는 PostgreSQL 사용자만, 클라이언트에서는 연결하는 사용자만 읽을 수 있도록 하십시오.
  • 인증서 정기 갱신: 인증서에는 만료일이 있습니다. 연결 중단을 피하기 위해 만료 전에 갱신하는 프로세스를 구현하십시오.
  • 중앙 집중식 인증서 관리: 대규모 배포의 경우, 인증서 관리 시스템을 사용하거나 인증서 발급 및 갱신을 자동화하는 것을 고려하십시오.
  • 로그 모니터링: 시작 또는 연결 시도 중 SSL 관련 오류가 있는지 PostgreSQL 로그를 확인하십시오.
  • 문서 참조: PostgreSQL 버전별 최신 매개변수 및 고급 구성 옵션은 PostgreSQL 공식 문서를 참조하십시오.

결론

PostgreSQL 연결을 위해 SSL/TLS를 구성하는 것은 데이터베이스 인프라를 보호하는 데 중요한 단계입니다. 서버에서 SSL을 활성화하고, pg_hba.conf에서 ssl=require 또는 hostssl을 적용하며, 적절한 sslmode 설정(이상적으로는 verify-full)으로 클라이언트를 구성함으로써 네트워크를 통해 전송되는 데이터의 보안을 크게 강화할 수 있습니다. 클라이언트 인증서를 사용한 상호 인증을 구현하면 또 하나의 강력한 보안 계층이 추가됩니다. 초기 설정이 복잡해 보일 수 있지만, 데이터 보호 및 규정 준수의 장기적인 이점 덕분에 이는 모든 PostgreSQL 배포에 필수적인 실천 사항입니다.