pgbouncer 和 scram-sha-256 设置

Posted

技术标签:

【中文标题】pgbouncer 和 scram-sha-256 设置【英文标题】:pgbouncer and scram-sha-256 setup 【发布时间】:2021-11-27 02:15:55 【问题描述】:

我能够获得 SCRAM-SHA-256 身份验证以与 pgpool 一起使用,但我无法找到一个很好的示例如何在 pgbouncer 中进行设置。我正在尝试使用 auth_query。在 postgres 中,pgbouncer 将连接的用户将密码加密并存储在 SCRAM-SHA-256 中。但我不知道如何在 userlist.txt 中创建条目。这应该是格式:

SCRAM-SHA-256$<iterations>:<salt>$<storedkey>:<serverkey>

storedkey 和 serverkey 到底是什么?如何生成它们?我可以使用哪些工具来创建它?在 pgpool 中,我可以使用 pg_enc,但我没有看到 pgbouncer 的任何内容。

【问题讨论】:

【参考方案1】:

SCRAM 哈希密码不是你自己构造的,而是通过查询 PostgreSQL 数据库中的pg_authid 表得到的:

SELECT rolpassword
FROM pg_authid
WHERE rolname = 'pgbouncer';

但是,正如the documentation 所说:

身份验证文件中存储的密码或机密有两个用途。首先,如果配置了基于密码的身份验证方法,它们用于验证传入客户端连接的密码。其次,如果后端服务器需要基于密码的身份验证(除非直接在数据库的连接字符串中指定密码),它们将用作到后端服务器的传出连接的密码。如果密码以纯文本或 MD5 散列形式存储,则后者有效。 SCRAM 机密只能用于登录服务器,前提是客户端身份验证也使用 SCRAM,PgBouncer 数据库定义未指定用户名,并且 PgBouncer 和 PostgreSQL 服务器中的 SCRAM 机密相同(相同的盐和迭代,而不仅仅是相同的密码)。这是由于 SCRAM 的固有安全属性:存储的 SCRAM 机密不能单独用于派生登录凭据。

因此,如果该用户被用作auth_user,则您不能为该用户使用 SCRAM 散列密码,但您必须使用明文密码。

【讨论】:

这就是我所做的,实际上,但在 userlist.txt 中使用该信息,但这不起作用。使用 psql 进行连接,我在 pgbouncer 的日志中看到了这一点(如果 psql 直接与所有用户设置为使用 SCRAM-SHA-256 的 postgres 对话,它工作正常):错误 S-0x1ad4aa0:dbsv/pgbouncer@127.0.0.1: 5432 无法进行 SCRAM 身份验证:密码是 SCRAM 机密,但客户端身份验证未提供 SCRAM 密钥 你是对的。我在答案中添加了更多内容。

以上是关于pgbouncer 和 scram-sha-256 设置的主要内容,如果未能解决你的问题,请参考以下文章

PgBouncer 和 PostgreSQL 的身份验证

linux ---pgbouncer的安装和配置

kafka sasl/plain安全认证

安装配置PGBouncer连接池

多个端口上的 pgBouncer?

安装配置PgBouncer for PostgreSQL