PostgreSQL数据库用户认证
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PostgreSQL数据库用户认证作者:小P
来自:
摘要:为了保证PostgreSQL数据库的安全性,我们需要对访问数据库的用户进行身份验证,本文介绍了有关于PostgreSQL数据库的用户认证的基本知识;
目录
1. pg_hba.conf 文件;
1.1 各个字段的含义;
1.2 authentication-method(认证方法);
1.3 示例 ;
2. 认证方法;
2.1. 信任认证;
2.2. 口令认证;
2.3. Kerberos 认证;
2.4. 基于 Ident 的认证;
2.4.1. 透过 TCP/IP 的身份认证;
2.4.2. 透过本地套接字的身份认证;
2.4.
3. Ident 映射;
2.5 一个 pg_ident.conf 文件例子;
2.6 PAM 认证;
3. 认证问题;
4. 关于本文;
5. 更新日志;
6. 参考文档;
7. 相关文档;
+++++++++++++++++++++++++++++++++++++++++++
正文
+++++++++++++++++++++++++++++++++++++++++++
当一个客户端应用与数据库服务器进行联接时,它声明它将以哪个PostgreSQL 用户的名称进行联接,就象我们登录一台Unix 计算机一样.在SQL 环境里,活跃的数据库用户名决定数据库对象的各种访问。
因此,实际上我们要限制的是用户可以联接的数据库; 认证是数据库服务器建立客户端应用的标识,然后通过一些手段判断是否允许此客户端应用(或者运行这个客户端应用的用户)与它所要求的用户名进行联接的过程; PostgreSQL 提供多种不同的客户端认证方式.认证某个特定客户端联接所使用的方法可以通过基于(客户端)的主机地址,数据库和用户的方式进行选择;一些认证方法还允许你通过用户名进行限制; PostgreSQL 用户名在逻辑上是和服务器运行的操作系统用户名相互独立的.如果某个服务器的所有用户在那台服务器机器上也有帐号,那么给数据库用户赋与操作系统用户名是有意义的.不过,一个接收远程访问的服务器很有可能有许多没有本地帐号的用户,因而在这种情况下数据库用户和操作系统用户名之间不必有任何联系;
1. pg_hba.conf 文件;
客户端认证是由数据目录里的文件pg_hba.conf 控制的,比如: /etc/postgresql/8.2/main/pg_hba.conf (hba 的意思是host-based authentication:基于主机的认证.)在initdb初始化数据目录的时候,它会安装一个缺省的文件; 文件pg_hba.conf 的常用格式是一套记录,每行一条。空白行行被忽略,井号( "#" )开头的注释也被忽略。一条记录是由若干用空格和/或tab 分隔的字段组成。如果字段用引号包围,那么它可以包含空白.记录不能夸行存在; 每条记录声明一种联接类型,一个客户端IP 地址范围(如果和联接类型相关的话),一个数据库名,一个用户名字,以及对匹配这些参数的联接使用的认证方法.匹配联接类型,客户端地址和联接企图请求的数据库名和用户名的第一条记录将用于执行认证.这个处理过程没有"跨越"或者"回头"的说法∶如果选择了一条记录而且认证失败,那么将不考虑后面的记录.如果没有匹配的记录,那么访问将被拒绝.每条记录可以下面三种格式之一: local database user
authentication-method [authentication-option]
host database user IP-address IP-mask authentication-method [authentication-option]
hostssl database user IP-address IP-mask authentication-method [authentication-option]
1.1 各个字段的含义;
local
这条记录匹配通过Unix 域套接字进行的联接企图.没有这种类型的记录,就不允许Unix 域套接字的联接。
host
这条记录匹配通过TCP/IP 网络进行的联接尝试.请注意,除非服务器是带着-i 选项或者打开了postgresql.conf 里面的tcpip_socket 配置参数集启动的,否则TCP/IP 联接是被禁止掉的.
hostssl
这条记录匹配通过在TCP/IP 上进行的SSL 联接企图.host 记录可以匹配SSL 和非SSL 的联接企图,但hostssl 记录需要SSL 联接。
要使用这个选项,制作服务器的时候必须打开SSL 支持.而且在服务器启动的时候,必须打开在postgresql.conf里的ssl选项。
database
声明记录所匹配的数据库。值all 表明该记录匹配所有数据库,值sameuser表示如果被请求的数据库和请求的用户同名,则匹配。samegroup 表示请求的用户必须是一个与数据库同名的组中的成员。在其他情况里,这就是一个特定的PostgreSQL 的名字。我们可以通过用逗号分隔的方法声明多个数据库。一个包含数据库名的文件可以通过对该文件前缀@ 来声明.该文件必需和pg_hba.conf 在同一个目录;user
为这条记录声明所匹配的PostgreSQL用户.值all 表明它匹配于所有用户.否则,它就是特定PostgreSQL 用户的名字.多个用户名可以通过用逗号分隔的方法声明.组名字可以通过用+ 做组名字前缀来声明.一个包含用户名的文件可以通过在文件名前面前缀@ 来声明.该文件必需和pg_hba.conf 在同一个目录;
IP-address
IP-mask
这两个字段包含标准的点分十进制表示的IP地址/掩码值。(IP地址只能用数字的方式声明,而不能用域名或者主机名。)它们俩放在一起,声明了这条记录匹配的客户机的IP 地址。准确的逻辑是(actual-IP-address xor IP-address-field) and IP-mask-field 对于要匹配的记录必需为零.(当然,IP地址是可以欺骗的,但是这个考虑在PostgreSQL 的范围之外。)这些域只适用于host 和hostssl 记录;
1.2 authentication-method(认证方法);
trust
无条件地允许联接.这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意PostgreSQL 数据库用户身份进行联接,而不需要口令。
reject
联接无条件拒绝.常用于从一个组中"过滤"某些主机.
md5
要求客户端提供一个MD5 加密的口令进行认证.这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法.
crypt
类似md5 方法,只是用的是老式的crypt 加密认证,用于7.2 以前的客户端.对于7.2 以及以后的客户端,我们建议使用md5.
password
和"md5"一样,但是口令是以明文形式在网络上传递的.我们不应该在不安全的网络上使用这个方式;krb4
用Kerberos V4 认证用户.只有在进行TCP/IP 联接的时候才能用;
krb5
用Kerberos V5 认证用户.只有在进行TCP/IP 联接的时候才能用;
ident
获取客户的操作系统名(对于TCP/IP 联接,用户的身份是通过与运行在客户端上的ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。)然后检查一下,看看用户是否允许以要求的数据库用户进行联接,方法是参照在ident 关键字后面声明的映射;如果你使用了sameuser 映射,那么假设用户名是相等的。如果没有声明这个关键字,则在与pg_hba.conf 同目录的pg_ident.conf 文件中找出