2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11

20.6. GSSAPI 身份验证 #

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

GSSAPI 支持必须在构建 PostgreSQL 时启用;有关更多信息,请参见 第 17 章

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

连接时,客户端必须知道它打算连接的服务器的主体名称。主体名称的 *servicename* 部分通常是 postgres,但可以通过 libpqkrbsrvname 连接参数选择其他值。*hostname* 部分是 libpq 被告知连接的完全限定主机名。领域名称是在客户端可访问的 Kerberos 配置文件中指定的首选领域。

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

PostgreSQL 还支持通过简单地剥离主体名称中的领域来将客户端主体映射到用户名。此方法支持是为了向后兼容,并且强烈不建议使用,因为它在这种情况下无法区分来自不同领域但具有相同用户名的不同用户。要启用此功能,请将 include_realm 设置为 0。对于简单的单领域安装,这样做并结合设置 krb_realm 参数(该参数会检查主体的领域是否与 krb_realm 参数中的内容完全匹配)仍然是安全的;但与在 pg_ident.conf 中指定显式映射相比,这是一种功能较弱的方法。

服务器 keytab 文件的位置由 krb_server_keyfile 配置参数指定。出于安全原因,建议为 PostgreSQL 服务器使用单独的 keytab,而不是允许服务器读取系统 keytab 文件。请确保您的服务器 keytab 文件可被 PostgreSQL 服务器账户读取(最好是仅可读,不可写)。(另请参见 第 18.1 节。)

keytab 文件是使用 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

如果设置为 0,则在通过用户名映射(第 20.2 节)传递之前,会剥离经过身份验证的用户主体名称中的领域名称。不建议这样做,主要用于向后兼容,在多领域环境中不安全,除非同时使用了 krb_realm。建议将 include_realm 设置为默认值(1),并在 pg_ident.conf 中提供显式映射,将主体名称转换为 PostgreSQL 用户名。

map

允许从客户端主体映射到数据库用户名。有关详细信息,请参见 第 20.2 节。对于 GSSAPI/Kerberos 主体,例如 username@EXAMPLE.COM(或不常见的情况,username/hostbased@EXAMPLE.COM),用于映射的用户名是 username@EXAMPLE.COM(或 username/hostbased@EXAMPLE.COM),除非 include_realm 已设置为 0,在这种情况下,username(或 username/hostbased)是映射时看到的系统用户名。

krb_realm

设置用于匹配用户主体名称的领域。如果设置了此参数,则只接受来自该领域的用户。如果未设置,则任何领域的用户都可以连接,具体取决于所进行的任何用户名映射。

除了这些针对不同 pg_hba.conf 条目可能不同的设置外,还有一个服务器范围的 krb_caseins_users 配置参数。如果将其设置为 true,则客户端主体将不区分大小写地匹配到用户映射条目。krb_realm(如果已设置)也将不区分大小写地匹配。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。