前置条件:
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust
问题重现:
[homerwu@vmlinux ~]$ pgsql/bin/psql -d postgres -U ithomer psql (9.2.3) Type "help" for help. postgres=#
一时以为又出现了重大的安全漏洞,于是发邮件给PG开源社区,得到答复:“trust认证设计就是这样的,并且文档上也说明了”
感 觉不大可思议,这种登录方式类似Oracle中的 sqlplus / as sysdba命令,不同的是,对于非安装用户以这种方式登录时,Oracle返回了个认证错误的信息,直接就拒绝掉了。而PG的这种方式,不检查OS用户 名、用户组,直接就通过认证,感觉相当不安全(数据库默认本地用户认证方式就是为trust)。
后来,阅读了PG文档中关于认证部分的文档,改为ident认证方式("Identification Protocol"标识协议在
RFC 1413里面描述),指定哪些OS用户可以用那些PG用户名登录。对于那种需要直接在sysdba方式登录的用户可能有用。
解决方法:
1.修改ident认证文件pg_ident.conf,设定本地套接字认证方式的OS与PG用户名的映射关系,允许OS用户名为ithomer的,可以用PG 用户名ithomer以本地套接字认证方式登录。(同理,不在映射关系中的用户,就不允许登录。如果不设定pg_ident.conf,则PG默认映射关系为 sameuser,即只能以OS同名的PG用户名登录)
# MAPNAME SYSTEM-USERNAME PG-USERNAME
local_ident_user ithomer ithomer
2.调整pg_hba.conf本地认证方式为ident,映射名为之前设定的MAPNAMElocal_ident_user(不同PG版本设定方式稍微不同,得参考文档)
# "local" is for Unix domain socket connections only
local all all ident map=local_ident_user
3.重新加载数据库配置
pg_ctl reload