从 v10 开始,PostgreSQL 提供了scram-sha-256
对密码哈希和身份验证的支持。本文介绍了如何安全地调整您的应用程序。
为什么我们需要scram-sha-256
?
PostgreSQL 使用哈希加密有两个目的:
- 实际的数据库密码是用户输入的明文密码的哈希值。这可以防止小偷在其他系统上使用偷来的密码。
- 在密码验证过程中,客户端必须使用服务器提供的随机盐对密码进行散列。如果服务器从客户端收到正确的散列响应,则密码检查成功。
现在,MD5 散列方法存在弱点,不适合加密。特别是,使用给定的 MD5 哈希值构造字符串太容易了。这些缺点不适用于 PostgreSQL 使用 MD5 的方式,但使用更好的哈希算法仍然有意义:
- 昂贵的散列函数使得暴力破解密码变得更加困难
- 在安全审计期间,如果PostgreSQL不使用有缺陷的散列函数,看起来会更好
因此在 v10 中引入了scram-sha-256
支持。如果可以的话,开始使用新的哈希方法。暴力破解密码的难度增加了,因此值得付出努力。
切换到的问题scram-sha-256
有两个问题导致很难从 MD5 切换到scram-sha-256
:
- 由于PostgreSQL不知道原来的明文密码,将密码加密方法改为
scram-sha-256
后,用户必须重新设置密码。 - PostgreSQL客户端必须支持
scram-sha-256
身份验证,因此使用旧的客户端软件进行身份验证将会失败。
当你尝试连接到一个需要scram-sha-256
身份验证的服务器时,使用旧版本的libpq会得到的错误信息是:
authentication method 10 not supported
旧的 JDBC 驱动程序会告诉您:
The authentication type 10 is not supported.
旧版本的 Npgsql 将返回:
Authentication method not supported (Received: 10)
切换到scram-sha-256的步骤说明
实际上,转换为scram-sha-256
并不难,只要你遵循以下原则:
1.升级客户端软件
升级所有过时的PostgreSQL客户端软件和驱动程序,以支持新的身份验证方法。无论如何,这是一个好主意,因为陷入旧的、未维护的软件永远不是明智的。
2. 更改password_encryption
参数
编辑postgresql.conf
并将参数更改为
password_encryption = scram-sha-256
确保删除了该行开头的散列值(#)。然后通过运行重新加载服务器
pg_ctl reload -D /postgres/datadir
其中/postgres/datadir
是 PostgreSQL 数据目录。或者,您可以运行以下 SQL 语句:
SELECT pg_reload_conf();
查看日志文件以查看重新加载是否成功,并通过 SQL 检查新值:
SHOW password_encryption;
注意,即使修改了参数,旧的MD5密码仍然有效,只要pg_hba.conf中的身份验证方法设置为MD5即可。
3. 重新设置所有密码
所有经过密码验证的用户必须更改密码。在psql中,超级用户可以用
\password user_name
即使用户设置与以前相同的密码,该密码现在也将使用 SHA-256 进行哈希处理。在继续下一步之前,请检查该表pg_authid
并确保它不再包含 MD5 哈希密码。
4. 更改认证方式pg_hba.conf
这一步不是严格必须的,因为PostgreSQL将对sram -sha-256
哈希密码使用sram -sha-256
身份验证,即使在pg_hba .conf中将身份验证方法设置为md5
。这是一个兼容性特性。
不过,您应该修改pg_hba.conf,将所有出现的md5
替换为scham -sha-256
。这将阻止仍然使用旧MD5密码的用户进行身份验证。
之后,像上面一样重新加载配置。然后检查日志文件或检查视图pg_hba_file_rules
,以查看重新加载是否成功。
结论
从上面可以看出,将 md5
改为 scram-sha-256
并不难。困难的部分是你必须重新设置所有的密码,并且你可能需要升级客户端软件。