PostgreSQL SSL với Letsencrypt

By | 18 March, 2020

Trong hướng dẫn này tôi sẽ giải thích cách cấu hình PostgreSQL với chứng chỉ SSL được cung cấp bởi Letsencrypt.

Cài đặt certbot

Làm theo hướng dẫn tại https://certbot.eff.org/

Tạo chứng chỉ cho miền của bạn

sudo certbot certonly --standalone -d example.com

Nếu bạn đã có webserver chạy trên máy chủ cơ sở dữ liệu của mình (nginx, apache …) thì hãy thay thế --standalone bằng --webroot hoặc một cái gì đó khác theo web server của bạn.

Xác minh chứng chỉ đã tạo

sudo certbot certificates

Tạo Renewal Hook

Tạo tập tin /etc/letsencrypt/renewal-hooks/deploy/postgresql.deploy

#!/bin/bash
umask 0177
export DOMAIN=example.com
export DATA_DIR=/var/lib/postgresql/
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
# only for SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key

Làm cho nó có thể thực thi:

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

Cấu hìnhpostgresql.conf

Tệp postgresql.conf thường nằm trong thư mục dữ liệu tại /etc/postgresql, nếu bạn không thể tìm thấy nó, hãy kiểm tra nó với psql: sudo -u postgres psql -U postgres -c ‘SHOW config_file’

Tìm phần SSL và thay đổi các dòng này:

# - SSL - ssl = on 
ssl_cert_file = '/var/lib/postgresql/server.crt' 
ssl_key_file = '/var/lib/postgresql/server.key' 
ssl_prefer_server_ciphers = on

Định cấu hình pg_hba.conf

Tệp pg_hba.conf nằm trong cùng thư mục postgresql.confvà chúng ta sẽ cần thêm dòng mới hostssl. Nếu bạn muốn cho phép tất cả các kết nối từ bên ngoài đến postgres phải dùng ssl thì config như sau:

hostssl    all    all    0.0.0.0/0    md5

Khởi động lại máy chủ PostgreSQL

# on Ubuntu and Debian:
service postgresql restart
# CentOS, Fedora and Red Hat
systemctl restart postgresql

Thử kết nối

psql -h example.com -U YOUR_USER

Và bạn sẽ thấy một cái gì đó như thế này:

SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)

* SSL compression thường bị vô hiệu hóa do sự cố CRIME trong SSL

Đảm bảo client đã sử dụng SSL

SELECT * from pg_catalog.pg_stat_ssl
danh sách các kết nối, bao gồm các kết nối hệ thống từ chính postgres

Để có được cái nhìn tốt hơn, chúng ta có thể kết hợp với pg_stat_activity

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
Cột sslchỉ ra rằng tất cả các máy khách bên ngoài sử dụng SSL

Nếu một số client vẫn không sử dụng SSL, hãy thử đặt tham số URL kết nối: sslmode=require hoặc biến môi trường PGSSLMODE=require

Leave a Reply

avatar
  Subscribe  
Notify of