psql:致命:用户“postgres”的身份验证失败

Posted

技术标签:

【中文标题】psql:致命:用户“postgres”的身份验证失败【英文标题】:psql: FATAL: Ident authentication failed for user "postgres" 【发布时间】:2011-02-25 21:58:01 【问题描述】:

我已经在我的 Ubuntu Karmic 机器上安装了 PostgreSQL 和 pgAdminIII。

我能够成功使用 pgAdminIII(即连接/登录),但是当我尝试在命令行(使用 psql)上使用相同的用户名/密码登录服务器时,我收到错误:

psql: FATAL:  Ident authentication failed for user "postgres"

现在有人可以解决这个问题吗?

【问题讨论】:

这篇 *** 帖子对我有用:***.com/a/18664239/2110769 【参考方案1】:

以下步骤适用于在 Ubuntu 12.04 上全新安装 postgres 9.1。 (也适用于 Ubuntu 14.04 上的 postgres 9.3.9。)

默认情况下,postgres 创建一个名为“postgres”的用户。我们以她的身份登录,并给她一个密码。

$ sudo -u postgres psql
\password
Enter password: ...
...

通过键入\qctrl+d 退出psql。然后我们连接为“postgres”。 -h localhost 部分很重要:它告诉psql 客户端我们希望使用 TCP 连接(配置为使用密码身份验证)进行连接,而不是通过 PEER 连接(确实不关心密码)。

$ psql -U postgres -h localhost

【讨论】:

如果你设置了PGHOST=localhost,你就不需要每次都指定-h选项。这也适用于其他pg_* 命令,例如pg_dump 它确实记录在这里:help.ubuntu.com/12.04/serverguide/postgresql.html 这是在 Debian 上使用 PostgreSQL 启用 Mediawiki 安装所必需的。 2 年后,我也需要在 Mac 上执行此操作。 不好,因为存在安全问题,请参见此处:serverfault.com/questions/110154/…【参考方案2】:

您是否在 pg_hba.conf 中设置了正确的设置?

看https://ubuntu.com/server/docs/databases-postgresql怎么做。

【讨论】:

这对我不起作用。我已经花了好几个小时了!我想要做的就是在我的终端中运行 psql 命令。我需要做什么才能使文件看起来像这样?? @SeanA 你需要'sudo -u postgres psql'之类的东西 别忘了 ';'在 psql 上的每个语句的末尾。听起来很傻,但它确实发生了,呵呵。 对于那些使用 Rails 的人,我必须设置 pg_hba.conf,并将 'ident' 更改为 'password'。将其更改为信任无效。 为什么是的,我确实阅读了精美的手册,但一点帮助都没有。它没有提及错误或如何修复它。【参考方案3】:

编辑文件/etc/postgresql/8.4/main/pg_hba.conf 并将identpeer 替换为md5trust,具体取决于您是否希望它在您自己的计算机上询问密码。 然后重新加载配置文件:

/etc/init.d/postgresql reload

【讨论】:

一个命令重启postgresql:/etc/init.d/postgresql restart 为什么只需要重新加载就重新启动? 在这种情况下:“/etc/init.d/postgresql-8.4 reload” 这个对我有用。从 peer 更改为 md5 就足够了。 好的,我是一个 postgresql 菜鸟,但我必须报告只有 restart 为我工作,而不是 reload--- 更改为 /etc/postgresql/9.5/main/pg_hba.conf(将 peer 更改为 @ 987654331@).【参考方案4】:

您收到此错误是因为您未通过客户端身份验证。根据错误消息,您可能有默认的 postgres 配置,它将所有 PostgreSQL 连接的客户端身份验证方法设置为“IDENT”。

您绝对应该阅读PostgreSQL manual 中的19.1 Client Authentication 部分,以更好地了解可用的身份验证设置(对于pg_hba.conf 中的每条记录),但这里有相关的sn-p 可以帮助您解决遇到的问题(来自version 9.5 manual):

信任

无条件允许连接。这种方法允许任何人 可以连接到 PostgreSQL 数据库服务器以任何方式登录 他们希望的 PostgreSQL 用户,无需密码或任何 其他认证。有关详细信息,请参阅第 19.3.1 节。

拒绝

无条件拒绝连接。这对于“过滤 out" 组中的某些主机,例如拒绝行可能会阻止 特定主机从连接,而后面的行允许 特定网络中的剩余主机要连接。

