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.
[*]
Một số gói mà hệ thống của bạn nhu cầu.
Một số gói này có thể đã được cài đặt trên hệ thống của bạn.
Kiểm tra trạng thái của tường lửa.
Bạn sẽ thấy nội dung tương tự như sau.
Mở các cổng HTTP, HTTPS và PostgreSQL trong tường lửa.
Kiểm tra lại trạng thái để xác nhận.
Gói
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.
Thêm kho lưu trữ APT vào danh sách nguồn của bạn.
Cập nhật hệ thống kho lưu trữ.
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.
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
Đảm bảo rằng phiên bản Snapd của bạn được cập nhật.
Cài đặt 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
Tạo SSL chứng chỉ.
Lệnh trên sẽ tải chứng chỉ xuống thư mục
Tạo chứng chỉ nhóm Diffie-Hellman.
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.
Tạo tệp hook gia hạn và mở tệp đó để chỉnh sửa.
Dán mã sau vào đó.
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ở tệp để chỉnh sửa.
Xác định vị trí phần Cài đặt kết nối và bỏ chú thích cho biến
Xác định vị trí phần SSL và chỉnh sửa tệp để khớp với các giá trị sau.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Thêm dòng sau để bật SSL cho PostgreSQL.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Xác minh rằng các chứng chỉ đã được sao chép vào thư mục dữ liệu PostgreSQL.
Bạn sẽ thấy đầu ra sau đây hiển thị cho bạn chứng chỉ.
Khởi động lại PostgreSQL để áp dụng các thay đổi.
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.
Điều này xác nhận kết nối SSL thành công.
Thoát khỏi shell.
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.
Bạn có thể thay đổi chế độ SSL thành
Tạo
Chứng chỉ gốc Let's Encrypt là ISRG Root X1 nằm trên máy chủ tại vị trí
Sao chép chứng chỉ gốc vào
Kiểm tra kết nối bằng
Chạy lệnh SQL sau để kiểm tra các máy khách đã kết nối.
Bạn sẽ thấy một output.
Điều này xác nhận kết nối máy khách từ phía máy chủ.
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
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
Mã:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Mã:
$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https
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
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
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'
Mã:
$ sudo apt update
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.
Đặ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
Mã:
$ sudo snap install --classic certbot
/usr/bin
thư mục.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Mã:
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d postgresql.example.com
/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'
Mã:
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh
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
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ã:
$ sudo nano /etc/postgresql/15/main/postgresql.conf
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;
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'
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
Mã:
hostssl all all 0.0.0.0/0 scram-sha-256
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
Mã:
$ sudo ls /var/lib/postgresql/15/main/
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
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
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=#
Thoát khỏi shell.
Mã:
postgres=# \q
Mã:
postgres://user:[emailprotected]:5432/database_name?sslmode=require
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
/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
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
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;
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)