Postgresql 中文操作指南

21.6. GSSAPI Authentication #

GSSAPI 是行业标准协议,用于在 RFC 2743中定义的安全身份验证。PostgreSQL 支持 GSSAPI 进行身份验证、通信加密或两者兼备。GSSAPI 为支持它的系统提供自动身份验证(单点登录)。身份验证本身是安全的。如果使用 GSSAPI 加密或 SSL 加密,则沿数据库连接发送的数据将被加密;否则,不会加密。

当构建 PostgreSQL 时,必须启用 GSSAPI 支持;有关详细信息,请参阅 Chapter 17

当 GSSAPI 使用 Kerberos 时,它使用 servicename/hostname@realm 格式的标准服务主体(认证身份)名。特定安装使用的主体名不会以任何方式在 PostgreSQL 服务器中编码;相反,它在服务器读取以确定其自身身份的 keytab 文件中指定。如果在密钥表文件中列出了多个主体,服务器将接受其中任何一个。服务器的领域名称是服务器可访问的 Kerberos 配置文件中指定的首选领域。

连接时,客户端必须知道要连接到的服务器的主体名称。主体名称的_servicename_部分通常为_postgres_,但可以通过 libpq 的 krbsrvname连接参数选择另一个值。_hostname_部分是 libpq 要求连接到的完全限定的主机名。区域名称是从客户端可访问的 Kerberos 配置文件中指定的首选区域。

客户端还将拥有一个自己的 ID 的主体名称(且它必须拥有此主体的有效票证)。若要将 GSSAPI 用于身份验证,此客户端主体必须与 PostgreSQL 数据库用户名相关联。pg_ident.conf 配置文件可用于将主体映射到用户名;例如,可以将 pgusername@realm 映射到 pgusername。或者,可以在 PostgreSQL 中将完整 username@realm 主体用作角色名称,而无需任何映射。

PostgreSQL 还支持通过仅从主体中删除领域来将客户端主体映射到用户名。此方法受支持,出于向后兼容性考虑,但强烈不建议使用,因为这样无法区分具有相同用户名但来自不同领域的不同的用户。若要启用此功能,请将 include_realm 设置为 0。对于简单的单一领域安装,这与设置 krb_realm 参数(该参数检查主体领域是否与 krb_realm 参数中的内容完全匹配)结合使用仍然是安全的;但这与在 pg_ident.conf 中指定明确映射相比,是一种功能较弱的方法。

服务器密钥表文件的位置由 krb_server_keyfile配置参数指定。出于安全原因,建议仅为 PostgreSQL 服务器使用单独的密钥表,而不是允许服务器读取系统密钥表文件。确保 PostgreSQL 服务器帐户可读(最好只能读,不能写)服务器密钥表文件。(另请参阅 Section 19.1)。

密钥表文件使用 Kerberos 软件生成;请参阅 Kerberos 文档以了解详细信息。以下示例演示如何使用 MIT Kerberos 的 kadmin 工具执行此操作:

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

GSSAPI 身份验证方法支持以下身份验证选项:

  • include_realm

    • 如果将 authenticated user principal 中的 realm 名称剥离,然后再通过用户名映射 ( Section 21.2) 传递该名称,则此名称将设置为 0。不建议这样做,并且主要用于向后兼容,因为它在多 realm 环境中不安全,除非也使用了 krb_realm。建议将 include_realm 留为默认设置 (1),并在 pg_ident.conf 中提供显式映射,以将 principal 名称转换为 PostgreSQL 用户名。

  • map

    • 允许从客户端主体映射到数据库用户名。有关详细信息,请参阅 Section 21.2。对于 GSSAPI/Kerberos 主体,例如_username@EXAMPLE.COM_(或不常见的是_username/hostbased@EXAMPLE.COM_),除非将_include_realm_设置为 0,否则用于映射的用户名为_username@EXAMPLE.COM_(或_username/hostbased@EXAMPLE.COM_),在这种情况下,username(或_username/hostbased_)是映射时视为系统用户名的名称。

  • krb_realm

    • 设置与用户主体名称匹配的域。如果设置此参数,则只接受该域的用户。如果没有设置此参数,则任何域的用户都可以连接,具体取决于所做的用户名映射。

除了这些设置外(对于不同的_pg_hba.conf_条目可能不同),还有服务器范围的 krb_caseins_users配置参数。如果将其设置为 true,则客户端主体与用户名映射条目将区分大小写匹配。如果设置了_krb_realm_,则也会区分大小写匹配。