文章目录
- 一、pg_hba.conf 基础认知
- 1.1 pg_hba.conf 概述
- 1.2 文件位置与作用
- 1.3 基本语法结构
- 1.4 安全加固 checklist
- 二、TYPE 字段详解:连接类型
- 三、DATABASE 字段:目标数据库
- 四、USER 字段:目标用户
- 五、ADDRESS 字段:客户端地址限制(核心安全控制)
- 5.1 IPv4 表示法
- 5.2 IPv6 表示法
- 5.3 特殊值
- 5.4 多地址配置
- 六、METHOD 字段:认证方法详解
- 6.1 常用认证方法对比
- 6.2 各方法详细说明
- 七、典型场景配置方案
- 7.1 本地开发环境(宽松但可控)
- 7.2 测试环境(限制网段 + 密码)
- 7.3 生产环境(最小权限 + 强认证 + SSL)
- 八、高级技巧与注意事项
- 8.1 规则匹配顺序至关重要
- 8.2 动态管理:避免直接编辑
- 8.3 日志辅助调试
- 8.4 与防火墙协同
- 九、常见问题排查
- 9.1 “FATAL: no pg_hba.conf entry for host...”
- 9.2 密码正确但认证失败
- 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 按文件从上到下的顺序逐条匹配规则,一旦匹配即执行对应认证方法,不再继续匹配。
⚠️ 注意:修改后必须重载配置才能生效(无需重启):
SELECTpg_reload_conf();或命令行:
pg_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 连接(不推荐) |
示例:
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 | 角色成员可访问的数据库 |
示例:
# 仅允许 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 | 具体用户名 |
,分隔列表 | 多个用户 |
示例:
# 仅 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 逻辑):
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 的人都可登录。
- 示例(仅限本地测试):
local all all trust
(2)reject
- 行为:显式拒绝匹配的连接请求,返回错误。
- 用途:实现黑名单(放在规则顶部)。
- 示例:
host all all 203.0.113.100/32 reject
(3)peer(Linux/macOS)与ident(Windows)
- 原理:通过操作系统用户映射数据库用户。
- 要求:客户端 OS 用户名 = 数据库用户名。
- 示例:
此时,系统用户local all all peeralice可直接psql -U alice登录,无需密码。
(4)md5
- 原理:客户端发送
MD5(密码 + 用户名)的哈希值。 - 缺点:易受离线暴力破解;不支持密码轮换(需重新哈希存储)。
- 现状:逐渐被
scram-sha-256取代。
(5)scram-sha-256(推荐)
- 优势:
- 防中间人攻击
- 支持安全密码变更
- 符合现代安全标准
- 前提:客户端驱动需支持(PostgreSQL 10+ 官方驱动均支持)
- 配置:
host 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(
- 示例:
hostssl all +app_role 10.0.0.0/24 cert
七、典型场景配置方案
7.1 本地开发环境(宽松但可控)
# 允许本地操作系统用户免密登录(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 测试环境(限制网段 + 密码)
# 仅测试网段可访问 host all all 192.168.10.0/24 scram-sha-256 # 拒绝其他所有连接 host all all 0.0.0.0/0 reject注意:
reject规则应放在最后,作为兜底。
7.3 生产环境(最小权限 + 强认证 + SSL)
# 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)应放在末尾
错误示例:
host all all 0.0.0.0/0 md5 # 所有连接走此规则 host myapp appuser 192.168.1.10/32 scram-sha-256 # 永远不会匹配!正确写法:
host myapp appuser 192.168.1.10/32 scram-sha-256 host all all 0.0.0.0/0 md58.2 动态管理:避免直接编辑
可使用pg_hba.conf的include指令模块化管理:
在主文件末尾添加:
include_dir 'pg_hba.d'然后创建目录pg_hba.d/,内含:
app.confadmin.confdeny.conf
便于版本控制和团队协作。
8.3 日志辅助调试
开启日志可查看认证失败原因:
# 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 格式 - 解决:以超级用户登录,重置密码:
新密码将自动以 SCRAM 格式存储。ALTERUSERmyuser PASSWORD'newpass';
9.3 本地连接被拒绝
- 检查是否混淆了
local(Unix socket)和host(TCP) - 例如:
psql -h localhost走host规则,psql(无-h)走local规则