PostgreSQL · 5 min read · Dec 21, 2025

PostgreSQL 연결을 위한 SSL 활성화 방법

기본적으로 모든 PostgreSQL 연결은 안전하지 않으며, 이는 트래픽이 많은 프로덕션 환경에서 보안 문제를 일으킬 수 있습니다. SSL 암호화는 전송되는 데이터가 연결 중간에 누군가에 의해 가로채지지 않도록 보장합니다.

이 튜토리얼에서는 PostgreSQL 연결을 위한 SSL/TLS를 활성화하는 방법을 배웁니다.

전제 조건

  • 리눅스 서버. 본 튜토리얼에서는 Ubuntu 22.04 서버를 사용합니다.
  • 비루트 sudo 사용자.
  • postgresql.example.com과 같은 완전한 도메인 이름(FQDN).
  • 모든 것이 업데이트되었는지 확인합니다. $ sudo apt update $ sudo apt upgrade
  • 시스템에 필요한 몇 가지 패키지. $ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -y 이러한 패키지 중 일부는 이미 시스템에 설치되어 있을 수 있습니다.

1단계 - 방화벽 구성

패키지를 설치하기 전에 첫 번째 단계는 HTTP, HTTPS 및 PostgreSQL을 위한 포트를 열기 위해 방화벽을 구성하는 것입니다.

방화벽 상태를 확인합니다.

$ sudo ufw status

다음과 유사한 내용을 볼 수 있어야 합니다.

상태: 활성

대상                         동작      출처
--                         ------      ----
OpenSSH                    허용       어디서나
OpenSSH (v6)               허용       어디서나 (v6)

방화벽에서 HTTP, HTTPS 및 PostgreSQL 포트를 엽니다.

$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https

확인을 위해 상태를 다시 확인합니다.

$ sudo ufw status
상태: 활성

대상                         동작      출처
--                         ------      ----
OpenSSH                    허용       어디서나                  
80/tcp                     허용       어디서나                  
443                        허용       어디서나                  
5432                       허용       어디서나                  
OpenSSH (v6)               허용       어디서나 (v6)             
80/tcp (v6)                허용       어디서나 (v6)             
443 (v6)                   허용       어디서나 (v6)
5432 (v6)                  허용       어디서나 (v6)              

2단계 - PostgreSQL 14 설치

Ubuntu 22.04는 기본적으로 PostgreSQL 14를 제공합니다. 설치하려면 다음 명령을 실행합니다.

$ sudo apt install postgresql postgresql-contrib

postgresql-contrib 패키지는 몇 가지 추가 유틸리티를 포함합니다.

PostgreSQL의 공식 APT 리포지토리를 사용하여 설치할 수도 있습니다. PostgreSQL GPG 키를 추가하려면 다음 명령을 실행합니다.

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

APT 리포지토리를 소스 목록에 추가합니다.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

시스템 리포지토리를 업데이트합니다.

$ sudo apt update

이제 위에서 언급한 명령을 사용하여 PostgreSQL을 설치할 수 있습니다.

PostgreSQL 서비스의 상태를 확인합니다.

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-12-12 00:01:06 UTC; 19s ago
   Main PID: 3497 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Dec 12 00:01:06 postgresql systemd[1]: Starting PostgreSQL RDBMS...
Dec 12 00:01:06 postgresql systemd[1]: Finished PostgreSQL RDBMS.

서비스가 기본적으로 활성화되고 실행 중임을 확인할 수 있습니다.

postgres 계정의 비밀번호를 설정합니다.

$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '';"

3단계 - SSL 설치

Let’s Encrypt를 사용하여 SSL 인증서를 설치하려면 Certbot 도구를 다운로드해야 합니다. 이를 위해 Snapd 패키지 설치 관리자를 사용할 것입니다. Ubuntu 22.04는 Snap이 미리 설치되어 있습니다.

Snapd 버전이 최신인지 확인합니다.

$ sudo snap install core 
$ sudo snap refresh core

Certbot을 설치합니다.

$ sudo snap install --classic certbot

Certbot 명령이 /usr/bin 디렉토리에 대한 심볼릭 링크를 생성하여 실행되도록 하려면 다음 명령을 사용합니다.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

SSL 인증서를 생성합니다.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d postgresql.example.com

위 명령은 서버의 /etc/letsencrypt/live/postgresql.example.com 디렉토리에 인증서를 다운로드합니다.

Diffie-Hellman 그룹 인증서를 생성합니다.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

4단계 - PostgreSQL을 위한 Certbot 갱신 구성

PostgreSQL은 Let’s Encrypt 폴더의 인증서에 접근할 수 있는 권한이 없으므로 인증서를 폴더에서 직접 사용하도록 지시할 수 없습니다. 대안은 인증서를 PostgreSQL 디렉토리로 복사하는 것이지만, 이는 일시적으로만 작동하며 만료되면 다시 수동으로 복사해야 합니다.

가장 좋은 방법은 갱신 시 자동으로 실행되고 복사 작업을 수행하는 갱신 후크를 사용하는 것입니다.

PostgreSQL 데이터 디렉토리를 확인합니다.

$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'

갱신 후크 파일을 생성하고 편집을 위해 엽니다.

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

