您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

Chapter 4. 用户认证

当一个客户端应用与数据库服务器进行联接时,它声明 它将以哪个 PostgreSQL 用户的名称进行联接, 就象我们登录一台 Unix 计算机 一样.在 SQL 环境里,活跃的数据库用户名决定数据库对象的各种访问 权限--参阅 Chapter 7 获取相关的更多信息.因此, 很显然我们要对某个客户端可以使用的数据库用户名加以限制.

认证 是数据库服务器建立客户端应用的标识, 然后通过一些手段判断是否允许此客户端应用(或者运行这个客户端应用的 用户)与它所要求的用户名进行联接的过程.

PostgreSQL 提供多种不同的客户端认证方式.所使用的方法可以通过基于 (客户端)主机和数据库的方式进行选择;一些认证方法还允许你通过用户名 进行限制.

PostgreSQL 数据库用户名在逻辑上是和 服务器运行的操作系统用户名相互独立的. 如果某个服务器的所有用户在那台服务器机器上也有帐号, 那么给数据库用户赋与操作系统用户名是有意义的.不过, 一个接收远程访问的服务器很有可能有许多没有本地帐号的用户, 因而在这种情况下数据库用户和操作系统用户名之间不必有任何联系.

4.1. pg_hba.conf 文件

客户端认证是由数据目录里的文件 pg_hba.conf 控制的,比如, /usr/local/pgsql/data/pg_hba.conf . ( HBA 的意思是 host-based authentication:基于主机的认证.) 在 initdb 初始化数据区的时候,它会 安装一个缺省的文件.

文件 pg_hba.conf 的常用格式是一套记录, 每行一条。空白行或者井号( "#" )开头的行被忽略。一条记录 是由若干用空格和/或 tab 分隔的字段组成。

每条记录声明一种联接类型,一个客户端 IP 地址范围 (如果和联接类型相关的话),一个数据库名或者名字, 以及对匹配这些参数的联接使用的认证方法. 匹配联接类型,客户端地址和联接企图请求的数据库名的第一条记录 将用于认证阶段.这个处理过程没有 "跨越" 或者 "回头" 的说法∶如果选择了一条记录而且认证失败,那么 将不考虑后面的记录.如果没有匹配的记录,那么访问将被拒绝.

每条记录可以下面三种格式之一

local   

database

 

authentication-method

 [ 

authentication-option

 ]
host    

database

 

IP-address

 

IP-mask

 

authentication-method

 [ 

authentication-option

 ]
hostssl 

database

 

IP-address

 

IP-mask

 

authentication-method

 [ 

authentication-option

 ]
    

各个字段的含义如下:

local

这条记录适用于通过 Unix 域套接字的联接.

host

这条记录适用于通过 TCP/IP 网络的联接.请注意,除非服务器是 带着 -i 选项或者等效的配置参数集启动的,否则 TCP/IP 联接将完全被禁止掉.

hostssl

这条记录适用于试图建立在 TCP/IP 上的 SSL 之上的联接. 要使用这个选项,服务器必须带着 SSL 支持编译.而且在服务器启动的时候, 必须用 -l 选项或等效的配置设置打开 SSL. (注意∶ host 记录将匹配 SSL 或者非 SSL 的联接企图, 而 hostssl 记录只匹配 SSL 联接.)

database

声明记录所适用的数据库。值 all 表明该记录应用于所有数据库, 值 sameuser 表示于正在联接的用户同名的数据库。 否则它就是某个具体的 PostgreSQL 数据库名字.

IP address
IP mask

这两个字段以各主机的 IP 地址为基础, 声明一条 host 或者 hostssl 记录应用于哪个客户端机器. (当然,IP 地址可能会被欺骗(spoofed),但是这个考虑 超过了 PostgreSQL 的考虑范围.) 准确的逻辑是,对于匹配的记录

(

actual-IP-address

 xor 

IP-address-field

) and 

IP-mask-field

必需为零.

authentication method(认证方法)

声明一个用户在这条认证记录的控制下, 与该数据库联接时认证自己所必须使用的认证方法. 可能的选择在下面简介,详细情况在 Section 4.2

trust

无条件地允许联接.这个方法允许任何有登录客户机权限的用户以任意 PostgreSQL 数据库用户身份进行联接.

reject

联接无条件拒绝.常用于从组中 "过滤" 某些主机.

password

要求客户端提供一个口令, 并要求这个口令与为该用户设置的数据库口令必须匹配.

password 关键字后面可以声明一个可选的文件名. 系统预期这个文件包含一个用户列表,这些用户就是那些适用这条认证记录的用户, 以及它们可选的候选口令.

口令是以明文的方式在线路上传输的.如果要更好的保护,请使用 md5 crypt 方法.

md5

类似 password 方法,但是口令是用一种简单的 口令对应协议加密后在线路上传送的. 它可以防止偶然的线路侦听.目前这是我们建议的基于口令的认证方法.

md5 关键字后面 可以有一个文件,文件里包含可能使用这条认证记录进行联接的用户列表.

crypt

类似 md5 方法,只是用的是老式的 crypt 加密认证, 用于 7.2 以前的客户端.对于 7.2 以及以后的客户端,我们建议使用 md5 crypt 方法也不能和在 pg_shadow 里面的加密口令兼容,并且如果客户机和 服务器机器使用了不同的 crypt() 库过程实现也可能失败.

krb4