md5

要求客户端提供双 MD5 哈希密码 验证。有关详细信息,请参阅第 19.3.2 节。

密码

要求客户端提供未加密的密码 验证。由于密码以明文形式通过 网络,这不应该在不受信任的网络上使用。见章节 19.3.2 了解详情。

gss

使用 GSSAPI 对用户进行身份验证。这仅适用于 TCP/IP 连接。有关详细信息,请参阅第 19.3.3 节。

sspi

使用 SSPI 对用户进行身份验证。这仅在 Windows 上可用。 有关详细信息,请参阅第 19.3.4 节。

身份

通过联系客服获取客户端的操作系统用户名 识别客户端上的服务器并检查它是否与请求的匹配 数据库用户名。身份验证只能在 TCP/IP 上使用 连接。当为本地连接指定时,对等身份验证 将被使用。有关详细信息,请参阅第 19.3.5 节。

同行

从操作系统中获取客户端的操作系统用户名 系统并检查它是否与请求的数据库用户名匹配。这 仅适用于本地连接。请参阅第 19.3.6 节了解 详情。

ldap

使用 LDAP 服务器进行身份验证。有关详细信息,请参阅第 19.3.7 节。

半径

使用 RADIUS 服务器进行身份验证。有关详细信息,请参阅第 19.3.8 节。

证书

使用 SSL 客户端证书进行身份验证。请参阅第 19.3.9 节了解 详情。

帕姆

使用可插入身份验证模块 (PAM) 服务进行身份验证 由操作系统提供。有关详细信息,请参阅第 19.3.10 节。

所以...要解决您遇到的问题,您可以执行以下操作之一:

    更改pg_hba.conf 中定义的身份验证方法 文件到trustmd5password(取决于您的安全 和简单性需求)用于您拥有的本地连接记录 在那里定义。

    更新 pg_ident.conf 以将您的操作系统用户映射到 PostgreSQL 用户并授予他们相应的访问权限, 取决于您的需求。

    保留 IDENT 设置并在您的数据库中创建用户 您要授予访问权限的每个操作系统用户。如果一个 用户已通过操作系统身份验证并登录,PostgreSQL 不需要进一步的身份验证,并将授予访问权限 基于分配给它的任何特权(角色)的用户 数据库。这是默认配置。

注意:pg_hba.confpg_ident.conf 的位置取决于操作系统。

【讨论】:

对我来说,这是最好的答案。当您了解所有这些选项时,您可以轻松地调整 conf.特别是当你在开发机器上时,你可以简单地为所有条目设置“ident”以避免浪费你的时间。谢谢 这对我也有帮助。就我而言,pg_hba.conf 文件设置为对等,我将其更改为密码。请注意,从香草安装中,我还必须为 postgres 用户设置密码,sudo su - postgres psql, \password 设置密码。然后使用用户名 postgres 和您设置的密码从 pdgadmin3 启动默认连接。 那个文件在哪里找到的?当然,您可能需要列出一个列表,因为版本之间似乎没有一致性。我想我会在 '/' 上运行 find 。 在 Ubuntu-16.04 上是 /etc/postgresql/9.6/main/pg_hba.conf 作为 psql 新手,这是一个巨大的帮助,应该是公认的答案,因为它迎合了各种身份验证方法【参考方案5】:

只需添加 -h localhost 位即可工作

【讨论】:

我们知道为什么会修复它吗? postgresql 的默认值设置不合理。他们现在可能已经修好了,我不知道。显然默认的url应该是this_computer = 'http://localhost' 如此充分地使用“pg_dump -U postgres test -f test_1.sql -h localhost”命令对我有用 如果您不包含主机名(通过-h ... 选项),那么psql 将默认尝试通过Unix 域套接字连接,在这种情况下psql(或可能是 PostgreSQL 集群本身)查询您的操作系统以获取您的用户名以使用对等身份验证,即确认您的用户名与您指定的 PostgreSQL 用户(角色)匹配(它很可能不匹配)。当您指定主机名时,psql 将使用 TCP/IP 连接到集群。【参考方案6】:

如果以上都不适合您: 我已经完成了很多 Postgres 安装,但今天在 RedHat 6.5 系统(安装 Postgres 9.3)上感到困惑。 Aron 上面显示的我的典型 hba.conf 配置不起作用。原来我的系统使用的是 IPV6,而忽略了 IPV4 配置。添加行:

