初识postgresql的时候,觉得它的连接认证真几把烦人。每次也都是直接在网上搜索复制,不求甚解。今天安装bucardo做双主复制的时候,又被这个连接认证搞的头疼。索性好好试验了一方,才发现网上根本就没人好好说过ident连接方式失败的原因,全是复制文。。。哎。
先贴上官方文档:https://www.postgresql.org/docs/10/auth-pg-hba-conf.html
在实际使用时候,通常只会用到下面这种格式:
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 trust host all all 0.0.0.0/0 md5 # IPv6 local connections: host all all ::1/128 ident # Allow replication connections from localhost, by a user with the # replication privilege. local replication all peer host replication all 127.0.0.1/32 ident host replication all ::1/128 ident
首先需要知道的是,postgresql进行连接认证的时候是从pg_hba.conf文件中由上往下逐条匹配的,匹配到后就不会再往下找了。
接下来讲一下常用的几个字段的含义。
TYPE
local,表示使用unix socket的连接。当然这么说其实我也是不清不楚的,但是只需要知道在本机使用psql不加-h参数属于local类型。
host,表示使用ip进行的连接。注意使用host类型,必须开启postgres.conf中的listen_addresses项。本机使用psql加-h参数属于host类型,所有其他通过服务器ip进行连接的都属于host类型。
DATABASE
允许连接的数据库名,可以用逗号分隔多个数据库名。
all 表示所有数据库。
replication 表示该连接是用来进行流复制。
USER
用户名,多个用户可以用逗号隔开。
all 表示所有用户。
ADDRESS
0.0.0.0/0 代表所有IPv4地址,
::0/0 代表所有IPv6地址,
172.20.143.89/32 表示一个主机,
172.20.143.0/24 表示一个网段。
METHOD
peer,只用于local类型。表示使用当前的系统登录用户进行连接,并且要求postgresql库中必须有同名的用户。
ident,只用于host类型,有点类似于peer。表示使用从客户端的ident server获取当前用户进行连接,并且要求postgresql库中必须有同名用户。注意,千万别配置ident方式,因为一般系统是没有装这个ident server服务的!(how to install ident server)你得到的只会是一个错误信息:”FATAL: Ident authentication failed for user xxx”
md5,使用密码进行连接(注意,默认的postgres用户是无密码的。所以想要用密码连接postgres用户,必须先设置它的密码)
trust,无条件地允许连接
reject,拒绝连接
所以最常用的就是peer与md5方式(后续版本好像改成 scram-sha-256 了)。