看起来 postgresql 支持以下任何一种
- 使用 tcp(即 localhost:5432)和密码认证
- 使用具有对等/信任身份验证的 Unix 域 scoket(即 /var/run/postgresql/.s.PGSQL.5432 )
是否可以使用 unix 域套接字设置密码?
背景:
我使用 php-fpm 来运行多个应用程序。我希望不同的应用程序具有不同的数据库和密码,但它们将以相同的用户(www-data)运行。因此对等/信任身份验证并不好,因为如果一个应用程序受到威胁,它也可以读取另一个应用程序的数据。我也不能使用 tcp auth,因为我运行 php-fpm 服务PrivateNetwork=yes
以确保应用程序不能发出外部请求。unix 域套接字也比 tcp 具有更好的性能。
我不熟悉 php-fpm,但通常在 Postgres 中,如果您在连接字符串中省略了主机,但指定了用户名,那么它将作为指定用户连接。至少这是记录在案的行为,例如在
psql
.这样就解决了
例如,您可以为每个应用程序设置一个模式,每个应用程序有一个用户,并且只允许用户访问相应的模式。
您必须确保在 php-fm 中用户的选择不会受到具有 www-data 权限的人的影响。
但是,它不会给您密码。(但是存储在脚本中的密码并不安全,无论如何......)
这是典型的默认配置,但不是硬性行为。
它是服务器端pg_hba.conf配置文件,它根据连接的类型和来源,以及目标数据库和用户名,告知使用哪种身份验证方法。
通常在前几条规则中有这一行,它触发了
peer
Unix 本地域套接字的身份验证:要请求密码,请将其替换为
(或者更现代
scram-sha-256
的,而不是md5
服务器使用 SCRAM 散列的密码,自 Postgres 10 起可用)。对于 postgres 用户,配置中通常还有这个更具体的规则:
您可以保持原样或根据您的情况进行更改。规则按照出现的顺序进行解释,因此更具体的规则排在最前面。