Cấu hình PostgreSQL sử dụng OpenSSL PQC thông qua GUC
Trước khi tích hợp các thuật toán kháng lượng tử (PQC) vào PostgreSQL, ta cần khai báo thư viện OpenSSL 3.2 đã được biên dịch với các module PQC (như ML-KEM, ML-DSA) trong file cấu hình chính.
Bạn cần chỉnh sửa file /etc/postgresql/16/main/postgresql.conf để chỉ định đường dẫn đến thư viện OpenSSL PQC và thiết lập các tham số GUC (Grand Unified Configuration) liên quan đến SSL.
Mở file cấu hình bằng trình soạn thảo văn bản và thêm các dòng sau vào cuối file:
ssl = on
ssl_cert_file = '/etc/ssl/certs/postgres-pqc-cert.pem'
ssl_key_file = '/etc/ssl/private/postgres-pqc-key.pem'
ssl_ca_file = '/etc/ssl/certs/postgres-ca.pem'
ssl_ciphers = 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ML-KEM-768-ML-DSA-67'
ssl_min_protocol_version = 'TLSv1.3'
ssl_prefer_server_ciphers = on
Kết quả mong đợi: PostgreSQL sẽ bắt buộc sử dụng TLS 1.3 và ưu tiên các cipher suite chứa thuật toán PQC (ML-KEM/ML-DSA) khi thực hiện bắt tay TLS, đồng thời chỉ định đúng đường dẫn cho chứng chỉ và key đã tạo trong phần tiếp theo.
Tạo chứng chỉ số và Key PQC cho Server PostgreSQL
Để PostgreSQL hoạt động với các thuật toán PQC, bạn cần tự tạo một cặp chứng chỉ (Certificate) và khóa riêng tư (Private Key) sử dụng thuật toán hybrid hoặc thuần PQC. Trong bước này, ta sẽ tạo Key dùng thuật toán ML-DSA-67 (dựa trên FIPS 203) và chứng chỉ dùng ML-KEM-768.
Đầu tiên, tạo thư mục chứa chứng chỉ và key nếu chưa tồn tại:
mkdir -p /etc/ssl/private
chmod 700 /etc/ssl/private
Kết quả mong đợi: Thư mục được tạo với quyền truy cập hạn chế (chỉ root có quyền), đảm bảo an toàn cho khóa riêng tư.
Tiếp theo, tạo khóa riêng tư sử dụng thuật toán ML-DSA-67 (tương đương với ký thuật toán số PQC):
openssl genpkey -algorithm ML-DSA-67 -out /etc/ssl/private/postgres-pqc-key.pem
Kết quả mong đợi: File postgres-pqc-key.pem được tạo ra chứa khóa riêng tư PQC.
Sau đó, tạo file yêu cầu chứng chỉ (CSR) từ khóa vừa tạo:
openssl req -new -key /etc/ssl/private/postgres-pqc-key.pem -out /etc/ssl/certs/postgres-pqc.csr -subj "/CN=localhost/O=PostgresPQC/C=VN"
Kết quả mong đợi: File postgres-pqc.csr được tạo chứa thông tin yêu cầu ký chứng chỉ.
Cuối cùng, tự ký (self-sign) chứng chỉ này sử dụng thuật toán ML-KEM-768 (dùng cho mã hóa khóa công khai trong TLS handshake) để tạo chứng chỉ server cuối cùng:
openssl x509 -req -days 365 -in /etc/ssl/certs/postgres-pqc.csr -signkey /etc/ssl/private/postgres-pqc-key.pem -out /etc/ssl/certs/postgres-pqc-cert.pem -set_serial 01 -pubkeyopt ml-kem-768
Kết quả mong đợi: File postgres-pqc-cert.pem được tạo thành công, chứa chứng chỉ mã hóa PQC tương thích với cấu hình GUC đã thiết lập ở phần trước.
Để kiểm tra xem chứng chỉ đã bao gồm các thuật toán PQC chưa, chạy lệnh:
openssl x509 -in /etc/ssl/certs/postgres-pqc-cert.pem -text -noout | grep -A 5 "Public Key Algorithm"
Kết quả mong đợi: Đầu ra hiển thị Public Key Algorithm: ML-KEM-768 hoặc tương đương, xác nhận chứng chỉ đã sử dụng thuật toán kháng lượng tử.
Cài đặt và kích hoạt extension 'pgcrypto' hỗ trợ PQC
Mặc dù PostgreSQL không có extension PQC riêng biệt, extension pgcrypto phiên bản mới (tích hợp vào Postgres 15+) có thể tương tác với các hàm mã hóa dựa trên OpenSSL. Ta cần đảm bảo extension này được kích hoạt để hỗ trợ các hàm mã hóa/hashed sử dụng backend OpenSSL PQC.
Kết nối vào database postgres bằng quyền superuser để thực thi lệnh tạo extension:
sudo -u postgres psql -c "CREATE EXTENSION IF NOT EXISTS pgcrypto;"
Kết quả mong đợi: Hệ thống trả về thông báo CREATE EXTENSION, xác nhận extension đã được cài đặt thành công.
Để kiểm tra xem phiên bản pgcrypto có hỗ trợ các hàm tương thích với OpenSSL 3.2 hay không, chạy lệnh:
sudo -u postgres psql -c "SELECT * FROM pg_available_extensions WHERE name = 'pgcrypto';"
Kết quả mong đợi: Hiển thị thông tin extension với phiên bản tương thích (thường là 1.4 trở lên cho Postgres 15+).
Thử nghiệm sử dụng hàm pgp_sym_encrypt (sử dụng backend OpenSSL) để đảm bảo môi trường đã sẵn sàng cho các thao tác mã hóa dữ liệu PQC ở phần sau:
sudo -u postgres psql -c "SELECT pgp_sym_encrypt('Test PQC Data', 'secret_key');" | head -c 50
Kết quả mong đợi: Trả về một chuỗi mã hóa bắt đầu bằng pgp..., xác nhận engine mã hóa đang hoạt động bình thường.
Cấu hình pg_hba.conf để yêu cầu TLS 1.3 và Cipher Suite PQC
File pg_hba.conf quyết định ai được kết nối và bằng cách nào. Để bắt buộc client sử dụng kết nối an toàn với PQC, ta cần thay đổi phương thức xác thực từ md5 hoặc scram-sha-256 sang cert hoặc scram-sha-256 kèm theo tham số ssl.
Chỉnh sửa file /etc/postgresql/16/main/pg_hba.conf. Xóa hoặc comment các dòng mặc định không yêu cầu SSL, và thêm các dòng cấu hình mới như sau:
# TYPE DATABASE USER ADDRESS METHOD
# Local connections (loopback) require SSL and certificate verification
local all all peer
# IPv4 connections require SSL (TLS 1.3) and client certificate
hostssl all all 0.0.0.0/0 cert
# IPv6 connections require SSL (TLS 1.3) and client certificate
hostssl all all ::/0 cert
Kết quả mong đợi: Mọi kết nối từ mạng (IPv4/IPv6) đều bắt buộc phải sử dụng SSL (được ký hiệu bởi hostssl) và xác thực bằng chứng chỉ client. Các kết nối không có SSL sẽ bị từ chối ngay tại cổng kết nối.
Để áp dụng thay đổi cấu hình mà không cần restart toàn bộ dịch vụ PostgreSQL, gửi tín hiệu reload:
sudo systemctl reload postgresql
Kết quả mong đợi: Dịch vụ PostgreSQL chạy lại cấu hình, không xảy ra lỗi khởi động.
Để verify kết quả cuối cùng, thử kết nối từ client với tham số sslmode=require và kiểm tra handshake TLS:
PGPASSWORD=your_password psql "host=localhost port=5432 dbname=postgres user=postgres sslmode=require" -c "SELECT ssl_is_used();"
Kết quả mong đợi: Lệnh trả về giá trị t (true), xác nhận kết nối đang sử dụng SSL. Nếu bạn cố gắng kết nối mà không có SSL, kết nối sẽ bị từ chối với thông báo no pg_hba.conf entry for host....
Điều hướng series:
Mục lục: Series: Triển khai Database Quantum-safe với Postgres và Ubuntu 24.04
« Phần 2: Cấu hình OpenSSL 3.2 cho các thuật toán kháng lượng tử (PQC)
Phần 4: Cấu hình kết nối bảo mật TLS với PQC cho Client »