我已经使用MySQL多年了,所以我可能天真地将我对MySQL的期望分层到Posgres,但我正在闯墙。我使用flasktut
创建了一个用户LOGIN CREATEDB
但是当我尝试登录时,我得到了
psql: FATAL: Peer authentication failed for user "flasktut"
- 我尝试重置密码:
postgres=# ALTER USER flasktut WITH PASSWORD 'zx80xb1';
ALTER ROLE
我仍然看到错误。我怀疑我在这里做了一些非常明显错误的事情?
答案 0 :(得分:1)
我认为您的问题的简单答案是登录到Postgres数据库有两个部分,而您只考虑一个。
登录Postgres,有两个部分:
外部安全检查确保可以(禁止)某些IP地址/子网/本地或外部主机甚至“到达”Postgres数据库。第二个方面是允许用户/数据库的给定组合通过。重要的是,您当前的设置可能缺少这方面,虽然您似乎已经处理了第2点(下面),但这并不重要,因为登录尝试甚至没有达到第2步。
< / LI>登录过程通过外部检查后,数据库/用户本身应该有效/存在且可用。
第一个方面(上面)由pg_hba.conf文件控制,你需要确保的是,当数据库通过pg_hba.conf文件进行解析时,“第一个”行足够宽松地应用对于给定的登录方案,被接受为该登录尝试的有效“规则”。
例如
如果在本地登录(没有127.0.0.1
或eth0
等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
这不会在日志或历史记录中清除密码的痕迹。