PostgreSQL10版本开始提供了基于SCRAM-SHA-256密码认证方法。在以前的版本中使用MD5认证方法,使用自定义安全性较低的challenge-response机制。 它可以防止密码嗅探,并避免以纯文本形式将密码存储在服务器上, 但如果攻击者设法从服务器窃取密码的哈希值,则无法再提供保护。此外,MD5哈希算法现在不再被认为对于确定的攻击是安全的。如RRFC 7677中所述, 方法scram-sha-256执行SCRAM-SHA-256认证。可防止密码在不可信连接上嗅探,并支持以密码散列的形式将密码存储在服务器上, 这种形式被认为是安全的。对于新上的实例建议直接使用SCRAM-SHA-256密码认证方法(initdb时指定auth为scram-sha-256),但是对于从MD5升级上来的实例稍微麻烦一点,下面主要列举MD5到SCRAM-SHA-256升级操作步骤:
1. 前提条件
- 首先确保PostgreSQL实例版本是10及以上版本
postgres=# SELECT version(); version --------------------------------------------------------------------------------------------------------- PostgreSQL 13.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit (1 row)
复制
- 连接PostgreSQL数据库的驱动有SCRAM兼容性。PostgreSQL社区已经提供了一个驱动列表,请检查你的客户端驱动是否已支持SCRAM。
2. 配置pg_hba.conf认证
pg_hba.conf配置文件决定了你的客户端怎么连接到PostgreSQL实例,基于升级到SCRAM的目的,请确保你的密码认证方法已经设置为md5,这里估计有人不明白,明明我们现在要把认证方式升级为scram-sha-256,为什么还把认证方式设置为md5呢?PG为了简化从md5方法到新的SCRAM方法的转换,如果在pg_hba.conf中将认证方法设置为md5,但服务器上用户的密码是SCRAM加密的,PG会自动选择基于SCRAM的认证,这样就给到了一个过渡时间,到后面第五步密码全部升级完后再把认证方式修改为scram-sha-256。
#TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 md5
3. 修改password_encryption参数
password_encryption参数决定了密码怎么被hash。默认为md5,修改为scram-sha-256,步骤如下:
--查询当前参数值 postgres=# SELECT name,setting,source,enumvals FROM pg_settings WHERE name = 'password_encryption'; name | setting | source | enumvals ---------------------+---------+-----------+--------------------- password_encryption | md5 | default | {md5,scram-sha-256} (1 row) --修改参数 postgres=# ALTER SYSTEM SET password_encryption TO 'scram-sha-256'; ALTER SYSTEM --修改此产生需要重新加载配置 postgres=# SELECT pg_reload_conf(); pg_reload_conf ---------------- t (1 row) --修改后参数值 postgres=# SELECT name,setting,source,enumvals FROM pg_settings WHERE name = 'password_encryption'; name | setting | source | enumvals ---------------------+---------------+--------------------+--------------------- password_encryption | scram-sha-256 | configuration file | {md5,scram-sha-256} (1 row)
复制
4. 查询需要升级密码的用户
查询出哪些还没有升级密码的用户,在下面步骤进行密码升级
postgres=# SELECT rolname FROM pg_authid WHERE rolcanlogin AND rolpassword !~ '^SCRAM-SHA-256\$'; rolname --------- test test1 test2 (3 rows)
复制
5. 密码升级
使用\password修改密码,系统将提示您输入新密码。此新密码将转换为SCRAM验证程序,并且此用户的升级将完成。这个命令会提示要求输入新口令、对口令加密然后把加密后的口令作为一个ALTER ROLE命令发送到服务器。这确保新口令不会以明文的形式出现在命令历史、服务器日志或者其他地方。不建议直接使用ALTER ROLE进行修改。
--修改密码 postgres=# \password test Enter new password: Enter it again: --test的密码已不在下面结果中,代表升级完成 postgres=# SELECT rolname FROM pg_authid WHERE rolcanlogin AND rolpassword !~ '^SCRAM-SHA-256\$'; rolname --------- test1 test2 (2 rows) --加密后hash值如下 postgres=# SELECT rolname,rolpassword FROM pg_authid WHERE rolcanlogin; rolname | rolpassword ---------+--------------------------------------------------------------------------------------------------------------------------------------- test1 | md5******************************** test2 | md5******************************** test | SCRAM-SHA-256$4096:OU+ksv2lqF3Hk70cazGf6Q==$L6bD7XY5EsUl+VIn/KVP3cfzns4+AUrSRbtJ4+SGObs=:BPkXFJ+15/n+KLekj04FpBjMHH7Z1mYfA66/dHUfyN0= (3 rows)
复制
6. 重配置pg_hba.conf认证
一旦所有密码都升级,需要更新pg_hba.conf配置,并将所有使用md5的条目修改为scram-sha-256
--以下查询语句返回0条,代表所有密码已升级 postgres=# SELECT rolname FROM pg_authid WHERE rolcanlogin AND rolpassword !~ '^SCRAM-SHA-256\$'; rolname --------- (0 rows) --修改完配置需要reload配置 postgres=# SELECT pg_reload_conf(); pg_reload_conf ---------------- t (1 row)
复制
#TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 scram-sha-256
至此所有的PostgreSQL用户账户都已经升级为使用SCRAM进行身份验证!
评论
