20.6. GSSAPI 身份验证

GSSAPI 是 RFC 2743 中定义的用于安全身份验证的行业标准协议。PostgreSQL 根据 RFC 1964 支持带有 Kerberos 身份验证的 GSSAPI。GSSAPI 为支持它的系统提供自动身份验证(单点登录)。身份验证本身是安全的,但是除非使用 SSL,否则通过数据库连接发送的数据将以未加密的方式发送。

构建 PostgreSQL 时必须启用 GSSAPI 支持。有关更多信息,请参见Chapter 16

当 GSSAPI 使用 Kerberos 时,它使用格式servicename/hostname@realm的标准主体。 PostgreSQL 服务器将接受服务器使用的密钥表中包含的任何主体,但是在使用krbsrvname连接参数从 Client 端进行连接时,需要注意指定正确的主体详细信息。 (另请参见Section 34.1.2。)可以在构建时使用./configure --with-krb-srvnam= * whatever *从默认的postgres更改安装默认值。在大多数环境中,无需更改此参数。某些 Kerberos 实现可能需要不同的服务名称,例如 Microsoft Active Directory,它要求服务名称为大写(POSTGRES)。

  • hostname *是服务器计算机的标准主机名。服务主体的领域是服务器计算机的首选领域。

Client 端主体可以使用pg_ident.confMap 到不同的 PostgreSQL 数据库用户名。例如,pgusername@realm可以仅 Map 到pgusername。另外,您可以使用完整的username@realm主体作为 PostgreSQL 中的角色名称,而无需任何 Map。

PostgreSQL 还支持从主体剥离领域的参数。支持此方法以实现向后兼容,因此强烈建议不要使用此方法,因为这样就不可能区分具有相同用户名但来自不同领域的不同用户。要启用此功能,请将include_realm设置为 0.对于简单的单领域安装,将其与设置krb_realm参数(检查主体的领域是否与krb_realm参数中的内容完全匹配)结合起来仍然是安全的。但与在pg_ident.conf中指定显式 Map 相比,这是一种功能较弱的方法。

确保 PostgreSQL 服务器帐户可读取您的服务器密钥表文件(最好仅可读取,不可写入)。 (另请参见Section 18.1。)密钥文件的位置由krb_server_keyfile配置参数指定。默认值为/usr/local/pgsql/etc/krb5.keytab(或在构建时指定为sysconfdir的任何目录)。出于安全原因,建议仅对 PostgreSQL 服务器使用单独的密钥表,而不要对系统密钥表文件开放权限。

keytab 文件是由 Kerberos 软件生成的;有关详细信息,请参见 Kerberos 文档。以下示例适用于 MIT 兼容的 Kerberos 5 实现:

kadmin% ank -randkey postgres/server.my.domain.org
kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org

连接到数据库时,请确保您具有与请求的数据库用户名匹配的主体票证。例如,对于数据库用户名fred,主体[email protected]将能够连接。要也允许主体fred/[email protected],请使用用户名 Map,如Section 20.2中所述。

GSSAPI 支持以下配置选项:

  • include_realm

    • 如果设置为 0,则在通过用户名 Map(Section 20.2)之前,将剥离已认证用户主体的领域名称。不建议这样做,并且主要用于向后兼容,因为除非在多领域环境中使用krb_realm,否则它也不安全。建议将include_realm设置为默认值(1),并在pg_ident.conf中提供显式 Map,以将主体名称转换为 PostgreSQL 用户名。
  • map

    • 允许在系统用户名和数据库用户名之间进行 Map。有关详情,请参见Section 20.2。对于 GSSAPI/Kerberos 主体,例如[email protected](或更不常见的是username/[email protected]),用于 Map 的用户名是[email protected](或分别为username/[email protected]),除非include_realm已设置为 0,在这种情况下为username(或username/hostbased)。Map 时被视为系统用户名。
  • krb_realm

    • 设置领域以匹配用户主体名称。如果设置了此参数,则仅接受该领域的用户。如果未设置,则无论完成任何用户名 Map,任何领域的用户都可以连接。