2016-03-08 54 views
0

我已经使用了MySQL多年,所以我可能会天真地将我对MySQL的期望分层到Posgres,但是我打了一堵墙。我创建了一个用户,flasktutLOGIN CREATEDB但是当我尝试登录,我得到 psql: FATAL: Peer authentication failed for user "flasktut" - 我试图重设密码:为什么我无法登录到Postgres?

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

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

+0

当你创建一个用户时,你必须将他授予一个分贝,然后当用户尝试登录时,他必须指定他尝试访问的数据库。除非他是超级用户。你如何创建用户? –

+0

_Peer身份验证_在没有密码的情况下发生。请参阅http://www.postgresql。org/docs/current/static/auth-pg-hba-conf.html,并将您的配置调整为最适合您需求的安全策略。 –

+0

你如何连接到服务器?编写你运行的psql命令。服务器是在本地机器还是远程机器上运行?如果它位于本地主机上,您是通过域套接字还是IP连接?查看pg_hba.conf文件。那里列出了所有登录方案及其身份验证方法。 – kliron

回答

0

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

那么编辑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的技能,你应该改变'相信'上面的东西更安全,如'MD5'。

1

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

登录到Postgres的,主要有两个部分:

  1. 外部安全检查确保特定IP地址/子网/本地或外地主机可以是(DIS)允许甚至是“达到”的Postgres数据库。第二个方面是,用户/数据库的给定组合可以通过。重要的是,您目前的设置可能会遗漏这方面的问题,尽管您似乎已经注意到了第2点(下图),但这并不重要,因为登录尝试甚至没有到达第2步。

  2. 一旦登录过程通过外部检查,数据库/用户本身应该是有效的/现有的和可用的。

第一方面(以上)由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。

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 

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

的第二个问题是,flasktut需要有许可,您的新用户连接到任何数据库,他/她想要连接到:

GRANT CONNECT ON DATABASE some_db TO flasktut; 

然后在该数据库中你必须授予权限访问的对象,无论是直接或通过在具有所需的权限一组角色授予角色flasktut成员:

GRANT some_role TO flasktut; 

如果flasktut都将有他/她自己的数据库,Y欧都可能会更好过超级用户身份冒充用户flasktut创建数据库,然后让真正的用户登录到数据库的她/他自己:

SET SESSION AUTHORIZATION flasktut; 
CREATE DATABASE some_db; -- somedb is owned by flasktut 
RESET SESSION AUTHORIZATION; 
0

我想你已经使用本地主机端口服务器,这样你就可以创建本地主机端口服务器(无需添加服务器的Postgres,直接从该端口服务器建立DB)


您可以检查pg_hba.conf中设置另一个数据库? https://help.ubuntu.com/stable/serverguide/postgresql.html

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当前的Linux用户(或任何PostgreSQL客户端)。在这种情况下,不使用密码认证,但它依赖提供用户名的操作系统。这只适用于本地,在这里使用的是Unix套接字(这是默认情况下,当您没有指定任何内容时,为psql)。

  • md5会要求输入密码,但这只是配置在此配置的网络连接。

其结果是,如果我创建了一个用户和DB如下(登录为postgres):

[email protected]:~$ createuser -S -D -R -P myuser 
Enter password for new role: 
Enter it again: 

[email protected]:~$ createdb -E UTF-8 -O myuser mydb 

这将尝试使用Unix套接字连接,并不能因为我米仍然登录作为postgres,而不是作为myuser(其可以或可以不甚至在该系统上存在):在Linux的SHEL

[email protected]:~$ psql -U myuser mydb 
psql: FATAL: Peer authentication failed for user "myuser" 

(如果我已经登录作为myuser 。L,它会工作)

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

[email protected]:~$ 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命令:

postgres=# \password flasktut 
Enter new password: 
Enter it again: 

这不会离开密码的一丝清晰的日志或历史。

相关问题