Cách bật SSL cho kết nối PostgreSQL

theanh

Administrator
Nhân viên
Theo mặc định, tất cả các kết nối PostgreSQL đều không an toàn, điều này có thể gây ra các vấn đề về bảo mật khi chạy trong môi trường sản xuất có lưu lượng truy cập cao. Mã hóa SSL đảm bảo rằng bất kỳ dữ liệu nào được truyền đi đều không bị bất kỳ ai ở giữa kết nối chặn lại.

Hướng dẫn này sẽ hướng dẫn bạn cách bật SSL/TLS cho các kết nối PostgreSQL.

Điều kiện tiên quyết​


  • Máy chủ Linux. Đối với hướng dẫn của chúng tôi, chúng tôi đang chạy máy chủ Ubuntu 22.04.

  • Người dùng sudo không phải root.

  • Tên miền đủ điều kiện (FQDN) như postgresql.example.com.

  • Đảm bảo mọi thứ được cập nhật.
Mã:
$ sudo apt update
$ sudo apt upgrade
[*]
Một số gói mà hệ thống của bạn nhu cầu.
Mã:
$ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -y
Một số gói này có thể đã được cài đặt trên hệ thống của bạn.

Bước 1 - Cấu hình Tường lửa​

Trước khi cài đặt bất kỳ gói nào, bước đầu tiên là cấu hình tường lửa để mở các cổng cho HTTP, HTTPS và PostgreSQL.

Kiểm tra trạng thái của tường lửa.
Mã:
$ sudo ufw status
Bạn sẽ thấy nội dung tương tự như sau.
Mã:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Mở các cổng HTTP, HTTPS và PostgreSQL trong tường lửa.
Mã:
$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https
Kiểm tra lại trạng thái để xác nhận.
Mã:
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
5432 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
5432 (v6) ALLOW Anywhere (v6)

Bước 2 - Cài đặt PostgreSQL 14​

Ubuntu 22.04 được cài đặt sẵn PostgreSQL 14 theo mặc định. Để cài đặt, hãy đưa ra lệnh sau.
Mã:
$ sudo apt install postgresql postgresql-contrib
Gói postgresql-contrib chứa một số tiện ích bổ sung.

Bạn cũng có thể sử dụng kho lưu trữ APT chính thức của PostgreSQL để cài đặt. Chạy lệnh sau để thêm khóa GPG PostgreSQL.
Mã:
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
Thêm kho lưu trữ APT vào danh sách nguồn của bạn.
Mã:
$ 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'
Cập nhật hệ thống kho lưu trữ.
Mã:
$ sudo apt update
Bây giờ, bạn có thể cài đặt PostgreSQL bằng lệnh được đề cập ở trên.

Kiểm tra trạng thái của dịch vụ PostgreSQL.
Mã:
$ 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.
Bạn có thể thấy rằng dịch vụ được bật và chạy theo mặc định.

Đặt mật khẩu cho postgres tài khoản.
Mã:
$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '';"

Bước 3 - Cài đặt SSL​

Để cài đặt chứng chỉ SSL bằng Let's Encrypt, chúng ta cần tải xuống công cụ Certbot. Chúng ta sẽ sử dụng trình cài đặt gói Snapd cho việc đó. Ubuntu 22.04 được cài đặt sẵn Snap.

Đảm bảo rằng phiên bản Snapd của bạn được cập nhật.
Mã:
$ sudo snap install core
$ sudo snap refresh core
Cài đặt Certbot.
Mã:
$ sudo snap install --classic certbot
Sử dụng lệnh sau để đảm bảo rằng lệnh Certbot chạy bằng cách tạo liên kết tượng trưng đến /usr/bin thư mục.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Tạo SSL chứng chỉ.
Mã:
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d postgresql.example.com
Lệnh trên sẽ tải chứng chỉ xuống thư mục /etc/letsencrypt/live/postgresql.example.com trên máy chủ của bạn.

Tạo chứng chỉ nhóm Diffie-Hellman.
Mã:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Bước 4 - Cấu hình gia hạn Certbot cho PostgreSQL​

PostgreSQL không có quyền truy cập các chứng chỉ từ thư mục Let's Encrypt do đó chúng ta không thể yêu cầu nó sử dụng trực tiếp các chứng chỉ từ thư mục. Giải pháp thay thế là sao chép các chứng chỉ vào thư mục PostgreSQL nhưng cách này chỉ có tác dụng tạm thời vì chúng sẽ hết hạn và bạn sẽ phải sao chép lại thủ công.

