我尝试将 postgresql md5 更改为 scram-sha-256,但出现 FATAL 密码身份验证失败

问题描述 投票:0回答:3

我正在使用

postgresql
,作为学习的一部分,我尝试更改登录方法以获得更安全的登录方法。例如使用
scram-sha-256
代替
md5
。我尝试将
password_encryption
文件中的
scram-sha256
更改为
postgresql.conf
,并将
pg_hba.conf
METHOD 更改为
scram-sha-256
,您可以在下面的配置中看到更改:

# - Authentication -

#authentication_timeout = 1min      # 1s-600s
password_encryption = scram-sha-256     # md5 or scram-sha-256
#db_user_namespace = off
and 

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

然后重新启动服务器后,当我收到以下错误时,我尝试使用

cmd
登录:

C:\Users\amir>psql -U postgres postgres
Password for user postgres:
psql: error: could not connect to server: FATAL:  password authentication failed for user "postgres"

我可以通过将所有内容更改为

md5
方法并忽略
password_encryption
文件中的
postgresql.conf
来解决问题。我该如何解决这个问题?我是否必须将配置更改为默认值,然后尝试创建用户并为其分配加密密码。

postgresql authentication
3个回答
14
投票

使用新密码加密升级

postgres
服务的最佳方法是:

1. 使用“ssh”连接到您的服务器或打开您的终端。

2.更改

password_encryption
参数

编辑

postgresql.conf
并将
password_encryption
更改为

password_encryption = scram-sha-256

注意: 确保删除行开头的哈希值

#
。然后通过运行重新加载服务器:

sudo systemctl restart postgresql.service

替代方案是:

sudo service postgresql restart

另一种选择是:

pg_ctl reload -D <data-dir-path>

其中

<data-dir-path>
是 PostgreSQL 数据目录。

此外,您还可以使用

psql
运行此 SQL 语句:

SELECT pg_reload_conf();

2.A. 现在切换到

postgres
用户并运行
psql

sudo -u postgres psql

2.B. 然后,查看日志文件以查看重新加载是否成功,并通过 SQL 检查新值:

SHOW password_encryption;

请注意,即使您更改了参数,只要将

pg_hba.conf
中的身份验证方法设置为 md5,旧的 MD5 密码仍然有效。

password_encryption
中设置
postgresql.conf
时,您正在设置默认加密(即创建用户或重新设置密码时使用的加密)。该表
pg_authid
未更新。

更改

pg_hba.conf
时,您表示仅接受使用给定方法散列的密码。表格
pg_authid
也没有更新。

3.重新设置密码

所有通过密码验证的用户都必须更改密码。在 psql 中,超级用户可以使用

更改任何用户的密码
\password <user>

即使用户设置与以前相同的密码,密码现在也将使用

SHA-256
进行哈希处理。在继续下一步之前,请检查表
pg_authid
并确保它不再包含 MD5 哈希密码。

SELECT
    rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS has_upgraded
FROM pg_authid
WHERE rolcanlogin;

此查询查找具有

LOGIN
权限的用户(即他们可以登录到您的 PostgreSQL 集群),并确定他们的密码是否仍然存在于
PostgreSQL-style MD5
哈希中。如果
has_upgraded
FALSE
,则用户需要重新哈希其密码。


9
投票

每个用户密码哈希值都保存在表中

pg_authid
。它包括用于将密码转换为其哈希值的哈希算法。

在 postgresql.conf 中设置

password_encryption
时,您正在设置默认加密,即创建用户或(重新)设置密码时使用的加密。该表
pg_authid
更新。

更改 pg_hba.conf 时,您是说仅接受使用给定方法散列的密码。该表

pg_authid
更新。

doc中有一个重要注释:

为了简化从 md5 方法到更新的 SCRAM 方法的过渡,如果 md5 被指定为 pg_hba.conf 中的方法,但用户的密码 服务器针对 SCRAM 进行加密(见下文),然后基于 SCRAM 将自动选择身份验证

所以解决办法是

  1. 从现有用户开始,md5
  2. 更新 postrgres.conf 以使用 scram 并重新加载配置
  3. 重置用户密码:现在将在 pg_authid 中保存为 scram
  4. 您仍然可以在 pg_hba.conf 中使用 md5
  5. 当对从 md5 到 scram 的迁移感到满意时,请更新 pg_hba.conf 以指定 scram 而不是 md5

0
投票

我的问题是远程连接。

postgres 14 启用了 scram-sha-256,我必须将其放入 pg_hba.conf

# Allow replication connections from localhost, by a user with the
# replication privilege.

host    all             all              0.0.0.0/0                       scram-sha-256
host    all             all              ::/0                            scram-sha-256

另外,我还必须删除 postgresql.conf 中对 password_encryption 的注释

# - Authentication -

#authentication_timeout = 1min          # 1s-600s
password_encryption = scram-sha-256     # scram-sha-256 or md5

然后,我按照上面Teocci的提示更改了密码

\密码

经过一整天的努力,它起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.