PostgreSQL 认证与HBA
认证是数据库验证来访连接身份的过程。Pigsty默认使用PG的HBA机制提供访问控制。
HBA是Host Based Authentication的缩写,可以将其视作IP黑白名单。
HBA配置方式
在Pigsty中,所有实例的HBA都由配置文件生成而来,最终生成的HBA规则因实例的角色( pg_role )而不同。 Pigsty的HBA由下列变量控制:
- pg_hba_rules: 环境统一的HBA规则
- pg_hba_rules_extra: 特定于实例或集群的HBA规则
- pgbouncer_hba_rules: 连接池使用的HBA规则
- pgbouncer_hba_rules_extra: 特定于实例或集群的连接池HBA规则
每个变量都是由下列样式的规则组成的数组:
1. - title: allow intranet admin password access
2. role: common
3. rules:
4. - host all +dbrole_admin 10.0.0.0/8 md5
5. - host all +dbrole_admin 172.16.0.0/12 md5
6. - host all +dbrole_admin 192.168.0.0/16 md5
基于角色的HBA
role = common的HBA规则组会安装到所有的实例上,而其他的取值,例如(role : primary)则只会安装至pg_role = primary的实例上。因此用户可以通过角色体系定义灵活的HBA规则。
作为特例,role: offline 的HBA规则,除了会安装至pg_role == 'offline'的实例,也会安装至 pg_offline_query == true的实例上。
HBA的渲染优先级规则为:
hard_coded_rules全局硬编码规则pg_hba_rules_extra.common集群通用规则pg_hba_rules_extra.pg_role集群角色规则pg_hba_rules.pg_role全局角色规则pg_hba_rules.offline集群离线规则pg_hba_rules_extra.offline全局离线规则pg_hba_rules.common全局通用规则
默认HBA规则
在默认配置下,主库与从库会使用以下的HBA规则:
- 超级用户通过本地操作系统认证访问
- 其他用户可以从本地用密码访问
- 复制用户可以从局域网段通过密码访问
- 监控用户可以通过本地访问
- 所有人都可以在元节点上使用密码访问
- 管理员可以从局域网通过密码访问
- 所有人都可以从内网通过密码访问
- 读写用户(生产业务账号)可以通过本地(连接池)访问 (部分访问控制转交连接池处理)
- 在从库上:只读用户(个人)可以从本地(连接池)访问。 (意味主库上拒绝只读用户连接)
pg_role == 'offline'或带有pg_offline_query == true的实例上,会添加允许dbrole_offline分组用户访问的HBA规则。
默认HBA规则详情
1. #==============================================================#
2. # Default HBA
3. #==============================================================#
4. # allow local su with ident"
5. local all postgres ident
6. local replication postgres ident
8. # allow local user password access
9. local all all md5
11. # allow local/intranet replication with password
12. local replication replicator md5
13. host replication replicator 127.0.0.1/32 md5
14. host all replicator 10.0.0.0/8 md5
15. host all replicator 172.16.0.0/12 md5
16. host all replicator 192.168.0.0/16 md5
17. host replication replicator 10.0.0.0/8 md5
18. host replication replicator 172.16.0.0/12 md5
19. host replication replicator 192.168.0.0/16 md5
21. # allow local role monitor with password
22. local all dbuser_monitor md5
23. host all dbuser_monitor 127.0.0.1/32 md5
25. #==============================================================#
26. # Extra HBA
27. #==============================================================#
28. # add extra hba rules here
30. #==============================================================#
31. # primary HBA
32. #==============================================================#
34. #==============================================================#
35. # special HBA for instance marked with 'pg_offline_query = true'
36. #==============================================================#
38. #==============================================================#
39. # Common HBA
40. #==============================================================#
41. # allow meta node password access
42. host all all 10.10.10.10/32 md5
44. # allow intranet admin password access
45. host all +dbrole_admin 10.0.0.0/8 md5
46. host all +dbrole_admin 172.16.0.0/12 md5
47. host all +dbrole_admin 192.168.0.0/16 md5
49. # allow intranet password access
50. host all all 10.0.0.0/8 md5
51. host all all 172.16.0.0/12 md5
52. host all all 192.168.0.0/16 md5
54. # allow local read/write (local production user via pgbouncer)
55. local all +dbrole_readonly md5
56. host all +dbrole_readonly 127.0.0.1/32 md5
58. #==============================================================#
59. # Ad Hoc HBA
60. #===========================================================
修改HBA规则
HBA规则会在集群/实例初始化时自动生成。
用户可以在数据库集群/实例创建并运行后通过剧本修改并应用新的HBA规则:
1. ./pgsql.yml -t pg_hba # 通过-l指定目标集群
2. bin/reloadhba <cluster> # 重载目标集群的HBA规则
当数据库集簇目录被销毁重建后,新副本会拥有和集群主库相同的HBA规则(因为从库的数据集簇目录是主库的二进制副本,而HBA规则也在数据集簇目录中)。 这通常不是用户期待的行为。您可以使用上面的命令针对特定实例进行HBA修复。
Pgbouncer的HBA
在Pigsty中,Pgbouncer亦使用HBA进行访问控制,用法与Postgres HBA基本一致
- pgbouncer_hba_rules: 连接池使用的HBA规则
- pgbouncer_hba_rules_extra: 特定于实例或集群的连接池HBA规则
默认的Pgbouncer HBA规则允许从本地和内网通过密码访问
1. pgbouncer_hba_rules: # pgbouncer host-based authentication rules
2. - title: local password access
3. role: common
4. rules:
5. - local all all md5
6. - host all all 127.0.0.1/32 md5
8. - title: intranet password access
9. role: common
10. rules:
11. - host all all 10.0.0.0/8 md5
12. - host all all 172.16.0.0/12 md5
13. - host all all 192.168.0.0/16 md5
最后修改 2022-05-27: init commit (1e3e284)