Phương pháp tốt nhất là sử dụng hook gia hạn sẽ tự động chạy sau mỗi lần gia hạn và thực hiện các thao tác sao chép.

Tra cứu thư mục dữ liệu PostgreSQL.
Mã:
$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'
Tạo tệp hook gia hạn và mở tệp đó để chỉnh sửa.
Mã:
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh
Dán mã sau vào đó.
Mã:
#!/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
# only for SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tạo tệp có thể thực thi.
Mã:
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

Bước 5 - Cấu hình PostgreSQL​

Tìm đường dẫn đến tệp cấu hình PostgreSQL.
Mã:
$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'
Mở tệp để chỉnh sửa.
Mã:
$ sudo nano /etc/postgresql/15/main/postgresql.conf
Xác định vị trí phần Cài đặt kết nối và bỏ chú thích cho biến listen_address và thay đổi giá trị của nó thành . Đảm bảo rằng nó trông như sau.
Mã:
listen_address = '*'	# what IP address(es) to listen on;
Xác định vị trí phần SSL và chỉnh sửa tệp để khớp với các giá trị sau.
Mã:
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'
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bước 6 - Cấu hình kết nối PostgreSQL​

Mở tệp /etc/postgresql/15/main/pg_hba.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/postgresql/15/main/pg_hba.conf
Thêm dòng sau để bật SSL cho PostgreSQL.
Mã:
hostssl all all 0.0.0.0/0 scram-sha-256
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bước 7 - Gia hạn chứng chỉ​

Chạy lệnh sau để thực hiện gia hạn bắt buộc. Điều này sẽ kích hoạt tập lệnh triển khai sao chép các chứng chỉ vào đúng vị trí để PostgreSQL sử dụng.
Mã:
$ sudo certbot renew --force-renewal
Xác minh rằng các chứng chỉ đã được sao chép vào thư mục dữ liệu PostgreSQL.
Mã:
$ sudo ls /var/lib/postgresql/15/main/
Bạn sẽ thấy đầu ra sau đây hiển thị cho bạn chứng chỉ.
Mã:
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
Khởi động lại PostgreSQL để áp dụng các thay đổi.
Mã:
$ sudo systemctl restart postgresql

Bước 8 - Kiểm tra kết nối​

Kết nối với cơ sở dữ liệu từ máy khác bằng máy khách PostgreSQL đã cài đặt.
Mã:
$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres
Bạn sẽ thấy lời nhắc PostgreSQL sau. Chúng tôi đang sử dụng máy khách với máy khách PostgreSQL 14 do đó, bạn sẽ thấy cảnh báo về các phiên bản không tương thích.
Mã:
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=#
Điều này xác nhận kết nối SSL thành công.

Thoát khỏi shell.
Mã:
postgres=# \q
Nếu ứng dụng của bạn đang sử dụng chuỗi kết nối, hãy sử dụng chuỗi đó theo định dạng sau để kết nối SSL.
Mã:
postgres://user:[emailprotected]:5432/database_name?sslmode=require
Bạn có thể thay đổi chế độ SSL thành verify-full hoặc verify-ca nếu bạn có chứng chỉ gốc cho Let's encrypt trong /var/lib/postgresql/.postgresql vị trí trên phía máy khách.

Tạo /var/lib/postgresql/.postgresql thư mục.
Mã:
$ sudo mkdir -p /var/lib/postgresql/.postgresql
Chứng chỉ gốc Let's Encrypt là ISRG Root X1 nằm trên máy chủ tại vị trí /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt.

Sao chép chứng chỉ gốc vào /var/lib/postgresql/.postgresql thư mục.
Mã:
$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt
Kiểm tra kết nối bằng verify-full hoặc chế độ verify-ca và bạn sẽ thấy kết nối thành công.

Bước 9 - Kiểm tra Máy khách​

Đăng nhập vào shell PostgreSQL trên máy chủ.
Mã:
$ sudo -i -u postgres psql
Chạy lệnh SQL sau để kiểm tra các máy khách đã kết nối.
Mã:
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;
Bạn sẽ thấy một output.
Mã:
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)
Điều này xác nhận kết nối máy khách từ phía máy chủ.

Kết luận​

Điều này kết thúc hướng dẫn về cách bật SSL trên các kết nối PostgreSQL. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng trong phần bình luận bên dưới.
 
Back
Bên trên