文章目录
-
- [一、pg_hba.conf 基础认知](#一、pg_hba.conf 基础认知)
-
- [1.1 pg_hba.conf 概述](#1.1 pg_hba.conf 概述)
- [1.2 文件位置与作用](#1.2 文件位置与作用)
- [1.3 基本语法结构](#1.3 基本语法结构)
- [1.4 安全加固 checklist](#1.4 安全加固 checklist)
- [二、TYPE 字段详解:连接类型](#二、TYPE 字段详解:连接类型)
- [三、DATABASE 字段:目标数据库](#三、DATABASE 字段:目标数据库)
- [四、USER 字段:目标用户](#四、USER 字段:目标用户)
- [五、ADDRESS 字段:客户端地址限制(核心安全控制)](#五、ADDRESS 字段:客户端地址限制(核心安全控制))
-
- [5.1 IPv4 表示法](#5.1 IPv4 表示法)
- [5.2 IPv6 表示法](#5.2 IPv6 表示法)
- [5.3 特殊值](#5.3 特殊值)
- [5.4 多地址配置](#5.4 多地址配置)
- [六、METHOD 字段:认证方法详解](#六、METHOD 字段:认证方法详解)
-
- [6.1 常用认证方法对比](#6.1 常用认证方法对比)
- [6.2 各方法详细说明](#6.2 各方法详细说明)
- 七、典型场景配置方案
-
- [7.1 本地开发环境(宽松但可控)](#7.1 本地开发环境(宽松但可控))
- [7.2 测试环境(限制网段 + 密码)](#7.2 测试环境(限制网段 + 密码))
- [7.3 生产环境(最小权限 + 强认证 + SSL)](#7.3 生产环境(最小权限 + 强认证 + SSL))
- 八、高级技巧与注意事项
-
- [8.1 规则匹配顺序至关重要](#8.1 规则匹配顺序至关重要)
- [8.2 动态管理:避免直接编辑](#8.2 动态管理:避免直接编辑)
- [8.3 日志辅助调试](#8.3 日志辅助调试)
- [8.4 与防火墙协同](#8.4 与防火墙协同)
- 九、常见问题排查
-
- [9.1 "FATAL: no pg_hba.conf entry for host..."](#9.1 “FATAL: no pg_hba.conf entry for host...”)
- [9.2 密码正确但认证失败](#9.2 密码正确但认证失败)
- [9.3 本地连接被拒绝](#9.3 本地连接被拒绝)
本文将全面、系统地讲解
pg_hba.conf的结构、配置项含义、认证方法、IP 限制策略,并结合典型场景(开发、测试、生产)提供可落地的安全配置方案。适用于 PostgreSQL 10 及以上版本。
一、pg_hba.conf 基础认知
1.1 pg_hba.conf 概述
在 PostgreSQL 的安全体系中,pg_hba.conf(Host-Based Authentication Configuration)文件扮演着至关重要的角色。它决定了哪些客户端可以连接到数据库、以何种方式认证、以及能访问哪些数据库和用户。可以说,pg_hba.conf 是 PostgreSQL 的第一道也是最关键的访问控制防线。
许多数据库安全事件------如未授权访问、数据泄露、暴力破解攻击------往往源于 pg_hba.conf 配置不当。因此,深入理解其语法、规则匹配机制及最佳实践,是每一位 PostgreSQL DBA 和系统管理员的必备技能。
pg_hba.conf 是 PostgreSQL 安全架构的基石。它虽只是一个文本文件,却承载着整个数据库的访问控制策略。一个精心设计的 pg_hba.conf 能有效抵御未授权访问、暴力破解和内部越权操作;而一个疏忽的配置,则可能让整个数据库暴露在风险之中。
掌握其规则匹配机制、认证方法差异、IP 限制技巧,并结合实际业务场景制定最小权限策略,是保障数据安全的第一步。记住:安全不是功能,而是持续的过程 。定期审查 pg_hba.conf,结合日志监控与渗透测试,才能构建真正可靠的 PostgreSQL 服务。
1.2 文件位置与作用
-
位置 :位于 PostgreSQL 数据目录(
PGDATA)下,通常为:- Linux:
/var/lib/pgsql/16/data/pg_hba.conf或/etc/postgresql/16/main/pg_hba.conf - Windows:
C:\Program Files\PostgreSQL\16\data\pg_hba.conf - macOS (Homebrew):
/opt/homebrew/var/postgresql@16/pg_hba.conf
- Linux:
-
作用 :定义客户端连接请求的认证规则。当客户端尝试连接时,PostgreSQL 按文件从上到下的顺序 逐条匹配规则,一旦匹配即执行对应认证方法,不再继续匹配。
⚠️ 注意:修改后必须重载配置才能生效(无需重启):
sqlSELECT pg_reload_conf();或命令行:
bashpg_ctl reload -D $PGDATA
1.3 基本语法结构
每条规则占一行,格式如下:
# TYPE DATABASE USER ADDRESS METHOD [OPTIONS]
各字段含义:
| 字段 | 说明 |
|---|---|
TYPE |
连接类型 |
DATABASE |
目标数据库 |
USER |
目标用户 |
ADDRESS |
客户端 IP 或网络 |
METHOD |
认证方法 |
OPTIONS |
方法附加参数(可选) |
注释以 # 开头,空行或仅含空白的行被忽略。
1.4 安全加固 checklist
安装 PostgreSQL 后,务必完成以下检查:
- 禁用
trust:除必要本地管理外,移除所有trust规则 - 限制
postgres用户:禁止远程登录超级用户 - 使用
scram-sha-256:替代md5 - 最小权限原则:按 IP、用户、数据库精确授权
- 添加
reject兜底:防止规则遗漏 - 启用 SSL:对远程连接强制加密
- 定期审计 :检查
pg_hba.conf变更记录 - 配合防火墙:网络层 + 应用层双重防护
二、TYPE 字段详解:连接类型
TYPE 决定了规则适用的连接方式:
| 值 | 说明 |
|---|---|
local |
Unix 域套接字(仅限本地,Linux/macOS) |
host |
TCP/IP 连接(IPv4 或 IPv6) |
hostssl |
必须使用 SSL 加密的 TCP/IP 连接 |
hostnossl |
禁止 SSL 的 TCP/IP 连接(不推荐) |
示例:
conf
local all all peer
host all all 127.0.0.1/32 md5
hostssl all all 0.0.0.0/0 scram-sha-256
✅ 建议:生产环境优先使用
hostssl强制加密。
三、DATABASE 字段:目标数据库
指定规则适用的数据库名称,支持以下形式:
| 值 | 说明 |
|---|---|
all |
所有数据库 |
sameuser |
仅当数据库名与用户名相同时 |
samerole |
用户所属角色可访问的数据库 |
replication |
用于流复制连接(特殊权限) |
db_name |
具体数据库名(如 myapp) |
, 分隔列表 |
多个数据库(如 db1,db2) |
+role_name |
角色成员可访问的数据库 |
示例:
conf
# 仅允许 appuser 访问 myapp_db
host myapp_db appuser 192.168.1.0/24 md5
# 允许 backup_user 访问所有数据库
host all backup_user 10.0.0.5/32 md5
四、USER 字段:目标用户
指定规则适用的数据库用户:
| 值 | 说明 |
|---|---|
all |
所有用户 |
+role_name |
角色及其成员 |
user_name |
具体用户名 |
, 分隔列表 |
多个用户 |
示例:
conf
# 仅 admin 和 dba 可从管理网段登录
host all admin,dba 10.10.0.0/24 md5
五、ADDRESS 字段:客户端地址限制(核心安全控制)
此字段用于限制允许连接的客户端 IP 或网络范围,是实现 IP 白名单的关键。
5.1 IPv4 表示法
- 单个 IP:
192.168.1.100 - CIDR 网络:
192.168.1.0/24(表示 192.168.1.1 ~ 192.168.1.254) - 全零网络:
0.0.0.0/0(任意 IPv4)
5.2 IPv6 表示法
- 单个 IP:
::1(本地回环) - CIDR 网络:
2001:db8::/32
5.3 特殊值
samehost:仅本机(等价于127.0.0.1/32+::1/128)samenet:与服务器同子网的主机(不推荐,依赖系统路由)
✅ 最佳实践:始终使用明确的 CIDR 表示法,避免模糊匹配。
5.4 多地址配置
若需允许多个网段,应写多行规则(因单行不支持 OR 逻辑):
conf
host all appuser 192.168.1.0/24 md5
host all appuser 10.0.0.0/8 md5
六、METHOD 字段:认证方法详解
认证方法决定了客户端如何证明身份。选择安全且适合场景的方法至关重要。
6.1 常用认证方法对比
| 方法 | 安全性 | 说明 | 适用场景 |
|---|---|---|---|
trust |
极低 | 无密码,直接允许 | 仅限本地开发、测试 |
reject |
--- | 显式拒绝 | 黑名单 |
peer / ident |
中 | 通过操作系统用户认证 | 本地 Unix 连接 |
md5 |
中 | 密码 MD5 加密传输 | 兼容旧客户端 |
scram-sha-256 |
高 | 现代安全认证协议 | 生产环境推荐 |
cert |
高 | 基于 SSL 客户端证书 | 高安全要求 |
ldap / radius |
高 | 外部认证服务 | 企业统一身份管理 |
🔒 重要 :自 PostgreSQL 10 起,
scram-sha-256是默认且最安全的密码认证方式。
6.2 各方法详细说明
(1)trust
-
行为:无条件允许连接,不验证密码。
-
风险:任何能访问该 IP 的人都可登录。
-
示例 (仅限本地测试):
conflocal all all trust
(2)reject
-
行为:显式拒绝匹配的连接请求,返回错误。
-
用途:实现黑名单(放在规则顶部)。
-
示例 :
confhost all all 203.0.113.100/32 reject
(3)peer(Linux/macOS)与 ident(Windows)
-
原理:通过操作系统用户映射数据库用户。
-
要求:客户端 OS 用户名 = 数据库用户名。
-
示例 :
conflocal all all peer此时,系统用户
alice可直接psql -U alice登录,无需密码。
(4)md5
- 原理 :客户端发送
MD5(密码 + 用户名)的哈希值。 - 缺点:易受离线暴力破解;不支持密码轮换(需重新哈希存储)。
- 现状 :逐渐被
scram-sha-256取代。
(5)scram-sha-256(推荐)
-
优势 :
- 防中间人攻击
- 支持安全密码变更
- 符合现代安全标准
-
前提:客户端驱动需支持(PostgreSQL 10+ 官方驱动均支持)
-
配置 :
confhost all all 0.0.0.0/0 scram-sha-256
💡 提示:若用户密码仍为 MD5 格式,首次使用 SCRAM 登录时会自动升级。
(6)cert
-
原理:客户端提供有效的 SSL 证书,证书 CN(Common Name)作为数据库用户名。
-
要求 :
- 启用 SSL(
postgresql.conf中ssl = on) - 配置
server.crt/server.key - 客户端持有由同一 CA 签发的证书
- 启用 SSL(
-
示例 :
confhostssl all +app_role 10.0.0.0/24 cert
七、典型场景配置方案
7.1 本地开发环境(宽松但可控)
conf
# 允许本地操作系统用户免密登录(peer)
local all all peer
# 允许本地应用通过密码连接
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
说明:开发者可通过
sudo -u postgres psql或psql -h localhost -U myuser连接。
7.2 测试环境(限制网段 + 密码)
conf
# 仅测试网段可访问
host all all 192.168.10.0/24 scram-sha-256
# 拒绝其他所有连接
host all all 0.0.0.0/0 reject
注意:
reject规则应放在最后,作为兜底。
7.3 生产环境(最小权限 + 强认证 + SSL)
conf
# 1. 本地管理:操作系统认证
local all postgres peer
local myapp_db appuser peer
# 2. 应用服务器(固定 IP)通过 SCRAM 认证
host myapp_db appuser 10.0.1.10/32 scram-sha-256
# 3. 备份服务器
host replication repuser 10.0.2.20/32 scram-sha-256
# 4. DBA 远程管理(仅跳板机 + SSL)
hostssl all dba_user 10.10.0.5/32 scram-sha-256
# 5. 拒绝一切其他连接
host all all 0.0.0.0/0 reject
host all all ::/0 reject
安全要点:
- 按角色、数据库、IP 严格划分权限
- 使用
hostssl强制加密 - 最后添加
reject规则防止遗漏 - 超级用户(如
postgres)禁止远程登录
八、高级技巧与注意事项
8.1 规则匹配顺序至关重要
PostgreSQL 按文件从上到下匹配,首条匹配即生效。因此:
- 具体规则在前,通用规则在后
- 拒绝规则(reject)应放在末尾
错误示例:
conf
host all all 0.0.0.0/0 md5 # 所有连接走此规则
host myapp appuser 192.168.1.10/32 scram-sha-256 # 永远不会匹配!
正确写法:
conf
host myapp appuser 192.168.1.10/32 scram-sha-256
host all all 0.0.0.0/0 md5
8.2 动态管理:避免直接编辑
可使用 pg_hba.conf 的 include 指令模块化管理:
在主文件末尾添加:
conf
include_dir 'pg_hba.d'
然后创建目录 pg_hba.d/,内含:
app.confadmin.confdeny.conf
便于版本控制和团队协作。
8.3 日志辅助调试
开启日志可查看认证失败原因:
conf
# postgresql.conf
log_connections = on
log_disconnections = on
log_hostname = on
失败日志示例:
FATAL: no pg_hba.conf entry for host "192.168.1.100", user "test", database "mydb"
8.4 与防火墙协同
pg_hba.conf是应用层访问控制- 应配合系统防火墙(iptables/firewalld/Windows Firewall)进行网络层过滤
- 双重防护:防火墙限制端口开放范围,
pg_hba.conf实现细粒度认证
九、常见问题排查
9.1 "FATAL: no pg_hba.conf entry for host..."
- 原因:客户端 IP 未被任何规则覆盖
- 解决:
- 检查
ADDRESS是否匹配(注意 CIDR 掩码) - 确认规则顺序(是否被前面的通用规则提前匹配?)
- 查看日志确认实际连接 IP(NAT/代理可能改变源 IP)
- 检查
9.2 密码正确但认证失败
-
检查
METHOD是否为scram-sha-256,而用户密码仍是 MD5 格式 -
解决:以超级用户登录,重置密码:
sqlALTER USER myuser PASSWORD 'newpass';新密码将自动以 SCRAM 格式存储。
9.3 本地连接被拒绝
- 检查是否混淆了
local(Unix socket)和host(TCP) - 例如:
psql -h localhost走host规则,psql(无-h)走local规则