postgresql超级用户没有密码提示

时间:2012-08-14 10:03:21

标签: database postgresql authentication postgresql-9.1

在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

2 个答案:

答案 0 :(得分:13)

你的pg_hba.conf确实需要一个unix socket连接的密码,但仍然有办法解决它:

  1. postgres主目录中包含密码的.pgpass文件(同时检查PGPASSFILE环境变量是否存在非标准路径。)

  2. 可以设置PGPASSWORD环境变量。

  3. 还有可能你正在编辑错误的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 -Wsudo都授予对postgres超级用户角色的访问权限,从而授予对数据库用户的文件系统访问权限。既不需要root密码,也可以通过sudoers轻松限制psql,以限制调用用户只运行sudo -u postgres psql。但是,使用postgres时,客户端代码也会以sudoer运行,因此它是一个更大的攻击面,并且用户总是有机会找到绕过{{{ 1}}限制。

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