在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我得到一个密码,但是当我使用这样psql -U postgres的“postgres”帐户登录时,我没有密码提示并且已经登录.
如果我用psql -U postgres -W强制密码提示,我可以通过键入正确的密码或根本不输入任何内容登录.键入错误的密码被拒绝.
有人可以向我解释为什么会发生这种情况吗?
在相关的说明中:我看到很多例子,人们使用ident作为“postgres”用户的身份验证方法,认为要成为“postgres”用户需要机器的root密码.我认为推理是,如果攻击者获得root访问权限,那么你完成了任务.我更喜欢使用密码登录,与密码不一致.我推荐为不同的东西使用不同的密码.这是否合理?
输出grep’^ [^#]’pg_hba.conf
local all postgres md5 local all all md5 host all all 127.0.0.1/32 md5
解决方法
您的pg_hba.conf应该确实需要unix套接字连接的密码,但还有一些方法应该验证:
>包含密码的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.