1. Quản lý Người Dùng và Quyền Truy Cập

a. Tạo người dùng với quyền hạn cụ thể

Việc giới hạn quyền của người dùng giúp giảm thiểu rủi ro khi tài khoản bị tấn công. Chỉ nên cấp quyền truy cập cần thiết cho từng người dùng.

CREATE USER low_priv_user WITH PASSWORD 'strongpassword';

Cấp quyền cho người dùng:

GRANT SELECT, INSERT ON employees TO low_priv_user;

Chỉ cấp quyền SELECTINSERT cho người dùng trên bảng employees.

b. Sử dụng vai trò (Roles)

Sử dụng các nhóm quyền (roles) giúp dễ dàng quản lý quyền truy cập cho nhiều người dùng. Các vai trò có thể được gán quyền và sau đó các người dùng có thể được thêm vào vai trò này.

-- Tạo vai trò quản lý quyền chỉ đọc
CREATE ROLE readonly_role;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_role;

-- Thêm người dùng vào vai trò
GRANT readonly_role TO low_priv_user;

c. Chính sách bảo mật dựa trên hàng (Row-Level Security – RLS)

PostgreSQL hỗ trợ Row-Level Security, cho phép kiểm soát quyền truy cập dựa trên từng hàng dữ liệu, giúp bảo mật dữ liệu ở mức độ chi tiết hơn.

-- Bật RLS cho bảng
ALTER TABLE employees ENABLE ROW LEVEL SECURITY;

-- Tạo chính sách chỉ cho phép người dùng xem dữ liệu của họ
CREATE POLICY employee_policy ON employees
  FOR SELECT USING (user_id = current_user);

-- Áp dụng chính sách
ALTER TABLE employees FORCE ROW LEVEL SECURITY;

2. Mã hóa Dữ liệu (Encryption)

a. Mã hóa dữ liệu truyền tải (Encryption in Transit)

Sử dụng SSL/TLS để mã hóa dữ liệu truyền tải giữa ứng dụng và máy chủ PostgreSQL.

Kích hoạt SSL trong file cấu hình postgresql.conf:

ssl = on
ssl_cert_file = '/path/to/server.crt'
ssl_key_file = '/path/to/server.key'

Cấu hình để yêu cầu tất cả các kết nối đều sử dụng SSL trong file pg_hba.conf:

hostssl all all 0.0.0.0/0 md5

b. Mã hóa dữ liệu lưu trữ (Encryption at Rest)

PostgreSQL không hỗ trợ mã hóa dữ liệu lưu trữ trực tiếp, nhưng bạn có thể sử dụng các công cụ mã hóa hệ thống tệp như dm-crypt hoặc LUKS trên Linux để mã hóa đĩa cứng nơi lưu trữ dữ liệu PostgreSQL.


3. Xác thực và Kiểm soát Kết nối

a. Xác thực dựa trên địa chỉ IP và phương thức

Bạn có thể kiểm soát các kết nối từ những địa chỉ IP cụ thể và xác thực qua các phương thức khác nhau trong file pg_hba.conf. Ví dụ, chỉ cho phép các địa chỉ IP cụ thể kết nối bằng xác thực mật khẩu (md5):

# IPv4 local connections:
host all all 192.168.1.0/24 md5

b. Hạn chế số kết nối đồng thời

Giới hạn số kết nối đồng thời cho người dùng nhằm ngăn ngừa quá tải và tấn công từ chối dịch vụ (DoS). Sử dụng cấu hình trong postgresql.conf:

max_connections = 100

Bạn cũng có thể giới hạn số kết nối trên mỗi người dùng:

ALTER ROLE low_priv_user CONNECTION LIMIT 5;

4. Cập nhật và Quản lý Bản vá

Luôn đảm bảo cập nhật PostgreSQL lên phiên bản mới nhất để nhận được các bản vá bảo mật mới. Bạn có thể sử dụng các công cụ quản lý gói trên hệ thống của mình như apt trên Ubuntu:

sudo apt update
sudo apt upgrade postgresql

5. Kiểm Toán và Giám Sát Hệ Thống

a. Bật tính năng logging

Để theo dõi các hành vi bất thường hoặc truy cập trái phép, bạn cần bật tính năng logging trong PostgreSQL.

Cấu hình trong postgresql.conf:

logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'  # Log tất cả các câu lệnh SQL

b. Sử dụng các công cụ giám sát

Bạn có thể sử dụng các công cụ như pgAdmin, Nagios, hoặc Prometheus để giám sát hiệu suất và bảo mật của PostgreSQL.


Bằng cách áp dụng các kỹ thuật bảo mật này, bạn sẽ có thể quản lý quyền truy cập, mã hóa dữ liệu, theo dõi các hành vi bất thường, và đảm bảo rằng cơ sở dữ liệu PostgreSQL của bạn được bảo vệ trước các mối đe dọa tiềm ẩn.