host    all             all             ::1/128                 password

允许我成功登录。

【讨论】:

谢谢伊桑。我正在运行 Fedora 20,我遇到了与 OP 相同的问题。将 IPV4 和 IPV6 更改为密码后。连接成功。 不客气。当遇到编程或系统问题时,我多次从其他帖子中受益。很高兴我能回馈一点。 这在 Fedora 32 上救了我的命!【参考方案7】:

可以设置环境变量PGHOST=localhost

$ psql -U db_user db_name
psql: FATAL:  Peer authentication failed for user "db_user"

$ export PGHOST=localhost
$ psql -U db_user db_name

Password for user mfonline:

【讨论】:

【参考方案8】:

嗯...

如果您可以使用 pgAdminIII 中的用户名和密码进行连接,但无法使用 psql 进行连接,那么这两个程序可能连接到数据库的方式不同。

[如果您要连接到不同的数据库,请先尝试连接到同一个数据库。见下文。]

来自PostgreSQL: Documentation: 9.3: psql:

如果您省略主机名,psql 将通过 Unix 域套接字连接到本地主机上的服务器,或通过 TCP/IP 连接到没有 Unix 域套接字的机器上的 localhost。

如果您没有运行 psql ... -h host_name ... 之类的东西,而您运行的是 Ubuntu,则 psql 应该通过 Unix 域套接字进行连接,因此 PostgreSQL 可能未配置为允许其中一种密码身份验证方法postgres 用户。

你可以通过运行来测试:

sudo -u postgres psql

如果上述方法有效,您的服务器可能已配置为 postgres 用户对本地连接使用 peer 身份验证,即向操作系统询问您的用户名以确认你是postgres

所以它可能是你的 pg_hba.conf 文件

文件的完整路径类似于 /etc/postgresql/9.3/main/pg_hba.conf。您可以通过例如查看它sudo cat /etc/postgresql/9.3/main/pg_hba.conf | more.

如果您在 psql 命令中省略了主机名,那么如果您将以下条目添加到您的 pg_hba.conf 文件中,您应该能够连接:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  md5

