Skip to content

PostgreSQL 连接错误:Peer authentication failed 的解决方法

问题描述

当在 Ubuntu 系统上使用以下命令尝试连接 PostgreSQL 时:

bash
psql -U postgres

会遇到以下错误:

psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres"

但使用以下命令可以成功连接:

bash
sudo -u postgres psql

问题根源

peer 认证方式是导致此问题的原因。Peer authentication 要求操作系统用户名与要连接的 PostgreSQL 用户名必须相同。当您以普通用户身份运行 psql -U postgres 时,系统会尝试使用您的当前系统用户连接到 PostgreSQL 的 postgres 用户,但由于用户名不匹配,认证失败。

解决方案

根据不同的使用场景,可以选择以下几种解决方案:

方案一:切换到 postgres 系统用户(推荐用于本地开发)

这是最简单且安全的方法,不需要修改任何配置文件:

bash
# 如果当前是 root 用户
su - postgres

# 如果当前是有 sudo 权限的普通用户
sudo su - postgres

# 然后直接运行 psql
psql

这种方法确保了操作系统用户与数据库用户一致,符合 peer 认证的要求。

方案二:修改认证方法(适用于需要密码认证的场景)

编辑 PostgreSQL 的认证配置文件:

bash
sudo nano /etc/postgresql/14/main/pg_hba.conf

找到以下行:

local   all             postgres                                peer

将其修改为:

local   all             postgres                                md5

或者使用更安全的 scram-sha-256

local   all             postgres                                scram-sha-256

然后重启 PostgreSQL 服务:

bash
sudo service postgresql restart

WARNING

将认证方法改为 md5scram-sha-256 后,连接时需要提供密码。请确保已为 postgres 用户设置了密码。

方案三:使用用户名映射(高级配置)

如果您希望保持 peer 认证但允许特定系统用户以 postgres 身份连接,可以配置用户名映射:

  1. 编辑 pg_ident.conf 文件:
bash
sudo nano /etc/postgresql/14/main/pg_ident.conf

添加映射规则:

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME
user1           your_username           postgres

your_username 替换为您的实际系统用户名(可通过 whoami 命令查看)。

  1. 编辑 pg_hba.conf 文件:
bash
sudo nano /etc/postgresql/14/main/pg_hba.conf

修改认证行以引用映射:

local   all             postgres                                peer map=user1
  1. 重启 PostgreSQL 服务:
bash
sudo service postgresql restart

方案四:使用 TCP/IP 连接而非 Unix 套接字

通过指定主机参数强制使用 TCP/IP 连接,这会绕过 peer 认证:

bash
psql -h 127.0.0.1 -U postgres -d postgres

这种方法会使用 pg_hba.conf 中为 IPv4 连接定义的认证方法(通常是 scram-sha-256md5)。

安全建议

重要安全提示

  • 不要将认证方法改为 trust,这会让任何用户无需密码即可连接,存在严重安全风险
  • 在生产环境中,始终使用密码认证(scram-sha-256md5
  • 仅在可信的本地开发环境中考虑使用 peer 认证或用户名映射

故障排除步骤

如果上述方法均无效,请按照以下步骤检查:

  1. 确认 PostgreSQL 服务正在运行:
bash
sudo systemctl status postgresql
  1. 检查 pg_hba.conf 文件的完整路径,版本号可能不同:
bash
ls /etc/postgresql/*/main/pg_hba.conf
  1. 确认配置更改后已重启服务:
bash
sudo systemctl restart postgresql

总结

PostgreSQL 的 peer 认证失败问题通常有以下几种解决方式:

  1. 最安全简单:切换至 postgres 系统用户再连接
  2. 需要密码认证:修改 pg_hba.conf 中的认证方法为 md5scram-sha-256
  3. 高级配置:设置用户名映射保持 peer 认证
  4. 替代连接:使用 TCP/IP 连接而非 Unix 套接字

根据您的具体使用场景和安全要求选择最适合的解决方案。