pg_hba.conf là file cấu hình của PostgreSQL, dùng để quản lý kết nối và xác thực. HBA là viết tắt của Host-Based Authentication (xác thực dựa trên host). File này giống như một cái "barie" mạng, quyết định:
- Ai được phép kết nối tới server (địa chỉ IP, role, database).
- Phương thức xác thực nào được yêu cầu khi kết nối.
Nếu so sánh với đời thực, thì pg_hba.conf giống như bảo vệ ở cửa tòa nhà. Ảnh quyết định ai được vào, ai không, kiểm tra không chỉ giấy tờ (mật khẩu) mà còn cả hộ khẩu (địa chỉ IP).
Cấu trúc file pg_hba.conf
File pg_hba.conf gồm các dòng, mỗi dòng mô tả một rule truy cập. Cấu trúc dòng như sau:
<loại kết nối> <database> <người dùng> <nguồn> <phương thức xác thực>
Phân tích các thành phần:
Loại kết nối (connection type): xác định client sẽ kết nối kiểu gì.
local: kết nối qua Unix socket (cho user local trên server Linux).host: kết nối qua TCP/IP.hostssl: kết nối qua TCP/IP nhưng bắt buộc dùng SSL.hostnossl: kết nối qua TCP/IP không dùng SSL.
Database: liệt kê các database được phép truy cập. Có thể chỉ định database cụ thể, nhiều database cách nhau bằng dấu phẩy, hoặc dùng từ khóa:
all: Cho phép truy cập tất cả database.
Người dùng: chỉ định user nào được phép kết nối.
- Có thể ghi tên user cụ thể hoặc dùng
allđể cho phép tất cả.
Nguồn (address): chỉ định địa chỉ IP client hoặc dải địa chỉ.
- Với IPv4 dùng dạng
x.x.x.xhoặcx.x.x.x/y(trong đó/ylà subnet mask, ví dụ/24). - Với IPv6 dùng dạng
::/y. - Từ khóa
allnghĩa là cho phép tất cả IP.
Phương thức xác thực: chỉ định cách xác thực được dùng.
Ví dụ:
trust: cho phép kết nối không cần mật khẩu (không an toàn, chỉ dùng test).md5: dùng mật khẩu (đã hash).scram-sha-256: xác thực an toàn hơn với SHA-256.reject: từ chối truy cập.
Ví dụ dòng trong pg_hba.conf
Cấu hình file này khá linh hoạt. Dưới đây là vài ví dụ:
Cho phép kết nối local qua Unix socket
local all all trustTất cả user được kết nối tới mọi database trên server local mà không cần mật khẩu.
Cho phép kết nối từ một địa chỉ IP cụ thể
host my_database my_user 192.168.1.100/32 md5User
my_userchỉ được kết nối tới databasemy_databasetừ IP192.168.1.100, dùng mật khẩu.Cho phép truy cập database từ cả subnet
host my_database all 192.168.1.0/24 scram-sha-256Bất kỳ user nào từ subnet
192.168.1.0/24đều có thể kết nối tớimy_database, nhưng phải xác thực bằng SHA-256.Cấm kết nối từ một subnet nhất định
host all all 192.168.2.0/24 rejectKết nối từ subnet
192.168.2.0/24bị cấm hoàn toàn.
Cấu hình truy cập theo địa chỉ IP
Giờ khi đã hiểu cấu trúc file, cùng xem cách quản lý kết nối nhé.
Thử giới hạn truy cập server từ một số IP nhất định. Giả sử bạn có server PostgreSQL và muốn chỉ cho phép truy cập từ localhost (127.0.0.1) và subnet văn phòng (192.168.10.0/24). Thêm các dòng sau vào pg_hba.conf:
# Truy cập local
host all all 127.0.0.1/32 trust
# Truy cập từ văn phòng
host all all 192.168.10.0/24 md5
# Cấm tất cả còn lại
host all all 0.0.0.0/0 reject
Ở đây rule 0.0.0.0/0 nghĩa là "mọi IP". Bạn đang cấm truy cập từ bất kỳ đâu ngoài các địa chỉ đã chỉ định.
Cấu hình truy cập cho user từ xa
Nếu server PostgreSQL của bạn chạy trên cloud hoặc server remote, có thể bạn chỉ muốn cho phép kết nối từ một số IP ngoài nhất định. Ví dụ:
# Truy cập cho admin từ nhà
host all admin_user 203.0.113.10/32 md5
Trong ví dụ này chỉ user admin_user từ IP 203.0.113.10 mới kết nối được.
Reload cấu hình
Sau khi sửa file pg_hba.conf thì PostgreSQL phải áp dụng lại. Dùng lệnh này nhé:
sudo systemctl reload postgresql
Reload an toàn, không làm server sập đâu.
Nếu quên file pg_hba.conf nằm ở đâu, có thể tra đường dẫn bằng SQL:
SHOW hba_file;
Lỗi thường gặp khi làm việc với pg_hba.conf
Làm với pg_hba.conf khá đơn giản, nhưng newbie admin đôi khi vẫn mắc lỗi. Ví dụ:
- Quên reload server. Mọi thay đổi trong
pg_hba.confchỉ có hiệu lực sau khi reload cấu hình thôi nhé. - Rule bị xung đột. PostgreSQL xử lý rule từ trên xuống. Gặp rule nào khớp là dừng, các rule sau bị bỏ qua. Rule tổng quát nên để phía dưới.
- Sai subnet mask. Ví dụ ghi
/0là mở toang cho tất cả, rất nguy hiểm luôn.
Ví dụ kịch bản thực tế
Test app trên server local.
Chỉ cho phép truy cập từ localhost:
local all all trust
Làm việc với client từ xa.
Cho phép client từ một IP cụ thể:
host all client_user 203.0.113.42/32 scram-sha-256
Giới hạn truy cập từ mạng public.
Cấm kết nối từ Internet (nhưng cho phép văn phòng):
host all all 0.0.0.0/0 reject
host all all 192.168.10.0/24 md5
Đến đây chắc bạn đã hiểu cách dùng pg_hba.conf để giới hạn truy cập PostgreSQL rồi nhỉ. File này là một trong những công cụ quan trọng nhất để bảo vệ database. Hãy đảm bảo cấu hình hợp lý, kiểm tra kỹ và phù hợp với nhu cầu business. Ai mà chẳng muốn sống trong thế giới dữ liệu an toàn khỏi hacker? Tất nhiên, trừ khi bạn chính là hacker ấy :)
GO TO FULL VERSION