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