Quản trị bảo mật PostgreSQL phụ thuộc chủ yếu vào hai tập tin cấu hình then chốt: pg_hba.conf để kiểm soát cách thức xác thực kết nối và postgresql.conf để thiết lập các tham số toàn cục liên quan đến mã hóa, mạng và SSL. Dưới đây là hướng dẫn triển khai chi tiết, được tái cấu trúc nhằm tối ưu tính an toàn và khả năng bảo trì.
1. Tập tin xác thực cơ bản: pg_hba.conf
Tập tin này định nghĩa chính sách truy cập theo từng dòng — quy tắc đầu tiên khớp với yêu cầu kết nối sẽ được áp dụng. Cấu trúc tiêu chuẩn gồm sáu cột:
# TYPE DATABASE USER ADDRESS METHOD OPTIONS
local all postgres peer
host appdb app_user 10.20.30.0/24 scram-sha-256 clientcert=1
hostssl all backup 172.16.0.0/16 cert
- TYPE:
local(socket Unix),host(TCP/IP không SSL),hostssl(chỉ kết nối SSL),hostnossl(loại trừ SSL). - DATABASE: Có thể là tên cơ sở dữ liệu cụ thể,
all,sameuser, hoặc mẫu dùng dấu sao (app*). - USER: Hỗ trợ danh sách phân tách dấu phẩy hoặc nhóm vai trò (ví dụ:
+developers). - ADDRESS: Chỉ áp dụng cho kiểu
host*; dùng CIDR notation hoặc từ khóasamehost/samenet. - METHOD: Cơ chế xác thực —
scram-sha-256,cert,ldap,gss, v.v. - OPTIONS: Tham số mở rộng như
map=ldap_map,ldaptls=1, hoặcinclude_realm=1.
2. Thiết lập toàn cục trong postgresql.conf
Các tham số sau ảnh hưởng trực tiếp đến hành vi xác thực và bảo mật mạng:
# Mã hóa mật khẩu mới (không ảnh hưởng tới mật khẩu hiện có)
password_encryption = 'scram-sha-256'
# Giới hạn địa chỉ lắng nghe — tránh đặt '*' trong môi trường sản xuất
listen_addresses = '127.0.0.1, 10.20.30.5'
# Kích hoạt SSL bắt buộc cho kết nối từ xa
ssl = on
ssl_cert_file = '/etc/ssl/postgres/server.crt'
ssl_key_file = '/etc/ssl/postgres/server.key'
ssl_ca_file = '/etc/ssl/postgres/root.crt' # Nếu dùng xác thực CA
# Ghi nhật ký xác thực thất bại để giám sát
log_connections = on
log_disconnections = on
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
3. So sánh phương thức xác thực phổ biến
| Phương thức | Mô tả | Điều kiện sử dụng | Ví dụ |
|---|---|---|---|
scram-sha-256 |
Xác thực mật khẩu an toàn với salt và nhiều vòng băm | PostgreSQL ≥ 10; driver hỗ trợ SCRAM (JDBC ≥ 42.2.0) | host appdb app_user 192.168.5.0/24 scram-sha-256 |
cert |
Xác thực bằng chứng thư SSL của client | Cần cấu hình ssl = on và clientcert=1 |
hostssl all admin 10.0.0.0/8 cert clientcert=1 |
ldap |
Tích hợp với máy chủ LDAP qua giao thức đơn giản hoặc TLS | Cần khai báo đầy đủ thông số LDAP trong cùng dòng hoặc tệp riêng | host all ldapuser 192.168.10.0/24 ldap ldapserver=ldap.internal binddn="cn=admin,dc=int" |
peer |
Xác thực dựa trên tên người dùng hệ điều hành (Unix socket) | Chỉ hoạt động với kết nối local |
local replication repmgr peer |
4. Mẫu cấu hình an toàn cho môi trường sản xuất
# Quản trị cục bộ qua socket — không cần mật khẩu
local all postgres peer
# Người dùng ứng dụng nội bộ — chỉ cho phép SCRAM qua mạng riêng
host appdb app_user 10.20.30.0/24 scram-sha-256
# Kết nối sao lưu qua SSL — yêu cầu chứng thư client
hostssl replication repl_user 172.16.0.0/16 cert clientcert=1
# Từ chối tất cả kết nối còn lại — luôn đặt cuối cùng
host all all 0.0.0.0/0 reject
5. Tạo và cấp quyền người dùng
Tạo tài khoản với đặc quyền hạn chế
-- Tạo vai trò có khả năng đăng nhập và giới hạn thời hạn
CREATE ROLE app_user WITH
LOGIN
PASSWORD 'V!s1bl3P@ssw0rd2024'
VALID UNTIL '2025-06-30';
-- Gán quyền cơ bản cho cơ sở dữ liệu đích
GRANT CONNECT ON DATABASE appdb TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
-- Cấp quyền thao tác dữ liệu
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO app_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;
-- Thiết lập quyền mặc định cho các bảng tương lai
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE ON TABLES TO app_user;
Sử dụng vai trò nhóm để quản lý phân quyền
-- Tạo nhóm chỉ đọc
CREATE ROLE readonly_group;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_group;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly_group;
-- Gán nhóm cho người dùng
GRANT readonly_group TO app_user;
6. Kiểm tra và khắc phục sự cố
- Kiểm tra quy tắc đang hoạt động:
SELECT * FROM pg_hba_file_rules();— hiển thị các quy tắc đã được phân tích. - Xác minh định dạng mật khẩu:
SELECT rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS is_scram FROM pg_authid WHERE rolname = 'app_user'; - Gỡ lỗi xác thực thất bại:
Xem nhật ký PostgreSQL (
log_directorytrongpostgresql.conf) để tìm thông báo dạngconnection authorizedhoặcPAM authentication failed.
7. Thực hành tốt nhất
- Luôn đặt quy tắc
rejecthoặchost ... 0.0.0.0/0 rejectở cuốipg_hba.conf. - Không sử dụng
trustngoài môi trường phát triển cục bộ. - Thay đổi mật khẩu định kỳ bằng lệnh
ALTER ROLE ... PASSWORD— điều này tự động cập nhật sang định dạng SCRAM nếu cấu hình đúng. - Tránh cấp
SUPERUSERhoặcCREATEDBtrừ khi thực sự cần thiết. - Sử dụng
pg_dump --no-owner --no-privilegeskhi sao lưu để kiểm soát rõ ràng việc khôi phục quyền.