在Ubuntu 12.04上安装PostgreSQL 9.1后,我为“postgres”超级用户帐户设置了密码。我希望所有用户在登录时都必须输入密码。这就是我这样配置pg_hba.conf的原因:
#Database administrative login by Unix domain socket
local all postgres md5
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all md5
我做了这些更改后重新启动了postgresql。当我执行此操作psql -U testuser
时,系统会要求我输入密码,但当我使用“postgres”帐户登录时psql -U postgres
,我没有输入密码并登录。
如果我使用psql -U postgres -W
强制密码提示,我可以通过输入正确的密码或完全不输入任何内容来登录。输入错误的密码会被拒绝。
有人可以向我解释为什么会这样吗?
在相关的说明中:我看到很多例子,其中人们使用ident作为“postgres”用户的身份验证方法,认为要成为“postgres”用户需要机器的root密码。我假设推理是,如果攻击者获得root访问权限,那么无论如何都要完成。我更喜欢使用密码登录,一个与root密码不同。我喜欢为不同的东西设置不同的密码。这合理吗?
grep '^[^#]' pg_hba.conf
local all postgres md5
local all all md5
host all all 127.0.0.1/32 md5
答案 0 :(得分:13)
你的pg_hba.conf
确实需要一个unix socket连接的密码,但仍然有办法解决它:
postgres主目录中包含密码的.pgpass
文件(同时检查PGPASSFILE环境变量是否存在非标准路径。)
可以设置PGPASSWORD环境变量。
还有可能你正在编辑错误的pg_hba.conf文件。
当作为postgres连接时,可以使用SHOW hba_file
SQL命令获取正确的路径以进行验证。
此外,您可能需要检查日志文件/var/log/postgresql/postgresql-9.1-main.log
以确认在请求时重新加载配置文件,并在身份验证期间查找任何可疑消息。
至于与postgres用户无密码连接的常见原因,debian PG-9.1 pg_hba.conf
有关于禁止它们的评论:
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local all postgres peer
由于Debian和Ubuntu使用相同的postgres包,这也适用于Ubuntu。
答案 1 :(得分:5)
重申你的奇怪行为,我认为你错过了pg_hba.conf
特定于postgres
用户的一行grep '^[^#]' pg_hba.conf
。请显示输出:
postgres
至于ident vs md5;我个人更喜欢在开发中使用ident进行交互式使用,对普通用户来说这很好,但我不认为通过sudo
访问sudo -u postgres psql
用户是一个好主意。 psql -U postgres -W
和sudo
都授予对postgres超级用户角色的访问权限,从而授予对数据库用户的文件系统访问权限。既不需要root密码,也可以通过sudoers
轻松限制psql
,以限制调用用户只运行sudo -u postgres psql
。但是,使用postgres
时,客户端代码也会以sudoer
运行,因此它是一个更大的攻击面,并且用户总是有机会找到绕过{{{ 1}}限制。
我在开发中使用ident
,在生产中使用md5
。