postgresql用户密码默认采用md5方式加密(版本可能存在差异,我的时13.0),不同的加密方式会影响客户端连接时认证,不当的配置会造成客户端连接失败,如:使用md5认证连接配置使用scram-sha-256会造成认证失败。
- 配置密码加密方式
修改数据库数据存储目录下的postgresql.conf文件
[root@localhost pgsql]# vi data/postgresql.conf
找到password_encryption这行,可以看到默认是注释掉的,即默认使用md5加密,如果想要改成scram-sha-256加密,将md5改成scram-sha-256。
......
#password_encryption = md5 # md5 or scram-sha-256
password_encryption = scram-sha-256
......
修改后需要重启数据库服务才能使用配置生效
- 查看用户密码加密方式
系统表pg_authid可以查看加密后的用户密码
[root@localhost pgsql]# su postgres -c 'bin/psql'
psql (13.0)
Type "help" for help.
postgres=# select rolname,rolpassword from pg_authid where rolname='admin' or rolname='drs';
rolname | rolpassword
---------+-------------------------------------------------------------------------
admin | SCRAM-SHA-256$4096:5YRL9FxIP**************
drs | md5024da8fac3***************
(2 rows)
密码开头部分显示了使用何种加密方式,当前创建的用户根据postgresql.conf配置的加方法进行加密,对应的连接配置规则也就根据加密方式进行配置。
查看当前密码加密方式
postgres=# SHOW password_encryption;
password_encryption
---------------------
scram-sha-256
(1 row)
- 客户端身份验证配置
数据库数据存储目录下的pg_hba.conf文件是客户端身份验证的配置文件,修改客户端连接规则
[root@localhost pgsql]# vi data/pg_hba.conf
找到# IPv4 local connections:这行,添加规则,如:
......
host all all 0.0.0.0/0 scram-sha-256
......
以上5列对应的字段如下:
TYPE DATABASE USER ADDRESS METHOD
类型 数据库实例 用户 ip地址 认证方式
配置完规则后需要重新加载配置才能生效,如下
[root@localhost pgsql]# su postgres -c 'bin/pg_ctl -D data reload'
在本例中由于drs用户使用的是md5认证,如果使用以上pg_hba.conf配置,远程客户端使用drs登陆将会报认证失败的错误
[root@localhost pgsql]# su postgres -c 'bin/psql -h 192.168.0.22 -U drs -d drs-vue'
Password for user drs:
psql: error: could not connect to server: FATAL: password authentication failed for user "drs"
[root@localhost pgsql]# su postgres -c 'bin/psql -h 192.168.0.22 -U admin -d drs-vue'
Password for user admin:
psql (13.0)
Type "help" for help.
drs-vue=#
可以通过规则设置不同用户的认证方式,在pg_hba.conf添加以下行
host all drs 0.0.0.0/0 md5
添加规则时注意前后顺序,系统过滤时是自上而下进行依次执行,如果配置不当可能造成认证失败。
注意:配置文件中特别提醒,使用password认证时客户端将以明文方式发送密码,这将影响数据库安全,不建议使用。trust允许无密码任意连接,请谨慎使用。
认证方式还包括"trust", "reject", "md5", "password", "scram-sha-256","gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert",没有一一试过,未完待续。