GSSAPI 是 RFC 2743 定义的安全认证行业标准协议。PostgreSQL 按照 RFC 1964 支持使用 Kerberos 认证的 GSSAPI。GSSAPI 为支持它的系统提供自动认证(单点登录)。认证过程本身是安全的,但除非使用 SSL,否则数据库连接上传输的数据不会加密。
当编译PostgreSQL时,GSSAPI 支持必须被启用,详见Chapter 16。
GSSAPI 使用 Kerberos 时,采用格式为 的标准主体。PostgreSQL 服务器会接受其所用 keytab 中包含的任何主体,但客户端建立连接时,必须注意通过 servicename/hostname@realmkrbsrvname 连接参数指定正确的主体信息。(另见 Section 34.1.2。)构建时可以使用 ./configure --with-krb-srvnam=whatever,将安装默认值从 postgres 改为其他值。在大多数环境中,无需更改此参数。某些 Kerberos 实现可能要求不同的服务名,例如 Microsoft Active Directory 要求服务名使用大写(POSTGRES)。
hostname 是服务器机器的完全限定主机名。服务主体的域是服务器机器的首选域。
可以通过 pg_ident.conf 将客户端主体映射到不同的 PostgreSQL 数据库用户名。例如,可以将 pgusername@realm 映射为 pgusername。也可以不使用任何映射,直接将完整的 username@realm 主体用作 PostgreSQL 中的角色名。
PostgreSQL 还支持一个从主体中去掉域的参数。提供这种方法是为了向后兼容,强烈不建议使用,因为这样就无法区分来自不同域但用户名相同的用户。要启用此行为,将 include_realm 设为 0。对于简单的单域安装环境,如果同时设置 krb_realm 参数(它会检查主体的域是否与 krb_realm 参数值完全一致),这种做法仍是安全的;但与在 pg_ident.conf 中指定显式映射相比,它的能力较弱。
确保 PostgreSQL 服务器账户能够读取服务器的 keytab 文件(最好只能读取,不能写入)。(另见 Section 18.1。)密钥文件的位置由 krb_server_keyfile 配置参数指定。默认位置是 /usr/local/pgsql/etc/krb5.keytab(或者构建时用 sysconfdir 指定的目录)。出于安全考虑,建议为 PostgreSQL 服务器使用专用 keytab,而不是放宽系统 keytab 文件的权限。
keytab 文件由 Kerberos 软件生成;详情参见 Kerberos 文档。以下示例适用于兼容 MIT 的 Kerberos 5 实现:
kadmin%ank -randkey postgres/server.my.domain.orgkadmin%ktadd -k krb5.keytab postgres/server.my.domain.org
连接数据库时,请确保持有与请求的数据库用户名相匹配的主体票据。例如,数据库用户名为 fred 时,主体 fred@EXAMPLE.COM 可以连接。如果还要允许主体 fred/users.example.com@EXAMPLE.COM,请按 Section 20.2 所述使用用户名映射。
以下配置选项适用于 GSSAPI:
include_realm如果设为 0,则在通过用户名映射(Section 20.2)之前,会先从已认证用户的主体名中去掉 realm 名称。 不建议这样做;它主要是为了向后兼容而保留的,因为在多 realm 环境中这并不安全,除非同时使用了 krb_realm。 建议将 include_realm 保持为默认值(1),并在 pg_ident.conf 中提供显式映射,把主体名转换成 PostgreSQL 用户名。
map允许在系统用户名与数据库用户名之间建立映射。详见 Section 20.2。对于 username@EXAMPLE.COM(或较少见的 username/hostbased@EXAMPLE.COM)这样的 GSSAPI/Kerberos 主体,映射所用的用户名是 username@EXAMPLE.COM(或相应的 username/hostbased@EXAMPLE.COM),除非将 include_realm 设为 0,此时映射所见的系统用户名为 username(或 username/hostbased)。
krb_realm设置用于匹配用户主体名的 realm。如果设置了该参数,则只接受来自该 realm 的用户;如果未设置,则允许来自任意 realm 的用户连接,但仍受已执行的用户名映射约束。