PostgreSQL 认证与HBA

认证是数据库验证来访连接身份的过程。Pigsty默认使用PG的HBA机制提供访问控制。

HBA是Host Based Authentication的缩写,可以将其视作IP黑白名单。

HBA配置方式

在Pigsty中,所有实例的HBA都由配置文件生成而来,最终生成的HBA规则因实例的角色( pg_role )而不同。 Pigsty的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
  7. # allow local user password access
  8. local all all md5
  9. # allow local/intranet replication with password
  10. local replication replicator md5
  11. host replication replicator 127.0.0.1/32 md5
  12. host all replicator 10.0.0.0/8 md5
  13. host all replicator 172.16.0.0/12 md5
  14. host all replicator 192.168.0.0/16 md5
  15. host replication replicator 10.0.0.0/8 md5
  16. host replication replicator 172.16.0.0/12 md5
  17. host replication replicator 192.168.0.0/16 md5
  18. # allow local role monitor with password
  19. local all dbuser_monitor md5
  20. host all dbuser_monitor 127.0.0.1/32 md5
  21. #==============================================================#
  22. # Extra HBA
  23. #==============================================================#
  24. # add extra hba rules here
  25. #==============================================================#
  26. # primary HBA
  27. #==============================================================#
  28. #==============================================================#
  29. # special HBA for instance marked with 'pg_offline_query = true'
  30. #==============================================================#
  31. #==============================================================#
  32. # Common HBA
  33. #==============================================================#
  34. # allow meta node password access
  35. host all all 10.10.10.10/32 md5
  36. # allow intranet admin password access
  37. host all +dbrole_admin 10.0.0.0/8 md5
  38. host all +dbrole_admin 172.16.0.0/12 md5
  39. host all +dbrole_admin 192.168.0.0/16 md5
  40. # allow intranet password access
  41. host all all 10.0.0.0/8 md5
  42. host all all 172.16.0.0/12 md5
  43. host all all 192.168.0.0/16 md5
  44. # allow local read/write (local production user via pgbouncer)
  45. local all +dbrole_readonly md5
  46. host all +dbrole_readonly 127.0.0.1/32 md5
  47. #==============================================================#
  48. # Ad Hoc HBA
  49. #===========================================================

修改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规则允许从本地和内网通过密码访问

  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
  7. - title: intranet password access
  8. role: common
  9. rules:
  10. - host all all 10.0.0.0/8 md5
  11. - host all all 172.16.0.0/12 md5
  12. - host all all 192.168.0.0/16 md5

最后修改 2022-05-27: init commit (1e3e284)