Thiết lập SSL cho PostgreSQL giúp mã hóa dữ liệu khi truyền qua mạng giữa client và server, tăng cường tính bảo mật. Dưới đây là các bước chi tiết để cấu hình SSL cho PostgreSQL.

1. Tạo Chứng Chỉ SSL

Trước tiên, bạn cần tạo chứng chỉ SSL cho máy chủ PostgreSQL. Điều này có thể thực hiện bằng cách sử dụng OpenSSL.

a. Tạo khóa riêng và chứng chỉ cho server

Mở terminal và chạy các lệnh sau để tạo khóa riêng (server.key) và chứng chỉ tự ký (server.crt):

# Tạo khóa riêng (private key)
openssl genrsa -des3 -out server.key 2048

# Tạo chứng chỉ yêu cầu (Certificate Signing Request - CSR)
openssl req -new -key server.key -out server.csr

# Xóa mật khẩu khỏi khóa để PostgreSQL có thể khởi động mà không cần mật khẩu
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

# Tạo chứng chỉ tự ký có hiệu lực trong 365 ngày
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

b. Đặt quyền cho các tệp chứng chỉ

Đảm bảo rằng chỉ có người dùng PostgreSQL có quyền truy cập vào các tệp này:

chmod 600 server.key
chmod 600 server.crt

c. Di chuyển chứng chỉ vào thư mục cấu hình PostgreSQL

Di chuyển server.crtserver.key vào thư mục cấu hình PostgreSQL. Thông thường, đó là thư mục /var/lib/postgresql/data hoặc /etc/postgresql/<version>/main/ trên hệ điều hành Linux.

sudo mv server.crt /var/lib/postgresql/data/
sudo mv server.key /var/lib/postgresql/data/

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

a. Chỉnh sửa tệp postgresql.conf

Mở tệp cấu hình PostgreSQL và bật SSL:

ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'

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

Tệp pg_hba.conf điều khiển các phương thức xác thực cho các kết nối đến PostgreSQL. Cập nhật tệp này để bắt buộc sử dụng SSL cho các kết nối:

# Sử dụng SSL cho kết nối từ xa
hostssl all all 0.0.0.0/0 md5
hostssl all all ::/0 md5

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

Sau khi cấu hình xong, khởi động lại PostgreSQL để các thay đổi có hiệu lực:

sudo systemctl restart postgresql

4. Kiểm tra kết nối SSL từ client

a. Kiểm tra từ psql (PostgreSQL client)

Để kiểm tra liệu kết nối có sử dụng SSL hay không, bạn có thể sử dụng lệnh psql:

psql "sslmode=require host= dbname= user= password="

Khi kết nối thành công, bạn có thể chạy lệnh sau trong psql để kiểm tra trạng thái SSL:

SHOW ssl;

Nếu SSL được bật, PostgreSQL sẽ trả về kết quả:

ssl
-----
on

b. Cấu hình SSL cho các ứng dụng

Khi kết nối từ các ứng dụng (như Python, Node.js), bạn cần chắc chắn rằng tùy chọn sslmode=require được đặt trong chuỗi kết nối.

Ví dụ, với Python sử dụng thư viện psycopg2:

import psycopg2

conn = psycopg2.connect(
    dbname="mydb", user="myuser", password="mypassword", host="myhost", sslmode="require"
)

Với Node.js sử dụng module pg:

const { Pool } = require('pg');
const pool = new Pool({
  user: 'myuser',
  host: 'myhost',
  database: 'mydb',
  password: 'mypassword',
  port: 5432,
  ssl: {
    rejectUnauthorized: false
  }
});

Với các bước trên, bạn sẽ thiết lập thành công SSL cho PostgreSQL, đảm bảo dữ liệu truyền giữa client và server được mã hóa, bảo mật hơn khi hoạt động trên các mạng không tin cậy.