4.2. 认证方法

下面详细描述认证方法.

4.2.1. 口令认证

Postgres 数据库口令与任何操作系统用户口令无关. 通常,各个数据库用户的口令是存储在pg_shadown系统表里面的. 口令可以用查询语言命令CREATE USERALTER USER管理,也就是说, CREATE USER foo WITH PASSWORD 'secret';.缺省时,如果没有显式地设置口令,存储的口令是 “NULL” 并且该用户的口令认证总会失败.

要限制允许访问某数据库的用户集,在与pg_hba.conf同一目录的 一个独立的文件里列出用户(每用户 一行),然后在 pg_hba.confpasswordcrypt关键字后面 写下此文件的文件名(不用路径). 如果你不用这个特性,那么数据库系统识别的任何用户都可以与任意数据库 联接(当然,他得通过口令认证).

这些文件还可以用于对特定数据库或数据库集应用不同的口令集. 这时候,这个文件具有类似 Unix 口令文件 /etc/passwd 那样的格式,也就是下面这样,

username:password
任何跟在 password(口令)后面的冒号分隔的域都将被忽略. password(口令)被认为是用系统的 crypt() 函数加密的.和 Postgres 一起安装的 工具程序 pg_passwd 可以用于管理 这些口令文件.

带和不带口令的行可以在从属口令文件里面混合使用.不带口令的行 表明使用由CREATE USERALTER USER 管理的,存放在pg_shadow里的主口令. 带口令的行将导致此行的口令的应用.一条口令记录为“+”时 也表示使用 pg_shadow 的口令.

当使用crypt方法时不能使用可选口令.该文件还是 会象平常一样计算,但是口令域会被忽略并且使用pg_shadow 口令.

请注意象这样的可选口令意味着你不能再用 ALTER USER 命令来修改用户的口令.这条命令仍然有用,但是你用这条命令修改 的口令不是系统最后要用的那个.

4.2.2. Kerberos 认证

Kerberos 是一种适用于在公共网络上进行分布计算的工业标准的安全 认证系统. 对 Kerberos 系统的叙述远远的超出了本文档的范围; 概括说来它是相当复杂(同样也相当强大)的系统. Kerberos FAQMIT 雅典娜计划 是个开始探索 的好地方.现存在好几种Kerberos发布的源代码.

要使用 Kerberos,对它的支持必须在制作的时候打开. Kerberos 4和5都被支持,(分别是./configure --with-krb4./configure --with-krb5).

Postgres 应该象普通 Kerberos 服务那样运行. 服务主的名称通常是postgres,除非在制作 过程中修改过. 确认你的服务器的密钥文件( keytab)是可以被 Postgres 服务器帐户读取(最好就是只读的)(参阅 Section 3.1).密钥文件( keytab)的位置是 用运行时配置参数 krb_server_keyfile 声明的. (又见 Section 3.4.) 缺省时在 Kerberos 4 里是 /etc/srvtab, Kerberos 5里是 FILE:/usr/local/pgsql/etc/krb5.keytab (或者任何在制作的时候声明为 sysconfdir 的目录.)

要生成密钥文件(keytab),可以用下面例子(对版本5)

kadmin% ank -randkey postgres/server.my.domain.org
kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org
阅读 Kerberos 的文档获取详细信息.

Kerberos 5 挂钩中对用户和服务的名称做了下面假设:

参数例子
user[email protected]
useraoki/[email protected]
hostpostgres_dbms/[email protected]

如果你在你的 Apache web 服务器上使用了 mod_auth_krb 和 mod_perl, 你可以用一个 mod_perl 脚本进行 AuthType KerberosV5SaveCredentials. 这样就有了一个通过 web 的安全数据库访问,不需要额外的口令.

4.2.3. 基于 Ident 的认证

“Identification Protocol(标识协议)”在 RFC 1413 里面描述.实际上每个类Unix的操作系统 都带着一个缺省时侦听113端口的身份服务器. 身份服务器的基本功能是回答类似这样的问题: “是什么用户从你的端口X初始化出来 联接到我的端口Y上来了?”. 因为在建立起物理联接后,Postgres 既知道 X 也知道 Y,因此它可以询问 运行尝试联接的客户端的主机,并且理论上可以用这个方法判断 发起联接的操作系统用户.

这样做的缺点是它取决于客户端的完整性:如果客户端不可信 或者被攻击者攻破,而且它们可以在113端口上运行任何程序并且 返回他们选择的任何用户的话,就无法认证了. 因此这个认证方法只适用于封闭的网络,这样的网络里的每台客户机 都处于严密的控制下并且数据库和操作系统管理员可以比较方便地 联系上.下面是警告:

RFC 1413

身份标识协议并不适用于认证或者访问控制协议.

当使用以身份为基础的认证时,在判断了初始化联接的操作系统用户 的身份后,Postgres 判断他可以以 什么数据库用户的身份联接. 这个判断是由跟在pg_hba.conf 文件里的 ident 关键字后面的身份映射控制的. 最简单的身份映射是sameuser,表示任何 操作系统用户都可以以同名数据库用户进行联接(如果后者存在的 话).其他映射必须手工创建.

身份映射存放在数据目录的文件 pg_ident.conf 里. 每行的格式通常是:

map-name ident-username database-username
注释和空白和普通情况一样处理.map-name 是将用于 在pg_hba.conf里引用这个映射的任意名称. 另外两个域声明某个操作系统用户被允许以哪个数据库用户的身份 进行联接.同一个map-name 可以重复用于声明 更多的用户映射.对一个操作系统用户可以映射为多少个数据库用户没有 限制,反之亦然.

Example 4-2里是 一个可以和在Example 4-1 里面演示的pg_hba.conf文件 配合使用的 pg_ident.conf 文件. 在这个例子的设置里,任何 登录到 192.168 网络里的机器的用户,如果用户名不是 bryanh,ann,或 robert 就不能获准访问. Unix 用户robert只有在试图以 Postgres 用户 “bob”身份 联接时才允许访问,而不能是 “robert” 或其他什么身份. “ann” 将只允许以“她自己”的 身份联接.� 用户 bryanh 允许以他自己的 “bryanh” 身份 或者做为 “guest1” 进行联接.

Example 4-2. 一个 pg_ident.conf 文件例子

#MAP           IDENT-NAME   POSTGRESQL-NAME

omicron        bryanh       bryanh
omicron        ann          ann
# bob has username robert on these machines
omicron        robert       bob
# bryanh can also connect as guest1
omicron        bryanh       guest1