为什么在我禁用 ident auth 之前,基于密码的身份验证无法在 postgresql 中工作?

为什么在我禁用 ident auth 之前,基于密码的身份验证无法在 postgresql 中工作?

我刚刚从 Fedora 36 上的存储库安装了 postgresql 和 pgadmin。我设置了初始 postgres 角色和数据库,并使用 postgres 用户登录

sudo su - postgres
psql

从那里,我设置了一个带有加密密码的新用户:CREATE ROLE john WITH ENCRYPTED PASSWORD '123';

我还将这一行添加到我的pg_hba.conf

host    all             all             127.0.0.1/32            scram-sha-256

现在,在 unix 上,作为 root 用户,如果我尝试:psql -U john -W -h 127.0.0.1,我会收到此错误:

psql: error: connection to server at "127.0.0.1", port 5432 failed: FATAL:  Ident authentication failed for user "john"

pgadmin 也无法登录数据库并出现类似的错误消息。

但是如果我进入pg_hba.conf并禁用这一行:

host    all             all             127.0.0.1/32            ident

突然之间,我可以从 pgadmin 登录并使用psql -U john -W -h 127.0.0.1root 用户的命令登录。

难道我做错了什么?为什么我需要完全禁用 ident auth 才能正常工作?我没有看到任何强制密码验证的方法,而不是从 psql 客户端或 pgadmin 中进行身份验证。

编辑 - 这是我的 pg_hba.conf:

local   all             all                                     peer
#host    all             all             127.0.0.1/32            ident
host    all             all             ::1/128                 ident
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident
host    all             all             127.0.0.1/32            scram-sha-256

这基本上是存储库中 postgres 附带的默认设置,但我:

  • 注释掉ident一行
  • 添加了最后一行

答案1

现有的 ident 规则任何 ipv4 本地连接(来自 127.0.0.1)

如果该规则与任何连接尝试匹配,则这就是它使用的身份验证类型,即使身份验证失败,也不会使用文件下方的规则。

https://www.postgresql.org/docs/current/auth-pg-hba-conf.html

每条记录指定连接类型、客户端 IP 地址范围(如果与连接类型相关)、数据库名称、用户名以及用于匹配这些参数的连接的身份验证方法。具有匹配连接类型、客户端地址、请求的数据库和用户名的第一条记录用于执行身份验证。不存在“失败”或“备份”:如果选择了一条记录并且身份验证失败,则不会考虑后续记录。

换句话说,您需要为要使用其他内容的客户端连接禁用 ident。

您所做的不一定是错误的,但您可能只想仅为 root 用户启用它。

您可能还想为 ::1 创建匹配的 IPv6 规则,以防某些软件使用它。

相关内容