我刚刚从 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.1
root 用户的命令登录。
难道我做错了什么?为什么我需要完全禁用 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 规则,以防某些软件使用它。