为什么我不能登录Postgres?

时间:2016-03-08 21:39:12

标签: postgresql

我已经使用MySQL多年了,所以我可能天真地将我对MySQL的期望分层到Posgres,但我正在闯墙。我使用flasktut创建了一个用户LOGIN CREATEDB但是当我尝试登录时,我得到了 psql: FATAL: Peer authentication failed for user "flasktut" - 我尝试重置密码:

postgres=# ALTER USER flasktut WITH PASSWORD 'zx80xb1';
ALTER ROLE

我仍然看到错误。我怀疑我在这里做了一些非常明显错误的事情?

5 个答案:

答案 0 :(得分:1)

我认为您的问题的简单答案是登录到Postgres数据库有两个部分,而您只考虑一个。

登录Postgres,有两个部分:

  1. 外部安全检查确保可以(禁止)某些IP地址/子网/本地或外部主机甚至“到达”Postgres数据库。第二个方面是允许用户/数据库的给定组合通过。重要的是,您当前的设置可能缺少这方面,虽然您似乎已经处理了第2点(下面),但这并不重要,因为登录尝试甚至没有达到第2步。

    < / LI>
  2. 登录过程通过外部检查后,数据库/用户本身应该有效/存在且可用。

  3. 第一个方面(上面)由pg_hba.conf文件控制,你需要确保的是,当数据库通过pg_hba.conf文件进行解析时,“第一个”行足够宽松地应用对于给定的登录方案,被接受为该登录尝试的有效“规则”。

    例如

    如果在本地登录(没有127.0.0.1eth0等IP地址)

    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    

    应该允许任何登录进程通过。一旦你能够登录,尝试限制并使事情更安全(因为上述将允许每次尝试通过)。

    重要的是,后续行虽然可能更安全/更合适,但如果配置文件中的前一行已被视为登录尝试的候选者,则它们将不适用。此外,请不要忘记在每次更改为pg_hba.conf后重新启动/重新加载Postgres。

答案 1 :(得分:0)

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

所以编辑pg_hba.conf文件并添加/更新行:

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

重新启动服务器以使更改生效。

现在运行psql -d <your_db> -U flasktut

由于我们将方法设置为“信任”并且您应该登录,因此不应该询问密码。

当你对自己的postgres技能有信心时,你应该将上面的'trust'改为更安全的东西,比如'md5'。

答案 2 :(得分:0)

这里有两件事要考虑。

首先,settings in pg_hba.conf需要允许您连接到您尝试连接的任何数据库。文件中的典型条目如下所示:

host       my_db   myself  192.168.1.17/32  md5
host       all     all     192.168.1.0/24   md5

第一行允许来自特定远程客户端(myself)的特定用户(192.168.1.17/32)通过TCP / IP连接到特定数据库(my_db){{1 }})。第二行允许任何用户连接到网络host上的任何数据库,这是家庭或小型办公室的典型网络地址。两者都需要使用密码(192.168.1.0/24)进行身份验证。您应该添加上述任一行,以允许md5甚至到达服务器以建立连接。请注意,更改此文件时,需要重新启动服务器才能使更改生效。

第二个问题是您的新用户flasktut需要具有连接到他/她想要连接的数据库的权限:

flasktut

然后在该数据库中,您必须直接授予访问对象的权限,或者通过在具有所需权限的组角色中授予角色GRANT CONNECT ON DATABASE some_db TO flasktut; 成员身份来授予权限:

flasktut

如果GRANT some_role TO flasktut; 将拥有自己的数据库,那么作为超级用户冒充用户flasktut来创建数据库,然后让真实用户登录到该数据库,你可能会更好/自己:

flasktut

答案 3 :(得分:0)

我认为您已经使用了localhost端口服务器,因此您可以在localhost端口服务器中创建另一个数据库(无需在postgres中添加服务器,直接从该端口服务器创建数据库)


你可以查看pg_hba.conf中的设置吗? https://help.ubuntu.com/stable/serverguide/postgresql.html

答案 4 :(得分:0)

PostgreSQL身份验证系统在pg_hba.conf中管理。可以配置多个authentication mechanisms,具体取决于连接的方式,数据库和用户。

来自MySQL背景的可能令人惊讶的是Linux安装中经常使用的默认配置:默认情况下,它使用peer身份验证进行本地连接。

以下是Debian / Ubuntu系统的默认值:

# Database administrative login by Unix domain socket
local   all             postgres                                peer
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
  • peer查找当前运行psql(或任何PostgreSQL客户端)的Linux用户。在这种情况下,不使用密码验证,但它依赖于提供用户名的操作系统。这只适用于本地,在这里使用Unix套接字(当你没有为psql指定任何内容时,这是默认设置。)

  • md5会要求输入密码,但此配置只适用于此配置中的网络连接。

因此,如果我按如下方式创建用户和数据库(以postgres登录):

postgres@mymachine:~$ createuser -S -D -R -P myuser
Enter password for new role: 
Enter it again: 

postgres@mymachine:~$ createdb -E UTF-8 -O myuser mydb

这将尝试使用unix套接字进行连接,但失败是因为我仍然以[{1}}身份登录,而不是postgres(该系统可能存在或不存在) :

myuser

(如果我在Linux shell中以postgres@mymachine:~$ psql -U myuser mydb psql: FATAL: Peer authentication failed for user "myuser" 身份登录,那就可以了。)

相反,如果我明确指定我想通过网络连接(虽然myuser),我会提示输入密码,我可以登录:

127.0.0.1

postgres@mymachine:~$ psql -U myuser -h 127.0.0.1 mydb Password for user myuser: psql (9.1.20) SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256) Type "help" for help. mydb=> 机制是一种存在最大安全风险的机制,因为它不会检查任何内容,而是检查该行的连接模式。

例如:

trust

除了重置丢失的# This will let any local user connect to any DB via the Unix socket # without any authentication: local all all trust # This will let any user connect to any DB via 127.0.0.1 # without any authentication: host all all 127.0.0.1/32 trust # And worse (DO NOT USE): # This will let any user connect to any DB from anywhere # without any authentication: host all all 0.0.0.0/0 trust (管理员)密码之外,使用postgres的密码是合理的。

作为附注,您说您已使用此更改trust中的密码:

psql

这确实有效,但有一些副作用:密码现在可能会在postgres=# ALTER USER flasktut WITH PASSWORD 'zx80xb1'; ALTER ROLE 中清除,也可能已经记录在服务器端(无论其日志发送到何处) )。

~/.psql_history范围内,通常最好使用psql命令:

\password

这不会在日志或历史记录中清除密码的痕迹。