Postgresql杂谈 01—访问控制配置文件pg_hba.conf的介绍

一、文件结构介绍

       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

链接的类型,目前比较常用的链接类型主要有以下四种

TYPE

说明

local

定义本地的链接类型,配置时通过本地的UNIX套接字进行链接,如果配置了,我们在本机上使用psql时可以不用输入服务端的IP和端口号,默认以操作系统的用户进行登录,但是需要注意两点:

1、默认登录的端口号是5432,如果数据库没有采用该端口号,则需要显式的用-p参数进行指明

2、数据库中必须创建和和当前操作系统用户同名的数据库用户

host

该类型下,配置数据库支持远程TCP/IP链接,如果数据库需要配置局域网或者外网进行访问,需要进行该类型的配置。

hostssl

该类型的记录匹配使用TCP/IP的SSL链接,必须使用SSL加密才能链接数据库。

hostnossl

该配置和hostssl相反,只匹配不使用SSL的TCP/IP链接

  • DATABASE

配置支持链接的数据库,有三种不同的配置方案:

DATABASE

说明

数据库名称

这里可以配置数据库名称,意思就是对配置的数据库支持远程或者本地链接的配置。

all

表明当前的配置针对所有的数据库生效

replication

这是流复制链接的配置,在PG的主从配置中会用到

  • USER

配置进行链接的用户,需要注意的是这里是指的数据库的用户,而非操作系统的用户,如果配置了all表示接受所有数据库用户的链接。

  • ADDRESS

允许或者拒绝远端链接的IP地址,TYPE配置的是local可以为空,当时TYPE配置的是host时,必须进行配置,配置的格式是 ,比如配置了192.168.5.0/24,表示针对子网是192.168.5.0的所有IP都会生效。

  • METHOD

认证的方法,主要有以下几种:

METHOD

说明

trust

无条件的允许链接。在此种认证方法下,数据库用户进行连接时不需要输入任何口令。

reject

无条件的拒绝连接。在此种认证方法下,数据库会拒绝该连接(即,配置连接的黑名单)。

md5

要求客户端提供一个MD5加密的口令的认证。这种模式下,客户端在网络上传递的口令经过了MD5加密,防止在网络上明文传输,造成口令的泄露。

password

要求客户端提供一个明文口令,这种模式下,客户端提供的口令会以明文的形式在网络上传递,具有泄露的风险,一般不会采用该种方式。

ident

服务器会联系客户端的ident服务,验证当前的用户在客户端上是不是操作系统的有效用户,如果是,则链接成功;如果不是则链接失败。这种方式通常和UNIX域套接字的链接认证方式一起使用,此时和peer认证的效果一致。

peer

使用操作系统用户登录,链接的用户是操作系统上某个操作系统的用户,但是需要注意的是数据库中要存在和操作系统一样的同名用户。

二、几种典型的认证配置

2.1 本地的trust认证

# 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=# 

2.2 本地的ident认证

# 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。

2.3 本地的MD5认证

# 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: 

2.4 本地的指定用户认证

# 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

2.5 远程的配置所有IP可信任

      接下来,我们演示一个非常危险的配置:

# 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=# 

2.6 远程的配置所有IP可MD5认证

# TYPE      DATABASE        USER            ADDRESS                 METHO
host         all            all             0.0.0.0/0               md5

       这种认证方式,要求远程客户端链接服务器时要输入密码:

[root@localhost ~]# psql -h xxxxxx -p xxxx -U postgres
用户 postgres 的口令:

你可能感兴趣的:(Postgresql原理与实战,数据库,sql,postgresql)