首页/安全/安全加固速查/PostgreSQL pg_hba 与监听收敛
服务与端口收敛50 条

PostgreSQL pg_hba 与监听收敛

Postgres 的访问控制核心在 pg_hba.conf:禁止 trust、限定网段、按用户库级最小授权;listen_addresses 只绑内网。

安全加固速查安全更新于 2026-10-13

pg_hba 与监听地址

pg_hba.conf 是 PostgreSQL 的客户端认证控制文件,按「来源地址 + 数据库 + 用户」自上而下逐条匹配,决定这条连接用哪种方式认证(trust、peer、md5、scram-sha-256)。listen_addresses 则决定实例监听在哪些网卡上。两者叠加构成了数据库的暴露边界:一旦端口对公网开放且规则里存在 trust,客户端连接无需口令,数据库等于对所有人敞开。

基本信息

适用平台Linux(PostgreSQL 9.6 及以上)
配置文件/etc/postgresql/<版本>/main/pg_hba.conf
生效方式reload(不需要重启实例)
基线要求无 trust 行、只监听本机与内网、口令用 scram-sha-256
默认端口5432

典型使用场景

  • 数据库迁移或上云后,核对外网是否可以直接连到 5432
  • 安全整改时逐条清理 pg_hba 中的 trust 与 0.0.0.0/0 规则
  • 新建实例时按业务网段规划来源与认证方式
  • 应用连不上数据库时,排查认证方式、监听地址与来源网段
  • 确认云主机安全组与 pg_hba 是否出现重复放行

核查现状

核查现状
ss -tlnp | grep ':5432 '                    # 确认监听地址与所属进程
psql -c "SHOW listen_addresses;"              # 实际生效的监听范围
psql -c "SHOW password_encryption;"          # 当前的存储与校验方式
grep -Ev '^#|^$' /etc/postgresql/*/main/pg_hba.conf | tail -20   # 文件末尾的规则优先匹配

收敛写法

收敛写法
listen_addresses = '127.0.0.1,10.0.0.5'   # 只绑定本机与内网地址
password_encryption = 'scram-sha-256'      # 新环境直接使用 scram
# pg_hba.conf 中的一条规则示例(按来源网段最小化):
# host    appdb    appuser    10.0.0.0/8    scram-sha-256

复核必查项

检查项含义处置
trust 行完全免密的认证方式发现即改并轮换相关口令
0.0.0.0/0允许任意来源连接收敛到业务网段
listen_addresses实例监听的网卡范围只绑本机或内网地址
认证方式md5 与 scram 的强度差异新环境统一用 scram-sha-256
匹配顺序自上而下首条命中生效调整时注意前后行互相覆盖
trust 表示连接时连口令都不用输;公网可达时数据库对所有扫描者开放。发现 trust 行必须立即整改,并把涉及的库账号口令全部轮换。
pg_hba.conf 改完 reload 就生效(systemctl reload postgresql 或 pg_ctl reload),不必重启;而 listen_addresses 属于 postgresql.conf,同样 reload 后实例会重新绑定监听地址。

易错点

  • 改完 pg_hba 忘记 reload,误以为配置没生效而反复改文件,改完应 reload 并用 psql 实际连一次验证
  • 照抄网络样例里的 0.0.0.0/0 规则,等于把数据库暴露给整个网络,来源网段必须按业务最小化
  • md5 在新版本中已逐步被 scram-sha-256 取代,存储与传输强度不同,新装环境直接选 scram
  • 以为安全组管了外网就不用管 pg_hba,两者是叠加关系,任何一层放开都会暴露数据库

数据来源与参考

  • PostgreSQL 官方文档:pg_hba.conf
  • CIS Benchmark:PostgreSQL 条目

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