2. PostgreSQL认证机制审计

PostgreSQL的客户端认证由 pg_hba.conf(Host-Based Authentication)统一控制。它决定了“谁、从哪个地址、连哪个库、以哪个用户、用什么认证方法”能否通过。审计时,理解规则匹配顺序与认证方法强度,比单纯检查文件是否存在更重要。

一、pg_hba.conf规则结构与匹配顺序

每条规则由五个核心字段组成:连接类型、数据库、用户、地址、认证方法。可选字段包括 auth-options 与 clientcert 等。规则自上而下逐条匹配,第一条匹配的规则即被采用,后续规则不再评估。因此,把宽松规则放在前面会直接覆盖后面的严格规则,这是最常见的审计风险。

# TYPE  DATABASE  USER      ADDRESS         METHOD
local   all       postgres                  peer
host    all       all       127.0.0.1/32    scram-sha-256
host    appdb     app_rw    10.20.0.0/24    scram-sha-256
host    all       all       0.0.0.0/0       reject
hostssl all       all       0.0.0.0/0       cert clientcert=verify-full

上例中,local 表示 Unix 域套接字连接,host 表示 TCP(含 SSL 与非 SSL),hostssl 仅匹配 SSL 连接,hostnossl 仅匹配非 SSL。地址字段支持 CIDR、IP+掩码、主机名,以及 samehost、samenet 等关键字。审计时应确认:是否存在 0.0.0.0/0 且方法为 trust 的规则;是否所有远程连接都要求加密;reject 兜底规则是否位于末尾。

pg_hba.conf 规则匹配与认证强度评估 客户端连接 local / host / hostssl 逐条匹配规则 自上而下,首条命中即生效 后续规则不再评估 认证方法安全强度 trust < md5 < scram-sha-256 < cert / gss ldap / radius / pam 依赖外部系统强度 peer 仅限本地,ident 已不推荐 trust 无密码直接放行 强度:极低 md5 MD5加盐哈希 强度:低 scram-sha-256 挑战响应+强哈希 强度:高(推荐) cert 双向TLS证书 强度:很高 gss / ldap / radius 依赖Kerberos/目录服务 强度:取决于外部系统 审计要点与常见配置错误 宽松规则前置:trust 或 0.0.0.0/0 出现在严格规则之前,导致后者失效 仍在使用 md5:密码哈希可被离线破解,建议迁移至 scram-sha-256 缺少 hostssl 强制:远程明文连接可能泄露凭据,应要求 SSL/TLS cert 未配置 clientcert=verify-full:仅验证证书存在,未校验CN与用户名映射 缺少 reject 兜底:未匹配的连接可能被默认策略意外放行

二、认证方法安全强度评估

trust 表示完全信任,不做任何身份验证。任何能建立连接的客户端都可以声明任意用户名。它只应出现在极受控的本地维护场景,绝不应出现在远程地址上。审计中一旦发现 host all all 0.0.0.0/0 trust,应视为高危。

md5 使用 MD5 加盐哈希传输口令。虽然口令不以明文传输,但 MD5 抗碰撞与抗暴力破解能力已不足,且服务端存储的 md5 哈希可被离线破解。在等保与合规审计中,md5 通常被视为“弱认证”,建议迁移到 scram-sha-256。

scram-sha-256 是 PostgreSQL 10 引入的挑战-响应认证,基于 SCRAM 机制,使用 SHA-256 与随机盐,支持服务端不存储明文等价物,且能抵抗重放与离线字典攻击。它是当前口令认证的推荐方法。迁移时需注意:password_encryption = scram-sha-256,且已有用户需重新设置口令以生成 SCRAM verifier。

cert 基于 TLS 客户端证书,配合 clientcert=verify-full 可校验证书链与 CN 映射,强度很高,适合服务间或高安全要求的远程接入。gss 依赖 Kerberos,ldap、radius、pam 将认证委托给外部系统,其强度取决于外部系统的口令策略与传输安全。审计时需确认外部连接是否使用 LDAPS 或加密通道。

三、审计实操与判断依据

审计第一步是定位配置文件。可通过 SHOW hba_file; 确认实际路径,避免修改了错误的文件。随后检查规则顺序与地址范围,重点识别 trust、md5、0.0.0.0/0、::/0 等高风险组合。修改后必须执行 SELECT pg_reload_conf(); 或 pg_ctl reload,并用 pg_hba_file_rules 视图核对加载结果与错误信息。

SELECT line_number, type, database, user_name, address, auth_method, error
FROM pg_hba_file_rules
ORDER BY line_number;

该视图会显示每条规则的解析结果,error 字段非空表示该行存在语法或语义问题。审计报告应记录:规则行号、匹配范围、认证方法、风险等级与整改建议。对于无法立即迁移 md5 的环境,可先限制其来源地址,再逐步切换。

注意:pg_hba.conf 的修改不会自动生效,必须 reload。若规则顺序错误,可能导致合法用户被拒绝或非法用户被放行,变更前应备份原文件并在测试环境验证。
合规检查建议:远程连接一律使用 hostssl + scram-sha-256 或 cert;本地管理使用 peer;末尾保留 reject 兜底;定期用 pg_hba_file_rules 做自动化巡检。