作者:瀚高PG实验室 (Highgo PG Lab)- 天蝎座
highgo=# select version();
version
----------------------------------------------------------------------------------------------------------
PostgreSQL 9.5.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11), 64-bit
(1 row)
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all ident
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 0.0.0.0/0 trust
# IPv6 local connections:
host all all ::1/128 md5
TYPE定义了多种连接PostgreSQL的方式,分别是:
“local”使用本地unix套接字
“host”使用TCP/IP连接(包括SSL和非SSL)
“host”结合“IPv4地址”使用IPv4方式,结合“IPv6地址”则使用IPv6方式
“hostssl”只能使用SSL TCP/IP连接
“hostnossl”不能使用SSL TCP/IP连接
DATABASE指定哪个数据库,多个数据库,库名间以逗号分隔。
当PostgreSQL遍历pg_hba.conf文件时,它将使用匹配的第一条规则。
所以,如果我们的请求来自192.168.1.54,那么第一条规则在我们到达第二条之前总是匹配的。
这意味着如果密码和用户是正确的,192.168.1.54将能够登录; 因此,第二条规则是毫无意义的。
所以说pg_hba.conf文件中,从上到下是存在“优先级”的概念的,不知道这种描述是否准确。
但是大概就是这个意思,例如:
host all all 0.0.0.0/0 trust
host all all 192.168.1.54/32 MD5
这种情况下如果远程主机192.168.1.54 想要连接数据库,那么很明显,已经适配了第一条规则,所以不需要密码就可以连接数据库。
md5是常用的密码认证方式,如果你不使用ident,最好使用md5。密码是以md5形式传送给数据库,较安全,且不需建立同名的操作系统用户。
password是以明文密码传送给数据库,建议不要在生产环境中使用。
trust是只要知道数据库用户名就不需要密码或ident就能登录,建议不要在生产环境中使用。
reject是拒绝认证。
本地使用psql登录数据库,是以unix套接字的方式,附合local方式。
pg_hba.conf修改后,使用pg_ctl reload重新读取pg_hba.conf文件,如果pg_ctl找不到数据库,则用-D/…/pgsql/data/指定数据库目录,或export PGDATA=/…/pgsql/data/导入环境变量。
另:PostgreSQL默认只监听本地端口,用netstat -tuln只会看到“tcp 127.0.0.1:5432 LISTEN”。
修改postgresql.conf中的listen_address=*,监听所有端口,这样远程才能通过TCP/IP登录数据库,用netstat -tuln会看到“tcp 0.0.0.0:5432 LISTEN”。