13

在 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
4

2 回答 2

13

pg_hba.conf确实应该为 unix 套接字连接提供密码,但仍有一些方法可以验证:

  1. .pgpasspostgres 主目录中包含密码的文件(还要检查PGPASSFILE环境变量以获取非标准路径)。

  2. 可以设置 PGPASSWORD 环境变量

而且还有可能您正在编辑错误的 pg_hba.conf 文件。以 postgres 连接时,可以通过SHOW hba_fileSQL 命令获取正确的路径进行验证。

此外,您可能需要检查日志文件,/var/log/postgresql/postgresql-9.1-main.log以确认在您请求时重新加载了配置文件,并在身份验证期间查找任何可疑消息。

至于与 postgres 用户的无密码连接很常见的原因,debian PG-9.1pg_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。

于 2012-08-14T15:49:47.187 回答
5

关于您的奇怪行为,我认为您错过了pg_hba.conf特定于postgres用户的一行。请显示以下输出:

grep '^[^#]' pg_hba.conf 

至于ident vs md5;就我个人而言,我更喜欢 ident 在开发中进行交互式使用,这对普通用户来说很好,但我认为postgres通过提供用户访问权限并不是sudo一个好主意。两者都sudo -u postgres psql授予psql -U postgres -W 对 postgres 超级用户角色的访问权限,从而作为数据库用户授予文件系统访问权限。两者都不需要root密码,并且sudo可以很容易地通过sudoers限制调用用户来限制运行psql。然而,sudo -u postgres psql客户代码也运行postgres,所以它是一个更大的攻击面,并且用户总是有机会找到绕过你的sudoer限制的方法。

ident在开发中使用,md5在生产中。

于 2012-08-14T10:36:23.393 回答