用 Kerberos V4 认证用户.只有在进行 TCP/IP 联接的时候才能用. (译注:Kerberos,"克尔波洛斯",故希腊神话冥王哈得斯的多头看门狗. Kerberos 是 MIT 开发出来的基与对称加密算法的认证协议和/或密钥 交换方法.其特点是需要两个不同用途的服务器,一个用于认证身份, 一个用于通道两端用户的密钥交换.同时 Kerberos 对网络时间同步 要求比较高,以防止回放攻击,因此通常伴随 NTP 服务.)

krb5

用 Kerberos V5 认证用户.只有在进行 TCP/IP 联接的时候才能用. (译注:Kerberos V5 是上面 V4 的改良,主要是不再依赖 DES 算法, 同时增加了一些新特性.)

ident

PostgreSQL 利用用户在登陆操作系统 时使用的身份来判断该用户是否可以作为他请求的数据库用户联接. 对于 TCP/IP 联接,用户的身份是通过于运行在客户端上的 ident 服务器联接进行判断的. (请注意,这个方法只是和远端的身份服务器同样可靠; 绝对不要在那些管理不可靠的院端机器上使用身份认证.) 在支持 Unix 域套接字的 SO_PEERCRED 请求的操作系统上, 身份认证也可以用于本地联接;然后系统就会被询问联接用户的身份.

在没有 SO_PEERCRED 请求的系统上,身份认证只能用于 TCP/IP 联接. 如果要绕开这个限制,你可以声明 localhost 的地址 127.0.0.1 然后 向这个地址联接.

跟在 ident 关键字后面的 authentication option 声明一个 ident map(身份映射) , 该文件声明那些操作系统用户等效于数据库用户.见下文获取详细信息.

pam

这个认证类型操作起来类似 password , 主要的区别是它要使用 PAM (可插入的认证模块,Pluggable Authentication Modules) 作为认证机制.跟在 pam 关键字后面的 认证选项 声明将传递给 PAM 的服务名字. 缺省的服务名是 postgresql . 有关 PAMD 的更多信息,请阅读 Linux-PAM 页面 和/或 Solaris PAM 页面.

authentication option(认证选项)

这个字段根据不同的认证方法(authentication method)有不同的 解释,如上所示.

因为认证时系统是为每个联接请求顺序检查 pg_hba.conf 里的记录的,所以这些记录的顺序 是非常关键的.通常,靠前的记录有比较严的联接匹配参数和比较弱的 认证方法,而靠后的记录有比较松的匹配参数和比较严的认证方法. 比如,我们一般都希望对本地 TCP 联接使用 trust 认证, 而对远端的 TCP 联接要求口令.在这种情况下我们将 trust 认证方法用于来自 127.0.0.1 的联接,这条记录将出现在 允许更广泛的客户端 IP 地址的使用口令认证的记录前面.

在启动和 postmaster 收到 SIGHUP 信号的时候, 系统都会重新装载 pg_hba.conf 文件. 如果你在活跃的系统上编辑了该文件,你就需要用 kill postmaster 发一个 SIGHUP 信号,好让它重新读取该文件.

Example 4-1 里是 pg_hba.conf 的一个例子. 阅读下文理解不同认证方法的细节.

Example 4-1. 一个 pg_hba.conf 文件的例子

# TYPE       DATABASE    IP_ADDRESS    MASK               AUTHTYPE  MAP

# 允许在本机上的任何用户以任何身份联接任何数据库
# 但必须是通过 IP 进行联接

host         all         127.0.0.1     255.255.255.255    trust

# 同样,但用的是 Unix-套接字联接

local        all                                          trust

# 允许 IP 地址为 192.168.93.x 的任何主机与数据库
# "template1" 相连,用与他们在自己的主机上相同 ident 的用户名标识他自己
# (通常是他的 Unix 用户名)

host         template1   192.168.93.0  255.255.255.0      ident     sameuser

# 允许来自主机 192.168.12.10 的用户与 "template1" 数据库联接,
# 只要该用户提供了在 pg_shadow 里正确的口令.

host         template1   192.168.12.10 255.255.255.255    md5

# 如果前面没有其它 "host" 行,那么下面两行将拒绝所有来自
# 192.168.54.1 的联接请求 (因为前面的记录先匹配
# 但是允许来自互联网上其它任何地方有效的 Kerberos V5 认证的联接
# 零掩码表示不考虑主机 IP 的任何位.因此它匹配任何主机:

host         all        192.168.54.1   255.255.255.255    reject
host         all        0.0.0.0        0.0.0.0            krb5

# 允许来自 192.168.x.x 的任何用户与任意数据库联接,只要他们通过 ident 检查
# 但如果 ident 说该用户是 "bryanh" 而他要求以
PostgreSQL
用户 "guest1" 联接,
# 那么只有在 `pg_ident.conf' 里有 "omicron" 的映射,说 "bryanh" 允许以
#  "guest1" 进行联接时才真正可以进行联接.

host         all        192.168.0.0    255.255.0.0        ident     omicron

# 如果下面是用于本地联接的仅有的两行,那么它们将允许本地用户
# 只和它们自己的数据库联接(数据库名和用户名同名),
# 只有管理员例外,他可以联接到任何数据库
# 文件 $PGDATA/admins 列出了那些允许与所有数据库联接的用户名.
# 在所有情况下都需要口令.(如果你喜欢使用 ident 认证,
# 那么一个 ident 映射可以起到这里的口令列表文件的作用.)

local        sameuser                                     md5
local        all                                          md5  admins