赞
踩
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时,必须进行配置,配置的格式是 <IP/masklen>,比如配置了192.168.5.0/24,表示针对子网是192.168.5.0的所有IP都会生效。
认证的方法,主要有以下几种:
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 的口令:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。