有几种基于密码的认证方法。这些方法操作方式类似,但用户密码在服务器上的存储方式和客户端提供的密码通过连接发送的方式不同。
scram-sha-256
方法 scram-sha-256
执行 SCRAM-SHA-256 认证,如 RFC 7677 中所述。它是一种质询-响应机制,可防止在不受信任的连接上嗅探密码,并支持以加密哈希形式将密码存储在服务器上,这种形式被认为是安全的。
这是当前提供的方法中最安全的,但旧客户端库不支持它。
md5
方法 md5
使用自定义的安全性较低的质询-响应机制。它可以防止嗅探密码,并避免以纯文本形式将密码存储在服务器上,但如果攻击者设法从服务器窃取密码哈希,则不提供任何保护。此外,MD5 哈希算法现在不再被认为对确定的攻击是安全的。
方法 md5
不能与 db_user_namespace 功能一起使用。
为了方便从 md5
方法过渡到较新的 SCRAM 方法,如果在 pg_hba.conf
中将 md5
指定为一种方法,但服务器上的用户密码已针对 SCRAM 加密(见下文),那么将自动选择基于 SCRAM 的身份验证。
密码
方法 password
以明文形式发送密码,因此容易受到密码 “嗅探” 攻击。如果可能,应始终避免使用它。但是,如果连接受 SSL 加密保护,则可以安全地使用 password
。(如果依赖于使用 SSL,那么 SSL 证书身份验证可能是更好的选择)。
PostgreSQL 数据库密码与操作系统用户密码是分开的。每个数据库用户的密码都存储在 pg_authid
系统目录中。可以使用 SQL 命令 CREATE ROLE 和 ALTER ROLE 管理密码,例如,CREATE ROLE foo WITH LOGIN PASSWORD 'secret'
,或 psql 命令 \password
。如果尚未为用户设置密码,则存储的密码为 null,并且该用户的密码身份验证将始终失败。
不同的基于密码的身份验证方法的可用性取决于服务器上用户的密码如何加密(或更准确地说,如何散列)。这由设置密码时配置参数 password_encryption 控制。如果使用 scram-sha-256
设置加密密码,则可以将其用于身份验证方法 scram-sha-256
和 password
(但在后一种情况下,密码传输将以纯文本形式进行)。如上所述,身份验证方法规范 md5
将自动切换为使用 scram-sha-256
方法,因此它也将起作用。如果使用 md5
设置加密密码,则只能将其用于 md5
和 password
身份验证方法规范(同样,在后一种情况下,密码以纯文本形式传输)。(以前的 PostgreSQL 版本支持在服务器上以纯文本形式存储密码。现在不再可能。)要检查当前存储的密码哈希,请参阅系统目录 pg_authid
。
要将现有安装从 md5
升级到 scram-sha-256
,在确保正在使用的所有客户端库都足够新以支持 SCRAM 之后,请在 postgresql.conf
中设置 password_encryption = 'scram-sha-256'
,让所有用户设置新密码,并将 pg_hba.conf
中的身份验证方法规范更改为 scram-sha-256
。