PostgreSQL SSL with Letsencrypt (PostgreSQL Letsencrypt TLS 연결)
-
이 글에서는 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키를 발급합니다.
그 후,
export CF_Token="<token>"
2.2 클라우드플레어 계정 ID 확인하기 (해당하는 경우) (
CF_Account_ID
)클라우드플레어 대시보드에 접속하면 주소창 주소의 끝에
CF_Account_ID
가 나옵니다.
그 후,export CF_Account_ID="<id>"
acme.sh
를 통해서 발급 할 것이므로 ACME.SH를 설치합니다.curl https://get.acme.sh | sh -s email=admin@askfront.com
source /home/$USER/.bashrc
acme.sh
2.인증서 발급하기
acme.sh --issue --dns dns_cf -d heno.kr -d *.host.heno.kr --force --server letsencrypt
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 접속하기
아래의 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