Cài đặt và chuẩn bị môi trường Client PostgreSQL hỗ trợ PQC
Bước đầu tiên là đảm bảo máy trạm client đã cài đặt PostgreSQL client (psql) được biên dịch liên kết động với OpenSSL 3.2 đã cấu hình sẵn thuật toán Kyber trong phần trước.
Trên Ubuntu 24.04, chúng ta sẽ kiểm tra phiên bản và khả năng hỗ trợ PQC của thư viện OpenSSL hiện có trước khi thực thi lệnh connect.
Thực hiện lệnh kiểm tra các thuật toán KEM (Key Encapsulation Mechanism) được OpenSSL hiện hành hỗ trợ:
openssl list -keyex-algorithms | grep -i kyber
Kết quả mong đợi: Xuất hiện dòng chứa "Kyber512", "Kyber768" hoặc "Kyber1024". Nếu không thấy, client chưa liên kết đúng với OpenSSL PQC.
Cài đặt gói postgresql-client nếu chưa có, đảm bảo phiên bản client tương thích với server (ví dụ 16.x hoặc 17.x):
sudo apt update && sudo apt install -y postgresql-client libpq-dev
Kết quả mong đợi: Quá trình cài đặt hoàn tất, không báo lỗi về dependency.
Để chắc chắn psql sử dụng đúng thư viện OpenSSL PQC, kiểm tra thông tin runtime của client:
psql --version && ldd $(which psql) | grep libssl
Kết quả mong đợi: psql hiển thị phiên bản mới nhất và ldd chỉ ra đường dẫn đến thư viện libssl.so nằm trong thư mục custom (ví dụ /opt/openssl-pqc/lib) hoặc thư viện hệ thống đã được cập nhật ở Phần 2.
Cấu hình file kết nối yêu cầu thuật toán PQC
Để bắt buộc client sử dụng handshake TLS với thuật toán Kyber, ta không thể chỉ dựa vào kết nối mặc định. Cần cấu hình file kết nối hoặc biến môi trường để chỉ định Curve/Algorithm cụ thể.
Tạo file cấu hình kết nối client (pgpass.conf) tại thư mục home của user hiện tại. Lưu ý: file này thường dùng để lưu mật khẩu, nhưng trong ngữ cảnh PQC, chúng ta sẽ tạo một file cấu hình kết nối riêng biệt hoặc sử dụng connection string để ép buộc tham số.
Đầu tiên, tạo file cấu hình kết nối tùy chỉnh để yêu cầu TLS và chỉ định Cipher Suite chứa Kyber. Đặt file tại: ~/.postgresql/pgpass.conf (hoặc tạo file riêng ~/.postgresql/pqc-conn.conf).
Tuy nhiên, cơ chế chuẩn của PostgreSQL client để ép buộc thuật toán nằm ở tham số ssl_min_protocol và ssl_cipher trong connection string hoặc file pg_hba.conf (server side). Ở client side, ta dùng biến môi trường PGSSLCERT và PGSSLKEY, nhưng quan trọng nhất là chỉ định ssl_mode và ssl_curve (nếu driver hỗ trợ).
Vì OpenSSL 3.2+ tự động chọn KEM nếu server yêu cầu, ta cần cấu hình file libpq.conf (nếu có) hoặc dùng connection string rõ ràng. Dưới đây là cách cấu hình connection string trong file ~/.pgpass để lưu thông tin kết nối an toàn, và dùng lệnh trực tiếp để ép buộc.
Tạo file ~/.pgpass với nội dung sau (thay thế your_host, your_user, your_db):
your_host:5432:your_db:your_user:your_password
Kết quả mong đợi: File được tạo. Quyền truy cập phải là 600 để PostgreSQL chấp nhận:
chmod 600 ~/.pgpass
Để yêu cầu bắt buộc sử dụng TLS 1.3 với hỗ trợ PQC (Kyber), ta không thể chỉ định thuật toán Kyber trực tiếp trong connection string của libpq (vì libpq chưa có flag "ssl_curve=Kyber" tiêu chuẩn). Thay vào đó, ta cấu hình biến môi trường SSL_CIPHERSUITES của OpenSSL để client chỉ chấp nhận các suite hỗ trợ PQC.
Tạo file script shell wrapper để khởi động psql với các tham số bảo mật tối đa:
cat > ~/.pqc-psql
Kết quả mong đợi: Script ~/.pqc-psql được tạo và có quyền thực thi. File này sẽ set biến môi trường SSL_CIPHERSUITES trước khi gọi psql, đảm bảo client chỉ handshake với các suite tương thích.
Bổ sung file cấu hình OpenSSL cho client tại /etc/ssl/openssl-pqc.cnf để ép buộc sử dụng KEM Kyber:
cat > /etc/ssl/openssl-pqc.cnf
Kết quả mong đợi: File cấu hình OpenSSL cho client được tạo. Tham số kx = Kyber768 trong phần [system_default_sect] sẽ buộc OpenSSL client ưu tiên hoặc yêu cầu thuật toán trao đổi khóa này.
Xác minh Handshake TLS thành công với thuật toán Kyber
Sau khi cấu hình xong, bước quan trọng nhất là xác minh rằng handshake TLS thực sự đã diễn ra với thuật toán kháng lượng tử (PQC) thay vì các thuật toán cổ điển như ECDHE.
Sử dụng lệnh openssl s_client để mô phỏng handshake trực tiếp với server, bỏ qua libpq để kiểm tra thuần túy TLS layer:
openssl s_client -connect your_host:5432 -tls1_3 -cipher "TLS_AES_256_GCM_SHA384" -curves Kyber768 -msg
Kết quả mong đợi: Xuất hiện dòng Protocol : TLSv1.3 và quan trọng hơn là dòng Cipher : TLS_AES_256_GCM_SHA384. Nếu có log debug, sẽ thấy Selected Curve: Kyber768 hoặc Key Share: Kyber768.
Để kiểm tra thông qua client PostgreSQL (psql) với file cấu hình đã tạo ở trên:
export SSL_CONF_FILE="/etc/ssl/openssl-pqc.cnf"
export PGSSLCERT=~/.postgresql/client-cert.pem
export PGSSLKEY=~/.postgresql/client-key.pem
export PGSSLROOTCERT=~/.postgresql/root-cert.pem
~/.pqc-psql "your_host port=5432 dbname=your_db user=your_user" -c "SELECT pg_ssl_in_use();"
Kết quả mong đợi: Câu lệnh trả về giá trị t (true), chứng tỏ kết nối đã sử dụng SSL/TLS.
Để xác nhận cụ thể thuật toán Kyber đang được sử dụng trong phiên làm việc, ta cần xem log của server hoặc dùng tính năng pg_stat_ssl nếu server đã cấu hình logging chi tiết. Tuy nhiên, ở client side, cách chắc chắn nhất là dùng openssl s_client với chế độ -showcerts và phân tích Key Exchange.
openssl s_client -connect your_host:5432 -tls1_3 -msg -curves Kyber768 2>&1 | grep -A 5 "Server Key Exchange\|Key Share"
Kết quả mong đợi: Trong phần log handshake, bạn sẽ thấy tham số Key Share chứa id=0x307 (mã của X25519) kèm theo id=0x0052 (mã của Kyber768 trong draft PQC) hoặc tên Kyber768 rõ ràng. Nếu chỉ thấy ECDHE, nghĩa là PQC chưa được kích hoạt.
Xử lý trường hợp Client không hỗ trợ PQC (Fallback Mode)
Trong thực tế, không phải client nào cũng có OpenSSL 3.2 với PQC. Khi client cũ cố gắng kết nối vào server đã cấu hình bắt buộc PQC, kết nối sẽ bị từ chối (Connection refused). Cần thiết lập cơ chế fallback để duy trì tính khả dụng.
Cơ chế fallback hoạt động dựa trên cấu hình ssl_min_protocol và ssl_prefer_server_ciphers trên server (đã làm ở Phần 3). Tuy nhiên, ở client side, chúng ta cần đảm bảo script wrapper có thể tắt chế độ ép buộc PQC khi cần thiết.
Sửa script ~/.pqc-psql để thêm tham số --legacy hoặc biến môi trường để vô hiệu hóa yêu cầu Kyber:
cat > ~/.pqc-psql
Kết quả mong đợi: Script được cập nhật. Khi chạy ~/.pqc-psql --legacy, client sẽ bỏ qua các ràng buộc PQC và kết nối bằng TLS chuẩn (ECDHE), giúp các client cũ vẫn truy cập được server nếu server cho phép fallback.
Để kiểm tra fallback mode hoạt động:
~/.pqc-psql --legacy "your_host port=5432 dbname=your_db user=your_user" -c "SELECT pg_ssl_in_use();"
Kết quả mong đợi: Kết nối thành công, trả về t. Tuy nhiên, nếu server cấu hình ssl_ciphersuites chỉ cho phép PQC (không có fallback), kết nối này sẽ bị từ chối. Đây là hành vi mong đợi để bảo mật.
Để xử lý lỗi khi client không hỗ trợ PQC mà server lại bắt buộc, thông báo lỗi sẽ rõ ràng:
~/.pqc-psql "your_host port=5432 dbname=your_db user=your_user" 2>&1 | grep -i "handshake\|cipher\|protocol"
Kết quả mong đợi: Nếu client không hỗ trợ PQC và server không cho fallback, sẽ thấy lỗi no cipher match hoặc SSL handshake failed. Điều này xác nhận cơ chế bảo mật đang hoạt động đúng: từ chối các phiên bản không an toàn.
Để tối ưu hóa, ta nên cấu hình server (ở Phần 3) cho phép fallback chỉ cho các user cụ thể hoặc trong giai đoạn chuyển đổi, bằng cách thêm vào pg_hba.conf:
# Cho phép fallback cho user 'maintenance'
hostssl maintenance all 0.0.0.0/0 cert ssl_min_protocol=TLSv1.2
# Bắt buộc PQC cho user 'app_user'
hostssl app_user all 0.0.0.0/0 cert ssl_min_protocol=TLSv1.3
Kết quả mong đợi: Server sẽ chấp nhận kết nối TLSv1.2 (không PQC) cho user 'maintenance', nhưng bắt buộc TLSv1.3 (với PQC) cho user 'app_user'.
Đ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 3: Tích hợp PQC vào PostgreSQL thông qua GUC và extension
Phần 5: Mã hóa dữ liệu tại chỗ (Encryption at Rest) sử dụng PQC »