PostgreSQL数据库pg_hba.conf文件学习笔记

对于PostgreSQL数据库的pg_hba.conf文件从以下几个方面来学习。

1 pg_hba.conf的作用

pg_hba.conf文件是数据库判断客户端/应用程序能否正常访问数据库的唯一依据。(HBA stands for host-based authentication.)

略微牵强一点儿的横向比较的话,其作用类似于Oracle数据库的listener.ora文件。

pg的客户端访问数据库的时候,需要提供数据库服务器主机名或者IP地址,端口号,数据库名,数据库用户名,以及数据库用户密码或者数据库认证方式。而这些信息是存在于pg_hba.conf文件中的。同样,Oracle客户端访问数据库的过程中,也需要提供Oracle数据库主机名或者IP地址,端口号,访问协议,以及服务名。而这些信息是记录在listener.ora文件中的。

2 pg_hba.conf的位置

默认情况下,该文件位于数据库服务器的data路径下,名为pg_hba.conf。当然,这些都不是绝对的,尤其对于Unix/Linux环境下,文件的扩展名只是一种约定的惯例,并不像windows平台下,但凡.exe代表可执行文件等。

可以在psql命令行中,通过超级用户执行show hba_file来获取pg_hba.conf的具体路径。

postgres=# show hba_file ;
              hba_file               
-------------------------------------
 /orabackup/pg9.6.4/data/pg_hba.conf
(1 row)

postgres=#

如果是没有权限的普通用户执行该命令,可能会有下述错误:

ai=> show hba_file;
ERROR:  must be superuser to examine "hba_file"
ai=>

 

如果需要修改或者调整配置文件pg_hba.conf的路径的话,需要通过修改postgresql.conf文件中hba_file参数来实现,并且要提前做好pg_hba.conf文件的备份,以及需要重启数据库才能使修改生效。

3 pg_hba.conf的内容

  • 该文件是一个普通的文本类型文件,可以直接用文本编辑器编辑修改;
  • 以#开头行的是注释行;
  • 以行为单位,每一行是一个有效的记录,不允许不支持跨行的记录存在;
  • 每一个生效的行记录都包含:连接类型、数据库名、用户名、允许的客户端IP地址或地址段、认证方式,这5个字段。且,各字段之间以空格分开。类似如下:
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             172.0.0.0/8             md5

这里local开头的行,表示的是数据库允许通过主机服务器的Unix socket通信来访问和连接数据库。如果没有local开头的行,则意味着数据库不接受socket通信的连接访问方式。说白了,就是没有这一行的话,或注释掉改行的话,则无法通过简单的psql来访问数据库:

[postgres@localhost data]$ psql
psql: FATAL:  no pg_hba.conf entry for host "[local]", user "postgres", database "postgres"
[postgres@localhost data]$

第1个host开头的行,意味着,允许接受客户端为数据库主机环路地址127.0.0.1上,通过提供数据库IP地址,端口,数据库名、用户名的方式来访问数据库,认证方式为trust,即不需要提供密码的方式来访问数据库。且,可以以数据库中已经存在的任意用户来访问任意数据库,如:

[postgres@localhost data]$ psql -h localhost -p 5432 -d postgres -U postgres
psql (9.6.4)
Type "help" for help.

postgres=# \q
[postgres@localhost data]$ psql -h 127.0.0.1 -p 5432 -d postgres -U ai
psql (9.6.4)
Type "help" for help.

postgres=>

第2个host开头的行,意味着,允许从IP范围是172.0.0.0到172.254.254.254之间的任意地址,以数据库中已经存在的用户,发起到任意数据库的连接请求,但是必须要提供用户口令,因为认证方式是是通过md5加密的。如:

[postgres@localhost data]$ psql -h 172.16.11.35 -p 5432 -d postgres -U enterprisedb
Password for user enterprisedb: 
psql (9.6.4, server 9.3.11.33)
Type "help" for help.

postgres=#

从IP为172.18.1.12的客户端,发起到172.16.11.35服务端的连接请求,在提供名为enterprisedb的数据库用户密码之后,顺利连接到服务器。

  • 连接类型,除了local、host之外,还有hostssl和hostnossl方式;
  • 数据库和用户名字段的all,表示可以访问任意数据库,以及以任意数据库用户发起对于数据库的访问,如果需要对于特定的数据库和特定的用户作限制的话,则应该明确写出库名和数据库用户名;
  • 数据库在做连接验证的过程中,对于该文件是从上向下查找的,如果找到一条记录匹配客户端发起的数据库连接请求,则参照该记录来验证,不再继续向下找,验证成功则访问数据库成功,反之失败,如下:

pg_hba.conf含有下述2条记录:

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5 
host    all             all             127.0.0.1/32            trust

那么,此时,数据库选择第一条记录来验证,就必须的正确的输入数据库用户postgres的口令,否则会报错。如下:

[postgres@localhost data]$ psql -h 127.0.0.1 -p 5432 -d postgres -U postgres
Password for user postgres: 
psql: FATAL:  password authentication failed for user "postgres"
[postgres@localhost data]$

显然,对于这次验证失败,数据库并没有选择第2条验证方位为trust的无需密码的方式来验证;

  • 对于数据库名字段上,如果需要匹配多个数据库的话,可以用逗号分隔开多个数据库的库名;
  • 数据库字段名上,如果出现replication的话,并不表示对于名为replication的数据库名授权验证,而是验证一个来自物理备库的连接请求;
  • address字段上,如下:
172.20.143.89/32 for a single host,只匹配172.20.143.89这一个IP地址;
172.20.143.0/24 for a small network,匹配从172.20.143.0到172.20.143.254这个地址段;
10.6.0.0/16 for a larger one,匹配从10.6.0.0到10.6.254.254地址段;
::1/128 for a single host ,匹配IPv6的本地环路地址,等价于IPv4的127.0.0.1;
0.0.0.0/0 represents all IPv4 addresses,匹配所有IPv4的地址;
::0/0 represents all IPv6 addresses,匹配所有IPv6地址;

4 修改pg_hba.conf的内容

通过文本编辑器,按照其固定格式,直接修改完该文件之后,需要执行pg_ctl reload使其生效。

5 个人收获

  • 从基础知识点上搞清楚了该文件的作用;
  • 明白了该文件中local那一行的真正具体含义;
  • 学会了该文件和postgrres.conf文件中的listen_address参数一起搭配来控制,通过网络来访问数据库的控制和限制;如果listen_addresses =’localhost’时,则该数据库不允许任何通过网络方式来的异机访问,只允许通过数据库服务器本机连接本机上的数据库;
  • 学到了一点儿关于网络掩码的设置,如172.20.143.0/24的具体含义。

更为详细的信息,可以进一步查看官方文档:https://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html

发表评论

邮箱地址不会被公开。 必填项已用*标注