第一次接触KingbaseES的HBA配置时,我也被那一堆参数搞得头晕眼花。简单来说,HBA就是数据库的"门禁系统",决定了谁可以进门、用什么方式进门、能进哪个房间。这个门禁系统的规则都写在sys_hba.conf文件里,默认路径在数据目录下,可以通过show hba_file;命令查看。
这个配置文件最神奇的地方在于它的"自上而下匹配"机制。就像小区门禁先检查业主名单,再检查访客名单一样,数据库会从上到下逐条检查HBA规则,遇到第一个匹配的规则就立即执行。我曾经遇到过因为规则顺序不对导致连接被拒绝的情况,后来才明白要把精确匹配的规则放在前面,通用规则放在后面。
配置文件的每一行都像是一张定制化的通行证,包含五个关键要素:连接类型(TYPE)、数据库名(DATABASE)、用户名(USER)、客户端地址(ADDRESS)和认证方式(METHOD)。举个例子:
bash复制hostssl db1 user1 192.168.1.100/32 scram-sha-256
这条规则的意思是:允许用户user1通过SSL加密连接,从IP 192.168.1.100访问db1数据库,并且使用scram-sha-256加密认证。
连接类型决定了"从哪来"和"怎么来"的问题。最常见的几种类型我都用过:
local all all trust,省去密码验证的麻烦。host all all 0.0.0.0/0 trust,差点酿成安全事故。DATABASE和USER字段支持多种灵活的匹配方式:
all不包括replication连接。@filename方式引用外部文件。有次用户太多,我就把用户列表写进文件维护。实际项目中,我常用这样的组合:
bash复制host @dblist +developers 10.0.0.0/8 md5
表示允许开发组的成员从内网访问数据库列表中的库。
ADDRESS字段支持CIDR格式的IP段匹配,也支持主机名。踩过的几个坑:
::1/128格式,刚开始总忘记加后缀samehost匹配本机所有IP,测试时比写死IP方便推荐的生产环境配置示例:
bash复制hostssl prod_db app_user 192.168.1.0/24 scram-sha-256
我把常用认证方式的安全性做了个对比:
| 认证方式 | 安全性 | 适用场景 | 注意事项 |
|---|---|---|---|
| trust | 无 | 本地开发环境 | 生产环境绝对禁用 |
| password | 低 | 遗留系统兼容 | 密码明文传输 |
| md5 | 中 | 传统系统 | 存在彩虹表破解风险 |
| scram-sha-256 | 高 | 新系统标准配置 | 需要客户端支持 |
| cert | 最高 | 金融级安全要求 | 证书管理复杂 |
根据项目经验,我总结了几条黄金法则:
生产环境必须禁用trust:有次紧急排查问题时临时开了trust,结果忘记关掉,被安全扫描发现后通报批评。
优先使用scram-sha-256:相比md5,它能有效防止重放攻击。迁移时遇到老客户端不支持的问题,后来找到了兼容方案。
SSL加密不能少:配置hostssl时要注意:
bash复制# 先确认SSL已启用
show ssl;
# 必要的ssl参数
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
最小权限原则:给应用账号只分配必要的数据库权限。我们有个服务被入侵,幸好数据库权限限制得好,损失才没扩大。
我的本地开发环境通常这样配置:
bash复制# 本地连接免密
local all all trust
# 内网开发机访问
host dev_db dev_user 10.1.1.0/24 md5
# 禁止其他所有连接
host all all 0.0.0.0/0 reject
注意要把reject规则放在最后,否则会成为"拒绝所有"的配置。
金融项目中的严格配置示例:
bash复制# 管理员专用通道
hostssl all dbadmin 10.0.100.1/32 cert clientcert=verify-ca
# 应用服务访问
hostssl payment_db app_payment 10.0.2.0/24 scram-sha-256
# 报表只读账号
hostssl report_db reader 10.0.3.0/24 scram-sha-256
# 默认拒绝规则
host all all 0.0.0.0/0 reject
这套配置实现了:
遇到连接问题时,我的排查清单:
log_connections和log_disconnections是否开启psql -h IP -U user -d db指定参数连接有次客户端报"no pg_hba.conf entry"错误,最后发现是客户端DNS解析问题,改用IP后解决。