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

Ami*_*eza 9 authentication postgresql

我正在使用postgresql并且作为学习的一部分,我尝试更改登录方法以获得更安全的登录方法。例如使用scram-sha-256而不是md5. 我尝试将我的文件更改为,password_encryption并将方法更改为,您可以在下面的配置中看到更改:scram-sha256postgresql.confpg_hba.confscram-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
Run Code Online (Sandbox Code Playgroud)

然后重新启动服务器后,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"
Run Code Online (Sandbox Code Playgroud)

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

JGH*_*JGH 8

每个用户密码散列都保存在表中pg_authid。它包括用于将密码转换为其哈希值的哈希算法。

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

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

文档中有一个重要注释:

为了方便从 md5 方法到较新的 SCRAM 方法的转换,如果在 pg_hba.conf 中将 md5 指定为方法,但服务器上的用户密码已针对 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


Teo*_*cci 8

postgres使用新密码加密升级服务的最佳方法是:

\n

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

\n

2.更改password_encryption参数

\n

编辑postgresql.conf并更改password_encryption

\n
password_encryption = scram-sha-256\n
Run Code Online (Sandbox Code Playgroud)\n

注意:确保删除#行开头的哈希值。然后通过运行以下命令重新加载服务器:

\n
sudo systemctl restart postgresql.service\n
Run Code Online (Sandbox Code Playgroud)\n

另一种选择是:

\n
sudo service postgresql restart\n
Run Code Online (Sandbox Code Playgroud)\n

另一种选择是:

\n
pg_ctl reload -D <data-dir-path>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

另外,您可以使用以下命令运行此 SQL 语句psql

\n
SELECT pg_reload_conf();\n
Run Code Online (Sandbox Code Playgroud)\n

2.A. 现在切换到postgres用户并运行psql

\n
sudo -u postgres psql\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
SHOW password_encryption;\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,即使您更改了参数,只要将身份验证方法设置pg_hba.conf为 md5,旧的 MD5 密码仍然有效。

\n

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

\n

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

\n

3.重新设置密码

\n

所有通过密码验证的用户都必须更改其密码。在 psql 中,超级用户可以更改任何用户\xe2\x80\x99s 的密码

\n
\\password <user>\n
Run Code Online (Sandbox Code Playgroud)\n

即使用户设置与以前相同的密码,该密码现在也将使用 进行哈希处理SHA-256。在继续下一步之前,请检查该表pg_authid并确保它不再包含 MD5 哈希密码。

\n
SELECT\n    rolname, rolpassword ~ \'^SCRAM-SHA-256\\$\' AS has_upgraded\nFROM pg_authid\nWHERE rolcanlogin;\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n