身份认证
HBA 规则、密码策略与证书认证,回答“谁能连进来、如何证明身份”。
身份认证解决三个核心问题:
- 你是谁:身份是否唯一可识别?
- 你怎么证明:密码/证书是否足够安全?
- 你从哪里来:来源是否受控?
Pigsty 使用 HBA 规则 + 密码/证书 完成身份认证,并以 SCRAM 为默认密码哈希方案。
认证链路
flowchart LR C[客户端] --> HBA[HBA 规则] HBA --> A1[密码 SCRAM] HBA --> A2[证书认证] HBA --> A3[本地 ident/peer] A1 --> RBAC[角色与权限] A2 --> RBAC A3 --> RBAC
HBA 决定“谁能从哪里来”,认证方式决定“如何证明身份”。
HBA 分层模型
Pigsty 默认 HBA 规则已经分层:
- 本地使用
ident/peer,最安全。 - 内网使用
scram密码认证。 - 外网管理员必须走
ssl。
这解决了“同一个用户在不同来源使用不同认证强度”的问题。
HBA 规则的关键能力
- 顺序优先:支持
order排序,数值越小优先级越高。 - 地址别名:
local/localhost/intra/world等。 - 角色条件:
primary/replica/offline可精细化控制。
密码认证
默认密码哈希算法:
pg_pwd_enc: scram-sha-256
解决的问题
- 明文密码存储风险
- 弱哈希被离线破解
兼容性
如需兼容老客户端可使用 md5,但会降低安全性。
密码强度与轮换
Pigsty 支持启用密码强度检查扩展:
pg_libs: '$libdir/passwordcheck, pg_stat_statements, auto_explain'
pg_extensions: [ passwordcheck, credcheck ]
通过 expire_in 控制账号过期时间:
pg_users:
- { name: dbuser_app, password: 'StrongPwd', expire_in: 365 }
解决的问题
- 弱口令与口令复用
- 长期不轮换的账号风险
证书认证
证书认证解决“密码被钓鱼/被拷贝”的风险。
- HBA
auth: cert要求客户端证书。 - 证书
CN通常对应数据库用户名。 - Pigsty 内置
cert.yml用于签发客户端证书。
PgBouncer 认证
PgBouncer 使用独立 HBA 规则与 TLS 设置:
pgbouncer_sslmode: disable # 默认关闭,可设为 require/verify-full
pgb_default_hba_rules: [...] # 独立规则
这解决了“连接池入口与数据库入口不同步”的问题。
默认账号与风险
| 用户 | 默认密码 | 风险 |
|---|---|---|
dbuser_dba | DBUser.DBA | 管理账号默认密码 |
dbuser_monitor | DBUser.Monitor | 监控账号易被滥用 |
replicator | DBUser.Replicator | 复制账号被滥用可导致数据外泄 |
生产环境必须修改默认密码。
安全建议
- 对外入口全部启用
ssl/cert。 - 内网用户使用
scram,避免md5。 - 启用
passwordcheck强制复杂度。 - 定期轮换口令(
expire_in)。