Postgresql 中文操作指南

21.5. Password Authentication #

有几种基于密码的身份验证方法。这些方法的工作方式类似,但用户密码在服务器上的存储方式和客户端提供的密码在连接中的发送方式不同。

  • scram-sha-256

    • scram-sha-256 方法执行 SCRAM-SHA-256 认证,如 RFC 7677 中所述。这是一个质询响应方案,可以防止在不受信任的连接中嗅探密码,并支持以密码学家认为安全的加密哈希形式在服务器上存储密码。

    • 这是当前提供的方法中最安全的一种,但较旧的客户端库不支持它。

  • md5

    • 方法 md5 使用自定义的安全性较低质询-应答机制。它可以防止窃取密码,并且避免将密码以纯文本形式存储在服务器上,但如果攻击者设法从服务器窃取密码哈希,则不提供任何保护。此外,MD5 哈希算法现在也不再被认为能抵御确定的攻击。

    • md5 方法不能与 db_user_namespace 特性一起使用。

    • 为简化从 md5 方法过渡到较新的 SCRAM 方法,如果将 md5 指定为 pg_hba.conf 中的方法,但服务器上的用户密码已针对 SCRAM 加密(见下文),则系统将自动选择基于 SCRAM 的身份验证。

  • password

    • 方法 password 以纯文本发送密码,因此容易受到密码“窃取”攻击。如果可能,应始终避免使用它。但是,如果连接受 SSL 加密保护,则可以使用 password 。(虽然如果依赖于使用 SSL,SSL 证书身份验证可能是更好的选择)。

PostgreSQL 数据库密码与操作系统用户密码是分开的。每个数据库用户的密码都存储在 pg_authid 系统目录中。可以使用 SQL 命令 CREATE ROLEALTER ROLE (例如 CREATE ROLE foo WITH LOGIN PASSWORD 'secret' )或 psql 命令 \password 来管理密码。如果尚未为用户设置密码,则存储的密码为空,且密码认证将始终针对该用户失败。

不同的基于密码的认证方法的可用性取决于服务器如何加密(或更准确地说,散列)用户的密码。这由密码设置时的配置参数 password_encryption 控制。如果某个密码使用 scram-sha-256 设置进行了加密,则该密码可用于认证方法 scram-sha-256password(但在后一种情况下密码传输将采用纯文本)。认证方法规范 md5 将在这种情况下自动切换为使用 scram-sha-256 方法(如上所述),因此这也适用。如果某个密码使用 md5 设置进行了加密,则该密码只能用于 md5password 认证方法规范(同样,在后一种情况下密码将以纯文本传输)。(以前的 PostgreSQL 版本支持以纯文本的形式在服务器上存储密码。这不再可能。)要检查当前存储的密码哈希,请参阅系统目录 pg_authid.

要将现有安装从 md5 升级到 scram-sha-256,在确保正在使用的所有客户端库都足够新以支持 SCRAM 之后,请在 postgresql.conf 中设置 password_encryption = 'scram-sha-256',让所有用户设置新密码,并将 pg_hba.conf 中的身份验证方法规范更改为 scram-sha-256