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

psql: FATAL: Ident authentication failed for user “postgres”

我在我的Ubuntu Karmic盒子上安装了PostgreSQL和pgAdminIII。

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

1
psql: FATAL:  Ident authentication failed FOR USER"postgres"

现在有人如何解决这个问题?


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

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

1
2
3
4
$ sudo -u postgres psql
\password
Enter password: ...
...

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

1
$ psql -U postgres -h localhost


你在pg_hba.conf中设置了正确的设置吗?

请参阅https://help.ubuntu.com/stable/serverguide/postgresql.html如何操作。


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

1
/etc/init.d/postgresql reload


您收到此错误是因为您的客户端身份验证失败。根据错误消息,您可能具有默认的postgres配置,该配置将所有PostgreSQL连接的客户端身份验证方法设置为"IDENT"。

您一定要阅读PostgreSQL手册中的第19.1节"客户端身份验证",以便更好地了解可用的身份验证设置(对于pg_hba.conf中的每条记录),但这里有相关的代码片段来帮助解决您遇到的问题(来自9.5版手册) ):

trust

Allow the connection unconditionally. This method allows anyone that
can connect to the PostgreSQL database server to login as any
PostgreSQL user they wish, without the need for a password or any
other authentication. See Section 19.3.1 for details.

reject

Reject the connection unconditionally. This is useful for"filtering
out" certain hosts from a group, for example a reject line could block
a specific host from connecting, while a later line allows the
remaining hosts in a specific network to connect.

md5

Require the client to supply a double-MD5-hashed password for
authentication. See Section 19.3.2 for details.

password

Require the client to supply an unencrypted password for
authentication. Since the password is sent in clear text over the
network, this should not be used on untrusted networks. See Section
19.3.2 for details.

gss

Use GSSAPI to authenticate the user. This is only available for TCP/IP
connections. See Section 19.3.3 for details.

sspi

Use SSPI to authenticate the user. This is only available on Windows.
See Section 19.3.4 for details.

ident

Obtain the operating system user name of the client by contacting the
ident server on the client and check if it matches the requested
database user name. Ident authentication can only be used on TCP/IP
connections. When specified for local connections, peer authentication
will be used instead. See Section 19.3.5 for details.

peer

Obtain the client's operating system user name from the operating
system and check if it matches the requested database user name. This
is only available for local connections. See Section 19.3.6 for
details.

ldap

Authenticate using an LDAP server. See Section 19.3.7 for details.

radius

Authenticate using a RADIUS server. See Section 19.3.8 for details.

cert

Authenticate using SSL client certificates. See Section 19.3.9 for
details.

pam

Authenticate using the Pluggable Authentication Modules (PAM) service
provided by the operating system. See Section 19.3.10 for details.

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

  • 更改pg_hba.conf中定义的身份验证方法
    文件到trustmd5password(取决于您的安全性
    您需要的本地连接记录
    在那里定义。

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

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

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


    只需添加-h localhost位就可以了


    您可以设置环境变量PGHOST=localhost

    1
    2
    3
    4
    5
    6
    7
    $ 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:

    如果以上都不适合您:

    我已经做了很多Postgres安装,但今天在RedHat 6.5系统上安装了(安装Postgres 9.3)。我在Aron上面显示的典型hba.conf配置不起作用。事实证明我的系统正在使用IPV6,而忽略了IPV4配置。添加行:

    1
    host    ALL             ALL             ::1/128                 password

    允许我成功登录


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

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

    我使用了以下设置:

    的pg_hba.conf

    1
    2
    3
    4
    5
    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

    最终成功连接以下命令:

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


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

    1
    2
    sudo apt-GET install pidentd
    sudo service postgresql restart

    然后识别工作。


    嗯......

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

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

    来自PostgreSQL:文档:9.3:psql:

    If you omit the host name, psql will connect via a Unix-domain socket to a server on the local host, or via TCP/IP to localhost on machines that don't have Unix-domain sockets.

    如果您没有运行类似psql ... -h host_name ...的东西,并且您正在运行Ubuntu,那么psql应该通过Unix域套接字进行连接,因此PostgreSQL可能未配置为允许其中一种密码验证方法用于postgres用户。

    您可以通过运行来测试:

    sudo -u postgres psql

    如果上述方法有效,您的服务器可能配置为使用postgres用户进行本地连接的对等身份验证,即要求操作系统确认您的用户名是否为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文件时进行连接:

    1
    2
    # Connection TYPE   DATABASE   USER       IP addresses   Method
    LOCAL               ALL        postgres                  md5

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

    如果要在psql命令中包含主机名,请改为添加以下条目:

    1
    2
    # Connection TYPE   DATABASE   USER       IP addresses   Method
    host                ALL        postgres   127.0.0.1/32   md5

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

    有关pg_hba.conf的更多信息

    来自PostgreSQL:文档:9.3:pg_hba.conf文件[大胆强调我的]:

    The first record with a matching connection type, client address, requested database, and user name is used to perform authentication. There is no"fall-through" or"backup": if one record is chosen and the authentication fails, subsequent records are not considered. If no record matches, access is denied.

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

    1
    2
    # Connection TYPE   DATABASE   USER       IP addresses   Method
    LOCAL               ALL        postgres                  peer

    然后你将无法通过以下方式连接:

    psql -u postgres

    除非其中一个条目位于前一个条目上方的pg_hba.conf文件中:

    1
    2
    3
    4
    5
    # 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!


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

    1
    2
    3
    4
    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.


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 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


    我花了更多的时间来解决这个我不想承认的错误。

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

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

    1
    2
    3
    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"

    事实证明这个默认行导致拒绝。

    1
    host    ALL             ALL             127.0.0.1/32            ident

    尝试评论出来。


    如果您已完成所有这些但仍然无效,请检查该用户的到期日期:

    Postgres密码验证失败


    在我的情况下,解决方案在这里:(对于有关人员)
    登录postgres:

    1
    2
    3
    sudo -i -u postgres
    psql
    ALTER USER postgres WITH PASSWORD 'postgres'; # TYPE your password here

    问候


    一个黑客就是编辑pg_hba.conf

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

    暂时

    1
    2
    # DATABASE administrative login BY Unix DOMAIN socket
    LOCAL   ALL             postgres                                   trust

    此时你已经完成了。为了安全起见,那就去吧

    1
    2
    sudo -u postgres psql template1
    ALTER USER postgres WITH encrypted password 'your_password';

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

    1
    2
    # DATABASE administrative login BY Unix DOMAIN socket
    LOCAL   ALL             postgres                                   md5

    对于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排)

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

    主持所有127.0.0.1/32 md5


    我有类似的问题,我在pg_hba.conf中修复了它,即使对于IP6地址也删除了所有的身份识别方法(尽管我在机器上只有IP4)。

    1
    2
    3
    4
    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

    在执行了以下操作之后,我有了相同的问题:在Ubuntu 12.04中进行Rails开发的PostgreSQL设置

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

    1
    2
    3
    4
    5
    6
    7
    development:
      adapter: postgresql
      encoding: unicode
      DATABASE: (appname)_development
      pool: 5
      username: (username you GRANTED appname DATABASE priviledges TO)
      password:


    如果您在CentOS上使用它,您可能需要在制定上述解决方案后重新加载postgres:

    1
    systemctl restart postgresql-9.3.service


    这对我有用:

    FATAL: Ident authentication failed for user "postgres"

    1
    2
    3
    4
    5
    6
    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