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을 활성화하는 튜토리얼이 마무리됩니다. 질문이 있으시면 아래 댓글로 남겨주세요.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.