您的位置:首页 > 运维架构 > Linux

Centos下本地连接postgresql时出现认证错误的问题

2016-03-28 21:51 323 查看
出现这个问题,主要原因在于postgresql的配置的认证权限不对。

postgresql的配置权限的文件在

/var/lib/pgsql/data/pg_hba.conf

里面主要是关于认证权限的配置

PostgreSQL 支持下面这些身份验证方式:

trust
password
peer
ident
GSSAPI
SSPI
Kerberos
LDAP
RADIUS
certificate
PAM

我们先详细讲解一下 PostgreSQL 中四种最常见的身份验证方式。

trust 身份验证
当使用 trust 身份验证方式时, PostgreSQL 会认为凡是能连接到该数据库服务器的,都是可信任的,可以随意访问数据库,而不管他们用什么数据库用户名来访问。这里边包含了如下几个意思:

trust 方式需要你提供正确的数据库用户名,但是不需要提供密码。用不存在的数据库用户名来登录,那是不行的。
数据库用户名可以没有对应的操作系统用户名(通常来说同名)。
对于本地连接(Unix domain socket)来说,该方式实际上是把身份验证的职责全权交给了操作系统,只要取得了操作系统的访问权就取得了 PostgreSQL 的访问权。
如果在TCP/IP连接上使用 trust 身份验证方式,那就等价于没有身份验证了。

基于密码的身份验证
基于密码的身份验证方式包括 md5 和 password。这两种方式非常相似,唯一的区别在于传输密码的时候前者是md5加密的,后者是明文的。同样的:

既需要提供正确的数据库用户名,也需要提供密码。需要特别注意的是,采用md5方式的时候,并不需要你提供md5加密的密码,直接输入明文密码即可。psql, pgadmin, jdbc 会自动进行md5加密的。
数据库用户名可以没有对应的操作系统用户名(通常来说同名)。
对于本地连接(Unix domain socket)来说,该方式既需要你获取操作系统访问权,还需要你提供数据库用户密码来获取 PostgreSQL 的访问权。
如果在TCP/IP连接上使用基于密码的身份验证方式,身份验证是基于密码的。

ident 身份验证
ident 方式通过 Identification 协议,从 ident 服务器获得客户端操作系统用户名,然后把操作系统用户名作为数据库用户名。该方式只能用于TCP/IP连接。当 ident 被用于本地(非TCP/IP)链接时, 实际上采用的是 peer 方式。

RFC 1413 文档描述了 Identification 协议。几乎所有的Unix类操作系统都提供了 ident 服务器(openSUSE可以安装 oidentd或者 pidentd),这些 ident 服务器默认监听 TCP 113 端口。ident 服务器的基本功能就是回答类似“哪个用户建立了从你的X端口出来然后连入我的Y端口的连接?”的问题。由于 PostgreSQL 知道物理链接的 X 端口和 Y端口,它就可以询问链接客户端所在主机上的 ident 服务器,从而可以知道这条链接是哪个操作系统用户建立的。

这个流程的缺点是它依赖于客户端的完整性:如果客户端机器不可信,攻击者可以在113端口运行任意程序并返回任意用户名。因而这种身份验证方式只适合于封闭网络,而且该网络中的所有客户端机器都必须严格控制,数据库管理员和系统管理员必须紧密联系。换句话说,你必须信任运行 ident 服务器的机器。同时你还必须注意,RFC 1413协议明确说明了,Identification 协议的设计意图并不是为了身份验证和访问控制。

一些 ident 服务器提供了非标准选项,会导致返回加密了的用户名,而加密时使用的密钥只有 ident 服务器的管理员知道。这些 ident 服务器要和 PostgreSQL 协同工作,一定不能使用这些选项,因为 PostgreSQL 无法解密返回的字符串,无从知道真实用户名。

同样的:

需要提供正确的数据库用户名,不需要提供密码。且该数据库用户名必须和建立数据库链接的操作系统用户名一致,通常来说就是启动客户端应用的操作系统用户名。
数据库用户名必须有对应的操作系统用户名(通常来说同名)。
不能应用在本地连接上。
如果在TCP/IP连接上使用该验证方式,相当于身份验证完全交给了数据库客户端应用所在的机器。和 trust 方式一样,极其不安全。

peer 身份验证
peer 身份验证方式通过客户端操作系统内核来获取用户名,并作为数据库用户名来进行登录。该方式只能应用在本地连接上。peer 身份验证方式只能在那些提供了getpeereid()函数,SO_PEERCRED socket参数或者类似机制的操作系统中使用。当前包括 Linux,大多数 BSD系统比如 Mac OS X 和 Solaris。

需要提供正确的数据库用户名,不需要提供密码。且该数据库用户名必须和启动客户端应用的操作系统用户名一致,比如使用 bruce 用户启动了 pgadmin, 那么在连接数据库时就必须提供 bruce 用这个数据库用户名。
数据库用户名必须有对应的操作系统用户名(通常来说同名)。
如果在本地连接上使用该验证方式,相当于身份验证完全交给了数据库客户端应用所在的机器。和 trust 方式一样,极其不安全。
不能应用在 TCP/IP 链接上。

在Centos中安装的postgresql,默认的本地认证方式是ident,也就是peer。数据库的用户名必须有对应的操作系统用户名,因此如果一个叫Jedi的操作系统用户,要以postgres用户身份登录,就会出现“认证错误”。大家可以把认证方式改为trust或者password,就可以了。

再多说一句,操作系统的用户与postgresql中的用户是两码事,可以有不同的密码。如果是用的password的认证方式,那么你用postgres登录操作系统后,还需要再次输入postgresql的密码,才能进入数据库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: