Sử dụng SSL (Secure Sockets Layer) để bảo mật kết nối với PostgreSQL là một cách phổ biến để bảo vệ dữ liệu khỏi các cuộc tấn công và đánh cắp thông tin khi truyền tải giữa máy khách (client) và máy chủ (server). Dưới đây là hướng dẫn chi tiết về cách cấu hình và sử dụng SSL để bảo mật kết nối với PostgreSQL.

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

  1. PostgreSQL đã cài đặt: Phiên bản PostgreSQL cần hỗ trợ SSL (hầu hết các phiên bản đều hỗ trợ sẵn).
  2. Chứng chỉ SSL: Bạn cần tạo hoặc có sẵn các chứng chỉ SSL bao gồm:
    • CA (Certificate Authority): Chứng thực cho máy chủ và máy khách.
    • Chứng chỉ của máy chủ: Được cấp bởi CA để xác minh máy chủ PostgreSQL.
    • Chứng chỉ của máy khách (tùy chọn): Dùng để xác minh máy khách, nếu cần.
  3. Cấu hình cho cả máy chủ PostgreSQL và máy khách.

II. Bước 1: Cấu hình SSL trên máy chủ PostgreSQL

2.1. Tạo chứng chỉ SSL cho máy chủ

Nếu chưa có chứng chỉ SSL, bạn có thể tạo một chứng chỉ tự ký (self-signed) hoặc sử dụng chứng chỉ từ một CA (Certificate Authority) đáng tin cậy.

  • Tạo chứng chỉ tự ký bằng OpenSSL:
openssl req -new -text -out server.req
openssl rsa -in privkey.pem -out server.key
openssl req -x509 -in server.req -text -key server.key -out server.crt
  • Giải thích các tệp:
    • server.key: Khóa riêng của máy chủ.
    • server.crt: Chứng chỉ của máy chủ.
    • server.req: Yêu cầu chứng chỉ.

Lưu ý: Đảm bảo tệp server.key có quyền truy cập đúng, chỉ cho phép người dùng PostgreSQL truy cập.

chmod 600 server.key

2.2. Cấu hình PostgreSQL để sử dụng SSL

  • Sao chép các chứng chỉ vào thư mục dữ liệu PostgreSQL (thường là /var/lib/postgresql/data hoặc /var/lib/pgsql/data).
  • Mở tệp cấu hình PostgreSQL (postgresql.conf) và tìm các dòng sau:
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
  • Giải thích:
    • ssl = on: Kích hoạt SSL.
    • ssl_cert_file: Đường dẫn đến chứng chỉ của máy chủ.
    • ssl_key_file: Đường dẫn đến khóa riêng của máy chủ.

2.3. Cấu hình kiểm tra chứng chỉ khách (tùy chọn)

Nếu bạn muốn yêu cầu chứng chỉ từ máy khách, thêm cấu hình sau:

ssl_ca_file = 'root.crt'
  • Giải thích: root.crt là chứng chỉ của CA được dùng để xác thực các chứng chỉ máy khách.

2.4. Cập nhật tệp pg_hba.conf

Tệp pg_hba.conf điều khiển cách PostgreSQL xác thực các kết nối từ xa. Bạn cần chỉnh sửa tệp này để cho phép kết nối qua SSL.

  • Mở tệp pg_hba.conf và thêm dòng sau:
hostssl all all 0.0.0.0/0 cert clientcert=1
  • Giải thích:
    • hostssl: Chỉ cho phép kết nối qua SSL.
    • all all 0.0.0.0/0: Cho phép tất cả người dùng kết nối từ tất cả các địa chỉ IP.
    • cert: Sử dụng chứng chỉ để xác thực.
    • clientcert=1: Yêu cầu chứng chỉ từ máy khách.

2.5. Khởi động lại PostgreSQL

Sau khi chỉnh sửa cấu hình, khởi động lại dịch vụ PostgreSQL để áp dụng các thay đổi:

sudo systemctl restart postgresql

III. Bước 2: Cấu hình máy khách để sử dụng SSL

3.1. Cài đặt chứng chỉ SSL trên máy khách

  • Máy khách cần có chứng chỉ CA của máy chủ (tệp root.crt) và chứng chỉ riêng (nếu yêu cầu xác thực máy khách).
  • Sao chép tệp root.crt vào thư mục ~/.postgresql/ của người dùng máy khách.
cp root.crt ~/.postgresql/
chmod 600 ~/.postgresql/root.crt

3.2. Sử dụng SSL để kết nối từ máy khách

Để kết nối đến PostgreSQL qua SSL, bạn có thể sử dụng psql hoặc bất kỳ ứng dụng máy khách PostgreSQL nào.

  • Sử dụng psql với SSL:
psql "host=mydbserver.com dbname=mydb user=myuser sslmode=require"
  • Giải thích các tham số SSL:
    • sslmode=require: Yêu cầu kết nối qua SSL.
    • Các chế độ SSL khác:
      • disable: Không sử dụng SSL.
      • allow: Cho phép SSL nếu máy chủ hỗ trợ.
      • prefer: Ưu tiên SSL nhưng không bắt buộc.
      • require: Bắt buộc sử dụng SSL.
      • verify-ca: SSL yêu cầu và kiểm tra chứng chỉ CA.
      • verify-full: SSL yêu cầu và kiểm tra chứng chỉ CA, đồng thời xác minh tên máy chủ (hostname).

3.3. Kiểm tra kết nối SSL

Sau khi kết nối qua SSL, bạn có thể kiểm tra xem kết nối có thực sự được bảo mật không bằng cách sử dụng lệnh sau trong psql:

SELECT ssl_is_used();
  • Kết quả trả về t (true) nghĩa là kết nối đang sử dụng SSL.

IV. Lưu ý về bảo mật

  1. Bảo vệ khóa riêng: Khóa riêng (server.key) của máy chủ phải được bảo vệ cẩn thận. Chỉ người dùng PostgreSQL mới có quyền truy cập.
  2. Kiểm tra chứng chỉ: Nếu bạn cần bảo mật cao, nên sử dụng sslmode=verify-full để đảm bảo máy khách kiểm tra đầy đủ chứng chỉ máy chủ và xác minh tên miền.
  3. Cập nhật chứng chỉ: Chứng chỉ SSL có thể hết hạn, vì vậy cần theo dõi và thay thế chứng chỉ khi cần.

V. Tổng kết

Việc cấu hình SSL cho PostgreSQL giúp bảo mật các kết nối giữa máy khách và máy chủ, ngăn chặn các cuộc tấn công như đánh cắp thông tin hoặc tấn công “man-in-the-middle”. Bằng cách sử dụng SSL, bạn có thể mã hóa dữ liệu và đảm bảo rằng thông tin được truyền tải an toàn. Quá trình này bao gồm việc tạo và quản lý các chứng chỉ, điều chỉnh cấu hình máy chủ và máy khách để kích hoạt SSL, cũng như kiểm tra và duy trì bảo mật dữ liệu.