PostgresSql的访问控制文件pg_hba.conf位于/var/lib/pgsql/11/data,主要的作用是控制控制哪些IP地址可以访问数据库。
# TYPE DATABASE USER METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# 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
host all all 0.0.0.0/0 trust
它每一行代表一个完整的配置,每行都包含相同的几个字段,字段的含义如下
链接的类型,目前比较常用的链接类型主要有以下四种
TYPE |
说明 |
local |
定义本地的链接类型,配置时通过本地的UNIX套接字进行链接,如果配置了,我们在本机上使用psql时可以不用输入服务端的IP和端口号,默认以操作系统的用户进行登录,但是需要注意两点: 1、默认登录的端口号是5432,如果数据库没有采用该端口号,则需要显式的用-p参数进行指明 2、数据库中必须创建和和当前操作系统用户同名的数据库用户 |
host |
该类型下,配置数据库支持远程TCP/IP链接,如果数据库需要配置局域网或者外网进行访问,需要进行该类型的配置。 |
hostssl |
该类型的记录匹配使用TCP/IP的SSL链接,必须使用SSL加密才能链接数据库。 |
hostnossl |
该配置和hostssl相反,只匹配不使用SSL的TCP/IP链接 |
配置支持链接的数据库,有三种不同的配置方案:
DATABASE |
说明 |
数据库名称 |
这里可以配置数据库名称,意思就是对配置的数据库支持远程或者本地链接的配置。 |
all |
表明当前的配置针对所有的数据库生效 |
replication |
这是流复制链接的配置,在PG的主从配置中会用到 |
配置进行链接的用户,需要注意的是这里是指的数据库的用户,而非操作系统的用户,如果配置了all表示接受所有数据库用户的链接。
允许或者拒绝远端链接的IP地址,TYPE配置的是local可以为空,当时TYPE配置的是host时,必须进行配置,配置的格式是
认证的方法,主要有以下几种:
METHOD |
说明 |
trust |
无条件的允许链接。在此种认证方法下,数据库用户进行连接时不需要输入任何口令。 |
reject |
无条件的拒绝连接。在此种认证方法下,数据库会拒绝该连接(即,配置连接的黑名单)。 |
md5 |
要求客户端提供一个MD5加密的口令的认证。这种模式下,客户端在网络上传递的口令经过了MD5加密,防止在网络上明文传输,造成口令的泄露。 |
password |
要求客户端提供一个明文口令,这种模式下,客户端提供的口令会以明文的形式在网络上传递,具有泄露的风险,一般不会采用该种方式。 |
ident |
服务器会联系客户端的ident服务,验证当前的用户在客户端上是不是操作系统的有效用户,如果是,则链接成功;如果不是则链接失败。这种方式通常和UNIX域套接字的链接认证方式一起使用,此时和peer认证的效果一致。 |
peer |
使用操作系统用户登录,链接的用户是操作系统上某个操作系统的用户,但是需要注意的是数据库中要存在和操作系统一样的同名用户。 |
# TYPE DATABASE USER ADDRESS METHO
local all all trust
在该配置下,在使用数据库用户登录时不会提示输入密码:
[root@VM-115-39-centos test]# psql -p 55432 -U postgres
psql (11.8)
Type "help" for help.
postgres=#
# TYPE DATABASE USER ADDRESS METHO
local all all ident
这种认证模式下,如果再使用2.1中的链接命令,会发现提示错误:
[root@VM-115-39-centos data]# psql -p 55432 -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
从这个错误中,我们可以看到,提示的是Peer authentication failed,这是因为,实际上我们再本地配置的METHOD设置为trust时,它实际会被替换成peer认证,也就是说再TYPE为local时,设置METHOD为ident和peer的效果是一致的。此时我们需要先以postgres的身份登录,然后才能链接服务端:
[root@VM-115-39-centos data]# su - postgres
Last login: Thu Jun 10 16:19:23 CST 2021 on pts/1
[postgres@VM-115-39-centos ~]psql -p 55432
psql (11.8)
Type "help" for help.
postgres=#
这里还要注意一下,在终端中切换到postgres用户登录时,我们要使用su - postgres 而不能使用su postgres,因为后者只是用户身份的切换,不会改变当前工作目录以及HOME,SHELL,USER,LOGNAME。
# TYPE DATABASE USER ADDRESS METHO
local all all md5
在此种认证方式下,在本地登录时会提示要输入密码:
[root@VM-115-39-centos /var/lib/pgsql/11/data]psql -p 55432 -U postgres
Password for user postgres:
# TYPE DATABASE USER ADDRESS METHO
local all test md5
使用这种方式,只能使用名为test的用户进行登录,在使用postgres用户进行登录时会报错
[root@VM-115-39-centos /var/lib/pgsql/11/data]psql -p 55432 -U postgres
psql: FATAL: no pg_hba.conf entry for host "[local]", user "postgres", database "postgres", SSL off
接下来,我们演示一个非常危险的配置:
# TYPE DATABASE USER ADDRESS METHO
host all all 0.0.0.0/0 trust
在这种方式下,在远程任何一台客户端上都能使用psql进行登录,而且不会提示密码,如下,我在一台主机上在没有密码的情况下登录了数据库服务器:
[root@localhost ~]# psql -h xxxxxx -p xxxxx -U postgres
psql (11.5,11.8)
postgres=#
# TYPE DATABASE USER ADDRESS METHO
host all all 0.0.0.0/0 md5
这种认证方式,要求远程客户端链接服务器时要输入密码:
[root@localhost ~]# psql -h xxxxxx -p xxxx -U postgres
用户 postgres 的口令: