|
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 ] 各个字段的含义如下:
因为认证时系统是为每个联接请求顺序检查 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
|