Cấu hình xác thực PostgreSQL: Hướng dẫn toàn diện

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óa samehost/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ặc include_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ứcMô tảĐiều kiện sử dụngVí 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 = onclientcert=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_directory trong postgresql.conf) để tìm thông báo dạng connection authorized hoặc PAM authentication failed.

7. Thực hành tốt nhất

  • Luôn đặt quy tắc reject hoặc host ... 0.0.0.0/0 reject ở cuối pg_hba.conf.
  • Không sử dụng trust ngoà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 SUPERUSER hoặc CREATEDB trừ khi thực sự cần thiết.
  • Sử dụng pg_dump --no-owner --no-privileges khi sao lưu để kiểm soát rõ ràng việc khôi phục quyền.

Thẻ: PostgreSQL authentication Security SCRAM-SHA-256 pg_hba.conf

Đăng vào ngày 23 tháng 7 lúc 14:03