다음 코드를 붙여넣습니다.

#!/bin/bash
umask 0177
DOMAIN=postgresql.example.com
DATA_DIR=/var/lib/postgresql/15/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key
# SELinux 전용 - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key

Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 나타나면 Y를 입력합니다.

파일을 실행 가능하게 만듭니다.

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

5단계 - PostgreSQL 구성

PostgreSQL 구성 파일의 경로를 찾습니다.

$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'

파일을 편집을 위해 엽니다.

$ sudo nano /etc/postgresql/15/main/postgresql.conf

연결 설정 섹션을 찾아 listen_address 변수를 주석 해제하고 값을 *로 변경합니다. 다음과 같이 보이도록 합니다.

listen_address = '*'        # 어떤 IP 주소(es)에서 수신할지;

SSL 섹션을 찾아 파일을 다음 값으로 수정합니다.

ssl = on  
ssl_cert_file = 'server.crt'  
ssl_key_file = 'server.key'  
ssl_prefer_server_ciphers = on
ssl_dh_params_file = '/etc/ssl/certs/dhparam.pem'

Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 나타나면 Y를 입력합니다.

6단계 - PostgreSQL 연결 구성

/etc/postgresql/15/main/pg_hba.conf 파일을 편집을 위해 엽니다.

$ sudo nano /etc/postgresql/15/main/pg_hba.conf

PostgreSQL에 대한 SSL을 활성화하기 위해 다음 줄을 추가합니다.

hostssl all  all  0.0.0.0/0  scram-sha-256

Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 나타나면 Y를 입력합니다.

7단계 - 인증서 갱신

다음 명령을 실행하여 강제 갱신을 수행합니다. 이는 인증서를 PostgreSQL이 사용할 수 있는 올바른 위치로 복사하는 배포 스크립트를 트리거합니다.

$ sudo certbot renew --force-renewal

인증서가 PostgreSQL 데이터 디렉토리에 복사되었는지 확인합니다.

$ sudo ls /var/lib/postgresql/15/main/

다음과 같은 출력이 표시되어 인증서를 보여줍니다.

base          pg_dynshmem   pg_notify    pg_snapshots  pg_subtrans  PG_VERSION  postgresql.auto.conf  server.crt
global        pg_logical    pg_replslot  pg_stat       pg_tblspc    pg_wal      postmaster.opts       server.key
pg_commit_ts  pg_multixact  pg_serial    pg_stat_tmp   pg_twophase  pg_xact     postmaster.pid

변경 사항을 적용하기 위해 PostgreSQL을 재시작합니다.

$ sudo systemctl restart postgresql

8단계 - 연결 테스트

PostgreSQL 클라이언트가 설치된 다른 머신에서 데이터베이스에 연결합니다.

$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres

다음과 같은 PostgreSQL 프롬프트가 표시되어야 합니다. PostgreSQL 14 클라이언트를 사용하고 있으므로 호환되지 않는 버전에 대한 경고가 표시됩니다.

Password for user postgres:
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), server 15.1 (Ubuntu 15.1-1.pgdg22.04+1))
WARNING: psql major version 14, server major version 15.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

이것은 SSL 연결이 성공적으로 이루어졌음을 확인합니다.

셸을 종료합니다.

postgres=# \q

앱이 연결 문자열을 사용하는 경우 SSL 연결을 위해 다음 형식으로 사용합니다.

postgres://user:[email protected]:5432/database_name?sslmode=require

클라이언트 측의 /var/lib/postgresql/.postgresql 위치에 Let’s Encrypt의 루트 인증서가 있는 경우 SSL 모드를 verify-full 또는 verify-ca로 변경할 수 있습니다.

/var/lib/postgresql/.postgresql 디렉토리를 생성합니다.

$ sudo mkdir -p /var/lib/postgresql/.postgresql

Let’s Encrypt 루트 인증서는 ISRG Root X1로, 서버의 /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt 위치에 있습니다.

루트 인증서를 /var/lib/postgresql/.postgresql 디렉토리로 복사합니다.

$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt

verify-full 또는 verify-ca 모드로 연결을 테스트하면 성공적인 연결을 확인할 수 있습니다.

9단계 - 클라이언트 확인

서버에서 PostgreSQL 셸에 로그인합니다.

$ sudo -i -u postgres psql

연결된 클라이언트를 확인하기 위해 다음 SQL 명령을 실행합니다.

SELECT ssl.pid, usename, datname, ssl, ssl.version, ssl.cipher, ssl.bits, client_addr
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity activity
WHERE ssl.pid = activity.pid;

유사한 출력을 볼 수 있어야 합니다.

 pid  | usename  | datname  | ssl | version |         cipher         | bits |  client_addr
------+----------+----------+-----+---------+------------------------+------+----------------
 5126 | postgres | postgres | t   | TLSv1.3 | TLS_AES_256_GCM_SHA384 |  256 | 122.161.84.220
 5154 | postgres | postgres | f   |         |                        |      |
(2 rows)

이는 서버 측에서 클라이언트 연결을 확인합니다.

결론

이로써 PostgreSQL 연결에서 SSL을 활성화하는 튜토리얼이 마무리됩니다. 질문이 있으시면 아래 댓글로 남겨주세요.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.