怎么在PostgreSQL中利用pg_hba.conf实现一个客户端认证功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
在initdb初始化数据文件时,默认提供pg_hba.conf。通过配置该文件,能够指定哪些ip可以访问,哪些ip不可以访问,以及访问的资源和认证方式,该文件类似于甲骨文中的监听中的白名单黑名单功能,且同样可以重载在线生效。
记录可以是下面七种格式之一:
local database user auth-method [auth-options] host database  user address  auth-method [auth-options] hostssl database  user address  auth-method [auth-options] hostnossl database  user address  auth-method [auth-options] host database  user IP-address IP-mask  auth-method [auth-options] hostssl database  user IP-address IP-mask  auth-method [auth-options] hostnossl database  user IP-address IP-mask  auth-method [auth-options]
各个域的含义如下:
各个类型简单描述如下:
<代码>本地代码>
一般为本地插座连接。如果没有这种类型的记录,就不允许Unix域套接字连接。
<代码>主机代码>
这条记录匹配企图使用TCP/IP建立的连接.host记录匹配SSL和非SSL的连接尝试。
<代码>数据库代码>
登录时指定的数据库,所有匹配所有数据库;注意pg是单实例多数据库类型。
<代码>用户代码>
登录时指定的数据库用户名,所有的匹配所有用户
<代码>地址代码>
指定这个记录匹配的客户端机器地址。这个域可以包含一个主机名,一个IP地址范围或下文提到的特殊关键字之一。比如网络地址(172.20.143.0/24)以及分别指定IP以及掩码。
<代码>认证方法代码>
客户端采用的认证方式,比如信任为无条件地允许联接;拒绝为无条件拒绝连接;密码为明文密码验证;md5密文密码验证等
如下为几种策略(条目)配置的简单描述:
TYPE DATABASE USER ADDRESS 方法 local all  all 信任
该认证方式为本地本地套接字方式验证,且无条件接受连接。
TYPE DATABASE USER ADDRESS 方法 host all  all 127.0.0.1/32 信任
该认证方式为允许主机(本地127.0.0.1)进行访问且无条件接受连接。
TYPE DATABASE USER ADDRESS 方法 host postgres  all 192.168.93.0/24  md5
该认证方式为允许192.168.93网段的客户端所有用户访问postgres数据库
TYPE DATABASE USER IPADDRES IPMASK 方法 host dbinst1  user1 192.168.93.21 255.255.255.0  md5
该认证方式为允许192.168.93.21的客户端以user1用户访问dbinst1数据库
通过一番文字描述,最后在来个实际操作,如下案例中可以发现未配置pg_hba.conf策略(条目)则在尝试访问pg时会自动提示无匹配的pg_hba。conf条目。通过配置条目并重新加载后,客户端便可正常访问pg。这个条目类似于防火墙中配置的逐条策略。
注意虽然pg_bha.conf起到了一部分的客户端访问控制的作用,但是数据库实例层仍然需要做好对应权限控制,比如上文案例中已提前授予user1对dbinst1数据库的连接权限,客户端才可以正常登陆数据库。
总结一下pg_hba.conf就是类似于甲骨文的黑白名单功能的过滤器。
<强>补充:从pg_hba.conf文件谈谈PostgreSQL的连接认证强>
最近一直在弄PostgreSQL的东西,搭建PostgreSQL数据库集群环境什么的。操作数据库少不得要从远程主机访问数据库环境,例如数据库管理员的远程管理数据库,远程的客户存取数据库文件。
而在PostgreSQL中配置文件pg_hba.conf就是用来设置访问认证的重要文件。这里重点谈谈pg_hba.conf这个文件。
首先声明,本文说明的内容基于PostgreSQL的9.5.4版本,可能和某些低版本的说明有出入,这是PostgreSQL官方自己更新的,如果想看低版本的,可以自己查看下那个对应版本的用户手册。