pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
下面详细描述这些认证方法。
Postgres 数据库密码与任何操作系统用户密码都是分开的。通常,每个数据库用户的密码存储在 pg_shadow 系统目录表中。密码可以用查询语言命令 CREATE USER 和 ALTER USER 管理,例如 CREATE USER foo WITH PASSWORD 'secret';。默认情况下,即如果没有设置密码,存储的密码为 NULL,该用户的密码认证将总是失败。
要限制允许连接到某些数据库的用户集合,可把用户集合放进一个单独的文件(每行一个用户名),该文件与 pg_hba.conf 位于同一目录中,并在 pg_hba.conf 中 password 或 crypt 关键字之后分别提及该文件的(基)名。如果不使用此特性,那么数据库系统已知的任何用户都可以连接到任何数据库(当然,只要他通过密码认证)。
这些文件还可用于对某个特定数据库或一组数据库应用一组不同的密码。这种情况下,文件的格式类似于标准的 Unix 口令文件 /etc/passwd,即
username:password
密码后面任何额外的冒号分隔字段都被忽略。密码应使用系统的 crypt() 函数加密。随 Postgres 一起安装的工具程序 pg_passwd 可用来管理这些密码文件。
次要密码文件中可以混合带密码和不带密码的行。不带密码的行表示使用 pg_shadow 中由 CREATE USER 和 ALTER USER 管理的主密码。带密码的行将导致使用该密码。密码条目为 “+” 也表示使用 pg_shadow 密码。
使用 crypt 方法时不能使用备用密码。文件仍会被照常评估,但密码字段将被简单地忽略,并使用 pg_shadow 密码。
注意,像这样使用备用密码意味着不能再使用 ALTER USER 来更改自己的密码。它看起来仍然会成功,但你实际更改的密码并不是系统最终使用的密码。
Kerberos 是一种行业标准的、适合在公共网络上进行分布式计算的安全认证系统。对 Kerberos 系统的描述远超出本文档的范围;就一般性而言,它可能相当复杂(然而强大)。Kerberos FAQ 或 MIT Project Athena 可以作为入门的起点。存在若干 Kerberos 发行版来源。
要使用 Kerberos,必须在构建时启用对它的支持。Kerberos 4 和 5 都受支持(分别为 ./configure --with-krb4 或 ./configure --with-krb5)。
Postgres 应当像一个正常的 Kerberos 服务那样运作。服务主体的名称通常是 postgres,除非在构建期间更改了它。确保你的服务器密钥文件可被 Postgres 服务器账号读取(而且最好只被它读取)(见 第 3.1 节)。密钥文件的位置由 krb_server_keyfile run time 配置参数指定。(另见 第 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.orgkadmin%ktadd -k krb5.keytab postgres/server.my.domain.org
细节请阅读 Kerberos 文档。
在 Kerberos 5 挂钩中,对用户和服务命名做了如下假定:
假定用户主体名(aname)的第一个组件包含实际的 Unix/Postgres 用户名。
假定 Postgres 服务有两个组成部分,即服务名和一个主机名,并像版本 4 中那样规范化(即去掉所有域后缀)。
| 参数 | 例子 |
|---|---|
| user | frew@S2K.ORG |
| user | aoki/HOST=miyu.S2K.Berkeley.EDU@S2K.ORG |
| host | postgres_dbms/ucbvax@S2K.ORG |
如果你在 Apache Web 服务器上使用 mod_auth_krb 和 mod_perl,你可以在 mod_perl 脚本中使用 AuthType KerberosV5SaveCredentials。这能通过 Web 安全地访问数据库,无需额外的密码。
“Identification Protocol”(识别协议)在 RFC 1413 中描述。几乎每个类 Unix 操作系统都附带一个 ident 服务器,默认监听 TCP 端口 113。ident 服务器的基本功能是回答诸如“哪个用户发起了从你的端口 X 出来并连接到我的端口 Y 的连接?”这样的问题。由于在建立物理连接时 Postgres 同时知道 X 和 Y,它可以查询连接客户端主机上的 ident 服务器,并由此在理论上确定任何给定连接的操作系统用户。
这一过程的缺点是它依赖于客户端的完整性:如果客户端机器不可信或已被攻破,攻击者可以在端口 113 上运行几乎任何程序并返回他选择的任何用户名。因此这种认证方法只适用于每台客户端机器都处于严格控制之下、且数据库与系统管理员保持密切联系的封闭网络。请留意这个警告:
|
标识协议(Identification Protocol)并不打算用作授权或访问控制协议。 |
||
| --RFC 1413 | ||
使用基于 ident 的认证时,在确定了发起连接的操作系统用户之后,Postgres决定该用户可以作为哪个数据库系统用户连接。这由 pg_hba.conf 文件中跟在 ident 关键字之后的 ident 映射参数控制。最简单的 ident 映射是 sameuser,它允许任何操作系统用户以同名的数据库用户身份连接(如果后者存在)。其他映射必须手工创建。
Ident 映射保存在数据目录的文件 pg_ident.conf 中,该文件包含如下一般形式的行:
map-nameident-usernamedatabase-username
注释和空白的处理与通常一样。map-name 是一个任意名称,将用于在 pg_hba.conf 中引用这个映射。另外两个字段指定哪个操作系统用户被允许以哪个数据库用户身份连接。同一个 map-name 可以重复使用,以指定更多的用户映射。一个给定的操作系统可以对应多少个数据库用户、反之一个数据库用户可以对应多少个操作系统用户,也都没有限制。
一个可与 例 4.1 中的 pg_hba.conf 文件配合使用的 pg_ident.conf 文件见 例 4.2。在这个示例设置中,任何登录到 192.168 网络某台机器上、但 Unix 用户名不是 bryanh、ann 或 robert 的人都不会被授予访问权限。Unix 用户 robert 只有在他尝试以 Postgres 用户 “bob” 而不是 “robert” 或任何其他人身份连接时才被允许访问。“ann” 只被允许以 “ann” 身份连接。用户 bryanh 被允许以 “bryanh” 本人或 “guest1” 身份连接。
例 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
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。