[pg_hba.conf 文件中的注释行以# 开头。]

如果您正在psql 命令中包含主机名,请改为添加此条目:

# Connection type   Database   User       IP addresses   Method
host                all        postgres   127.0.0.1/32   md5

您需要在通过psql 为您的连接匹配任何其他条目之前输入该条目。如果对放置位置有疑问,只需将其放在第一个未注释行之前。

更多关于 pg_hba.conf

来自PostgreSQL: Documentation: 9.3: The pg_hba.conf File[粗体强调我的]:

连接类型客户端地址请求的数据库用户名匹配的第一条记录是用于执行身份验证。没有“fall-through”或“backup”:如果选择了一条记录并且认证失败,则不考虑后续记录。如果没有记录匹配,则拒绝访问。

请注意,记录在身份验证方法上匹配。因此,如果您的 pg_hba.conf 文件包含以下条目:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  peer

那么您将无法通过以下方式连接:

psql -u postgres

除非这些条目之一在您的 pg_hba.conf 文件中高于前一个条目:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  md5
local               all        postgres                  password   # Unencrypted!
local               all        all                       md5
local               all        all                       password   # Unencrypted!

【讨论】:

游戏迟到了,但是,说真的,感谢您努力正确解释事情以便我理解! 我在启动 docker 容器时遇到了这个问题,我的 ubuntu 系统上没有 pg_hba.conf 文件,但它可能在 docker 映像中?那为什么它给我这个错误? @Zaffer 我不确定你在问什么,但它似乎与这个问题必然相关。我也不确定 SO(此站点)是否是您在任何潜在问题上获得帮助的好地方。如果您想更详细地讨论您的问题,我创建了a chat room 并将您添加到其中。【参考方案9】:

在上述所有答案中,对我没有任何帮助。我不得不手动更改数据库中的用户密码,它突然起作用了。

psql -U postgres -d postgres -c "alter user produser with password 'produser';"

我使用了以下设置:

pg_hba.conf

local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            password  
# IPv6 local connections:
host    all             all             ::1/128                 password

以下命令最终连接成功:

psql -U produser -d dbname -h localhost -W 

【讨论】:

这对我有帮助,约瑟夫。特别是最后的连接命令可以帮助我测试它。另外,如果有人想知道,我会重新启动 Postgresql 服务(但我知道这是暗示的)。非常感谢!【参考方案10】:

就我而言,这里的解决方案:(对于关心的人) 登录 postgres:

sudo -i -u postgres
psql
ALTER USER postgres WITH PASSWORD 'postgres'; # type your password here

问候

【讨论】:

【参考方案11】:

对于fedora26 和postgres9.6

首先以root用户登录,然后通过以下命令进入psql

$ su postgres  

然后

$ psql

psql找到hba_file的位置==>表示pg_hba.conf

postgres=# show hba_file ; 
 hba_file  
--------------------------------------   
 /etc/postgresql/9.6/main/pg_hba.conf  
(1 row)  

在文件 pg_hba.conf 中更改用户对此的访问权限

host all all 127.0.0.1/32 md5

【讨论】:

【参考方案12】:

我发现我必须安装一个身份服务器,它侦听端口 113。

sudo apt-get install pidentd
sudo service postgresql restart

然后 ident 起作用了。

【讨论】:

【参考方案13】:

问题仍然是您的 pg_hba.conf 文件。这一行:你可以在 /etc/postgres/varion/main 中找到这个文件

local   all             postgres                                peer
Should be

local   all             postgres                                md5

这些是根据官方 PostgreSQL 文档关于身份验证方法的两个选项的简要说明。

对等身份验证

对等身份验证方法通过从内核获取客户端的操作系统用户名并将其用作允许的数据库用户名(带有可选的用户名映射)来工作。此方法仅在本地连接上受支持。

密码验证

基于密码的身份验证方法是 md5 和密码。除了通过连接发送密码的方式(即分别为 MD5 散列和明文)之外,这些方法的操作类似。

如果您完全担心密码“嗅探”攻击,则首选 md5。如果可能,应始终避免使用纯密码。但是,md5 不能与 db_user_namespace 功能一起使用。如果连接受 SSL 加密保护,则可以安全地使用密码(但如果依赖于使用 SSL,则 SSL 证书身份验证可能是更好的选择)。

更改此文件后,不要忘记重新启动您的 PostgreSQL 服务器。如果你在 Linux 上,那就是sudo service postgresql restart.

【讨论】:

【参考方案14】:

我在 bash shell 中的 Mac OSX 上的 PostgreSQL 9.3 上的解决方案是使用 sudo 进入数据文件夹,然后将必要的行附加到 pg_hba.conf 文件中,以允许所有用户被信任并能够登录。这就是我所做的:

# in bash_profile edit PGDATA environmental variable
open ~/.bash_profile

# append this line to bash_profile
export PGDATA="/Library/PostgreSQL/9.3/data"

# reload bash_profile
source ~/.bash_profile

# open pg_hba.conf in vim
sudo vi /Library/PostgreSQL/9.3/data/pg_hba.conf

# append these two lines to the end of the pg_hba.conf file
local   all   all                  trust
host    all   all   127.0.0.1/32   trust

# can now login as user in bash
psql -d <db_name> -U <user_name> -W

【讨论】:

这对于开发服务器来说很好,但我不建议将其用于生产环境,因为您不再需要密码来使用这些设置连接到数据库。【参考方案15】:

我花了更多时间解决这个我愿意承认的错误。

我认为 pg_hba.conf 中的身份验证配置顺序与您的情况相关。默认配置文件在 vanilla 安装中包含几行。这些默认值可以匹配您的身份验证尝试的条件,从而导致身份验证失败。无论在 .conf 文件末尾添加的其他配置如何,它都会失败。

要检查使用了哪一行配置,请务必查看默认日志文件中的消息。你可能会看到这样的东西

LOG:  could not connect to Ident server at address "127.0.0.1", port 113: Connection refused
FATAL:  Ident authentication failed for user "acme" 
DETAIL:  Connection matched pg_hba.conf line 82: "host     all             all             127.0.0.1/32            ident"

事实证明,这条默认线路导致了拒绝。

host    all             all             127.0.0.1/32            ident

尝试将其注释掉。

【讨论】:

【参考方案16】:

如果您已完成所有这些操作但仍然无法正常工作,请检查该用户的到期时间:

Postgres password authentication fails

【讨论】:

【参考方案17】:

解决这个问题的一个技巧是编辑 pg_hba.conf

sudo vi /etc/postgresql/9.3/main/pg_hba.conf

暂时

# Database administrative login by Unix domain socket
local   all             postgres                                   trust

至此,您就完成了。为了安全,那就去吧

sudo -u postgres psql template1
ALTER USER postgres with encrypted password 'your_password';

然后返回并将pg_hba.conf设置回

# Database administrative login by Unix domain socket
local   all             postgres                                   md5

【讨论】:

【参考方案18】:

我遇到了类似的问题,我在 pg_hba.conf 中修复了它,当删除所有 ident 方法时,即使是 IP6 地址(尽管我的机器上只有 IP4)。

host all all 127.0.0.1/32 password
host all all ::1/128 password
#for pgAdmin running at local network
host all all 192.168.0.0/24 md5

【讨论】:

【参考方案19】:

如果你是在 CentOS 上使用,在做出上述解决方案后,你可能需要重新加载 postgres:

systemctl restart postgresql-9.3.service

【讨论】:

现在只是postgresql @NeilChowdhury postgresql 服务至少在 linux 系统中仍有服务名称的版本。运行此命令查看systemctl status | grep postgres【参考方案20】:

与PostgreSQL安装的配置问题有关:

在下面提到的 conf 文件中配置 # TYPE DATABASE USER ADDRESS METHOD 部分

查找和编辑 /var/lib/pgsql/10/data/pg_hba.conf 或根据您的文件位置更新方法(md5)。如果您的配置不存在,请通过如下比较更新文件中的条目:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     trust
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

在下面提到的 conf 文件中配置 CONNECTIONS AND AUTHENTICATION 部分

查找和编辑 /var/lib/pgsql/10/data/postgresql.conf 或根据您的文件位置 更新监听地址和端口

listen_addresses = '*' // # what IP address(es) to listen on;
                                    # comma-separated list of addresses;
                                    # defaults to 'localhost'; use '*' for all
port = 5432 // Set port as 5432

重启你的 PostgreSQL:

sudo systemctl restart postgresql-10 # Update service name based on your installation

【讨论】:

【参考方案21】:

我在关注这个之后遇到了同样的问题:PostgreSQL setup for Rails development in Ubuntu 12.04

我尝试了其他答案,但我所要做的就是:"config/database.yml"

development:
  adapter: postgresql
  encoding: unicode
  database: (appname)_development
  pool: 5
  username: (username you granted appname database priviledges to)
  password:

【讨论】:

【参考方案22】:

我必须重新安装 pdAdmin 才能解决此问题

brew cask reinstall pgadmin4

【讨论】:

【参考方案23】:

对于 Windows,如果您不想编辑 pb_gba.conf 即保留方法为 MD5(默认),通过在 PGadmin 的查询工具中运行此查询 创建一个新用户

CREATE USER admin WITH PASSWORD 'secret'

然后在 cmd

psql "dbname=Main_db host=127.0.0.1 user=admin password=secret port=5432

其中 dbname 是您在 postgresql 中的数据库

【讨论】:

【参考方案24】:

我在 GCP SQL 中通过 terraform 提供了用户名和密码,问题是密码没有通过 terraform 正确设置,因此虽然不是正确的修复,但只是为了找出确切的原因。

我从 GCP 控制台更改了用户的密码,并且成功了。

【讨论】:

【参考方案25】:

这对我有用: http://tecadmin.net/fatal-ident-authentication-failed-for-user-postgres/#

local   all             postgres                                trust
local   all             myapp_usr                               trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
#host    all             all             ::1/128                 trust

【讨论】:

这允许来自本地主机的任何人以任何用户身份登录。链接中的任何地方都没有提到此行为。是的,debian 信息页面包含相同的内容。

以上是关于psql:致命:用户“postgres”的身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章

psql:致命:用户 windows 8 的密码验证失败

遇到致命问题:使用 ruby​​ on rails 对用户“postgres”进行对等身份验证失败

PostgreSQL:pg_hba.conf中的MD5身份验证给我致命:用户“ postgres”的对等身份验证失败]] << [

psql:致命:角色“postgres”不存在

如何解决这个问题以使用 psql? | psql:错误:致命:角色“postgres”不存在

Heroku Postgres:“psql:致命:主机没有 pg_hba.conf 条目”