我正在遵循 PostgreSQL 安装指南,该指南建议(在首次安装数据库之后)为postgres
用户设置密码:
alter role postgres password '<<super-secret-password>>';
...然后更改pg_hba.conf
文件,以便本地(Unix)套接字的行读取:
local all all md5
... 代替:
local all all trust
在我看来,这只是增加了一层额外的防御,但对于要利用的人来说,local all all trust
他首先必须获得对本地机器的访问权,对吗?
问题 1:我是否理解正确,如果对本地计算机的访问受密码保护(UNIX 密码),那么应该不用担心 a local all all trust
?
此外,同一指南还建议将.pgpass
文件放在我的主文件夹中(我猜是备份脚本无法提示输入密码)。密码以明文形式存储在该~/.pgpass
文件中:
echo 'localhost:5432:*:postgres:<<super-secret-password>>' > .pgpass
chmod 0600 ~/.pgpass
问题 2:那么,使用本地套接字md5
而不是trust
本地套接字有什么好处?如果一个人可以访问本地机器,他也可以读取该.pgpass
文件。我错过了什么吗?
对于问题 1:当您拥有多用户计算机时,或者如果您可能为朋友/家人/同事/任何人添加其他用户帐户时,使用 md5 身份验证进行本地连接特别有用。
如果您现在是并且将仍然是您系统上唯一的实际用户,那么好处就更少了,但它仍然很有用:假设某个坏人设法闯入了某个系统帐户,例如“www”。如果没有 root 权限,他可能无法从该帐户做很多事情。但是如果你让你的 pg_hba.conf 对所有本地用户开放,那么坏人可以对你的数据库做任何事情,可能包括接管 'postgres' 用户帐户,然后继续尝试 root 你的系统,窃取您的数据,或从那里进行任何操作。
对于问题 2:您可以使用 .pgpass 文件,例如,只有“只读”用户的凭据,所以如果一个错误的购买接管了该帐户,他将没有超级用户级别的数据库访问权限。如果您确实将 postgres 用户的密码存储在您的 ~/.pgpass 中,那么是的,如果坏人接管了该本地用户帐户,那么您的 postgres 实例将“游戏结束”。同样,该文档是在考虑多用户计算机的可能用例的情况下编写的,例如,不同的本地用户可能拥有或使用各种 Postgres 用户帐户,不一定是超级用户帐户。