下面详细描述认证方法.
Postgres 数据库口令与任何操作系统用户口令无关. 通常,各个数据库用户的口令是存储在pg_shadown系统表里面的. 口令可以用查询语言命令CREATE USER 和ALTER USER管理,也就是说, CREATE USER foo WITH PASSWORD 'secret';.缺省时,如果没有显式地设置口令,存储的口令是 “NULL” 并且该用户的口令认证总会失败.
要限制允许访问某数据库的用户集,在与pg_hba.conf同一目录的 一个独立的文件里列出用户(每用户 一行),然后在 pg_hba.conf的 password或crypt关键字后面 写下此文件的文件名(不用路径). 如果你不用这个特性,那么数据库系统识别的任何用户都可以与任意数据库 联接(当然,他得通过口令认证).
这些文件还可以用于对特定数据库或数据库集应用不同的口令集. 这时候,这个文件具有类似 Unix 口令文件 /etc/passwd 那样的格式,也就是下面这样,
username:password任何跟在 password(口令)后面的冒号分隔的域都将被忽略. password(口令)被认为是用系统的 crypt() 函数加密的.和 Postgres 一起安装的 工具程序 pg_passwd 可以用于管理 这些口令文件.
带和不带口令的行可以在从属口令文件里面混合使用.不带口令的行 表明使用由CREATE USER和ALTER USER 管理的,存放在pg_shadow里的主口令. 带口令的行将导致此行的口令的应用.一条口令记录为“+”时 也表示使用 pg_shadow 的口令.
当使用crypt方法时不能使用可选口令.该文件还是 会象平常一样计算,但是口令域会被忽略并且使用pg_shadow 口令.
请注意象这样的可选口令意味着你不能再用 ALTER USER 命令来修改用户的口令.这条命令仍然有用,但是你用这条命令修改 的口令不是系统最后要用的那个.
Kerberos 是一种适用于在公共网络上进行分布计算的工业标准的安全 认证系统. 对 Kerberos 系统的叙述远远的超出了本文档的范围; 概括说来它是相当复杂(同样也相当强大)的系统. Kerberos FAQ 或 MIT 雅典娜计划 是个开始探索 的好地方.现存在好几种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 挂钩中对用户和服务的名称做了下面假设:
假定用户的主名称 (anames)在第一部分里包含实际的 Unix/ Unix/Postgres 用户名.
Postgres 服务假定为含有两个组成部分,服务名和主机名, 就象在版本 4 里那样被规范化了.(也就是说,删 去了所有域后缀).
参数 | 例子 |
---|---|
user | [email protected] |
user | aoki/[email protected] |
host | postgres_dbms/[email protected] |
如果你在你的 Apache web 服务器上使用了 mod_auth_krb 和 mod_perl, 你可以用一个 mod_perl 脚本进行 AuthType KerberosV5SaveCredentials. 这样就有了一个通过 web 的安全数据库访问,不需要额外的口令.
“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