为默认 Postgres 账户设置密码验证

为默认 Postgres 账户设置密码验证

我正在尝试解决 Nessus 扫描期间发现的一个问题,该问题涉及默认 postgres 帐户没有身份验证。

https://www.tenable.com/plugins/nessus/10483

我一直在尝试为 postgres 用户添加 md5 身份验证,但我不知道我做错了什么。我使用以下命令为密码生成了 md5sum:

echo -n test | md5sum

我复制了该哈希并将其应用于以下命令:

psql -c "alter user postgres password 'md5{hash here}';"

我收到了“ALTER ROLE”反馈。然后我尝试修改我的 pg_hba.conf 文件以显示以下内容。对于此示例,“其他”是我们应用程序使用的用户,该用户无法进行身份验证,否则会破坏功能(我们必须重写大量代码才能允许它)。

local postgres postgres md5
local other other trust
host other other 0.0.0.0/0 trust
host postgres postgres 0.0.0.0/0 md5
host replication postgres 0.0.0.0/0 md5
host all all ::1/128 ident

而原始文件如下所示:

local all all trust
host all all 0.0.0.0/0 trust
host replication postgres 0.0.0.0/0 trust
host all all ::1/128 ident

经过这些更改后,每当我尝试输入 postgres 的密码时,都会出现以下错误:

psql: server closed the connection unexpectedly
          This probably means the server terminated abnormally
           before or while processing the request.

然后尝试连接到“其他”用户会导致此错误:

psql:  could not connect to server: Connection refused 
           Is the server running locally and accepting
           connections on Unix domain socket "/tmp/.s.PGSQL.9999"?

postgresql.conf 文件包含以下行:

listen_addresses = *

我是不是漏掉了什么?在我通过“信任”方法进行这些更改之前,两个用户都能够连接。

另外,我生成和输入密码的 md5sum 的方法是否正确,以便您在连接时通过提供密码而不是哈希值来进行连接?

编辑:查找并检查日志文件后,我发现以下内容:

>FATAL: password authentication failed for user "postgres"
>DETAIL: Connection matched pg_hba.conf line 83: "host all postgres 0.0.0.0/0 md5"

对于相同的时间戳,此信息出现多次。这是在对 pg_hba.conf 文件进行更改后重新启动后发生的。我甚至还没有尝试登录 postgres。后台肯定有什么东西在尝试连接。我是否需要在某个地方有一个凭证文件来存储密码哈希值之类的东西?

编辑:我设法通过将 pg_hba.conf 中的身份验证方法设置为“password”而不是 md5,并在更改用户时使用明文密码,使其仅要求 postgres 帐户输入密码,但现在,该服务似乎间歇性崩溃。我会登录一个帐户,退出,尝试另一个帐户,退出,然后尝试另一个,突然它会说:

psql:  could not connect to server: No such file or directory
           Is the server running locally and accepting
           connections on Unix domain socket "/tmp/.s.PGSQL.9999"?

有人知道这是什么原因造成的吗?

答案1

首先,Postgres 使用的密码哈希方案比密码的 MD5 哈希稍微复杂一些:它是密码和用户名连接的 MD5 哈希(参见这个问题)。因此,在您的示例中,您应该使用:

ALTER ROLE postgres WITH PASSWORD 'md5633bc3c3d823be2a52d3dff94031e2c2';

其中633bc3c3d823be2a52d3dff94031e2c2是 的哈希值testpostgres。然而这相当于:

ALTER ROLE postgres WITH ENCRYPTED PASSWORD 'test';

或者,ENCRYPTED如果参数password_encryption(默认)。

你的第二个问题是由于维护任务无法登录 Postgres。您应该允许用户postgres使用 Unix 域套接字无需密码即可登录:

local all postgres peer

这是非常安全的,因为 Unix 域套接字可以识别调用用户。

相关内容