이 글에서는 Let's Encrypt에서 제공하는 TLS/SSL 인증서를 사용하여 PostgreSQL 서버를 설정하는 방법을 설명합니다.
1.postgresql.conf 파일 준비하기
postgresql.conf의 파일은 git clone으로 진행하시면 하실 필요가 없습니다. (덮어 쓰기가 됩니다.)
전체 코드는 Github NavyStack/pgsql-docker에서 확인하실 수 있습니다.
docker run -i --rm postgres cat /usr/share/postgresql/postgresql.conf.sample > postgresql.conf
2.인증서 준비하기
2.1 클라우드플레어 API 키 준비하기 (해당하는 경우) (CF_Token)
클라우드플레어 API 키 발급 페이지로 이동하여 API키를 발급합니다.
brave_GhZ5pebzcC.png
brave_cIYflMqJrV.png
brave_57yMMR2Fns.png
그 후,
export CF_Token="<token>"
2.2 클라우드플레어 계정 ID 확인하기 (해당하는 경우) (CF_Account_ID)
클라우드플레어 대시보드에 접속하면 주소창 주소의 끝에 CF_Account_ID가 나옵니다.
brave_SttMF40E5R.png
그 후,
export CF_Account_ID="<id>"
acme.sh 를 통해서 발급 할 것이므로 ACME.SH를 설치합니다.
curl https://get.acme.sh | sh -s email=admin@askfront.com
Code_lmBJxxZnFO.png
source /home/$USER/.bashrc
acme.sh
Code_FDYDHBWebB.png
2.인증서 발급하기
acme.sh --issue --dns dns_cf -d heno.kr -d *.host.heno.kr --force --server letsencrypt
Code_a3LeenFhzQ.png
3. postgres 컨테이너 올리기
3.1. postgresql.conf 파일을 인증서의 경로 및 파일이름에 맞게 수정합니다.
기본적으로 전부 주석처리 되어있으므로 파일의 원하는 곳에 입력합니다.
ssl = on
ssl_cert_file = 'fullchain.cer'
ssl_key_file = 'heno.kr.key'
ssl_prefer_server_ciphers = on
3.2. pg_hba.conf 파일을 필요에 따라 수정합니다.
기본적으로 전부 주석처리 되어있으므로 파일의 원하는 곳에 입력합니다.
hostssl all all 0.0.0.0/0 md5
docker-compose.yml 파일을 적절하게 수정합니다.
services:
postgres:
container_name: postgres_container
image: postgres:16-bookworm
ports:
- 5432:5432
volumes:
- ./data:/var/lib/postgresql/data
- ./logs:/var/log/postgresql
- ./postgresql.conf:/var/lib/postgresql/data/postgresql.conf
# - ./pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf
- /home/ubuntu/.acme.sh/heno.kr_ecc/heno.kr.key:/var/lib/postgresql/data/heno.kr.key
- /home/ubuntu/.acme.sh/heno.kr_ecc/fullchain.cer:/var/lib/postgresql/data/fullchain.cer
- /var/lib/pgsql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_USER=postgres
- PGDATA=/var/lib/postgresql/data
- PGSSLMODE=require
docker compose up -d
4. Postgres 접속하기
dbeaver_0yAXG6P6T1.png
dbeaver_RJmqwM7fwO.png
dbeaver_xYTQCcXYX0.png
dbeaver_fpNKXKuw5R.png
아래의 SQL문을 실행해서 TLS로 연결중인지 확인합니다.
SELECT * from pg_catalog.pg_stat_ssl
PostgreSQL의 자체적인 접속을 포함해서 나오네요
조금 더 자세하게 보려면 아래의 SQL 문을 실행합니다.
SELECT ssl.pid, usename, datname, ssl, client_addr, backend_type, wait_event
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity a
WHERE ssl.pid = a.pid
dbeaver_Lv90LvALoZ.png