pg_hba.conf 里的 peer 是一种本地认证方式 ,它直接使用当前操作系统用户的身份来匹配数据库用户,不验证密码。
🔑 核心机制
- 原理 :当通过 Unix 套接字(本地连接)访问数据库时,PostgreSQL 会获取发起连接的操作系统用户名,并检查该用户名是否与请求的数据库用户名一致(或通过
pg_ident.conf映射匹配)。 - 使用场景 :通常用于本地单用户环境或 DBA 运维登录,因为操作系统层面已经完成了一次身份认证。
- 限制 :仅适用于本地连接 (Unix socket),远程 TCP/IP 连接无法使用
peer,若配置会改用ident认证。
⚙️ 配置示例
在 pg_hba.conf 中,常见的 local 行配置如下:
conf
local all all peer
如果你需要将特定的操作系统用户映射到不同的数据库用户,可以配置 pg_ident.conf 文件,并在 pg_hba.conf 中指定映射名(例如 map=ss)。
conf
# pg_ident.conf # MAPNAME SYSTEM-USERNAME PG-USERNAME
ss aaa test
conf
# pg_hba.conf
local all all peer
map=ss
这样,操作系统用户 aaa 就能以数据库用户 test 的身份免密登录。
❌ 常见问题:Peer authentication failed
当你使用 psql 连接时,如果收到 Peer authentication failed 错误,通常是因为当前操作系统用户与数据库用户名不匹配。
- 解决方法 1 :切换到与数据库用户名一致的操作系统用户,例如
sudo su - postgres后再连接。 - 解决方法 2 :修改
pg_hba.conf,将该行认证方式改为md5、scram-sha-256或password,然后执行pg_ctl reload或SELECT pg_reload_conf();使配置生效。 - 注意:修改为密码认证后,需要确保对应数据库用户已设置密码。
⚠️ 安全提示
peer 认证本身比较安全(比 trust 强),因为它依赖操作系统的用户身份验证,不会明文传输密码。 但请注意:
- 生产环境 不建议使用
trust(无条件信任),peer适合本地运维场景。 - 如果需要远程连接,应使用
scram-sha-256或md5等密码认证方式,并限制客户端 IP 范围。