21.6. GSSAPI 身份验证#
GSSAPI是RFC 2743中定义的安全身份验证行业标准协议。PostgreSQL支持GSSAPI进行身份验证、通信加密或两者兼而有之。GSSAPI为支持它的系统提供自动身份验证(单点登录)。身份验证本身是安全的。如果使用GSSAPI加密或SSL加密,则通过数据库连接发送的数据将被加密;否则,将不会加密。
在构建PostgreSQL时必须启用 GSSAPI 支持;有关详细信息,请参见第 17 章。
当GSSAPI使用Kerberos时,它使用格式为*
servicename*/*
hostname*@*
realm*
的标准服务主体(身份验证标识)名称。特定安装使用的主体名称不会以任何方式在PostgreSQL服务器中编码;而是指定在服务器读取以确定其标识的密钥表文件中。如果密钥表文件中列出了多个主体,则服务器将接受其中任何一个。服务器的领域名称是服务器可访问的 Kerberos 配置文件中指定的首选领域。
在连接时,客户端必须知道其打算连接到的服务器的主体名称。主体中的*servicename
部分通常为postgres
,但可以通过libpq的krbsrvname连接参数选择其他值。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
中指定显式映射相比,这种方法的功能较弱。
服务器密钥表文件的位置由krb_server_keyfile配置参数指定。出于安全原因,建议仅为PostgreSQL服务器使用单独的密钥表,而不是允许服务器读取系统密钥表文件。确保PostgreSQL服务器帐户可读(最好仅可读,不可写)您的服务器密钥表文件。(另请参见第 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
如果设置为 0,则在通过用户名映射传递之前 (第 21.2 节),将从经过身份验证的用户主体中剥离领域名称。不建议这样做,并且主要用于向后兼容,因为它在多领域环境中不安全,除非同时使用了
krb_realm
。建议将include_realm
保留为默认值 (1),并在pg_ident.conf
中提供显式映射,以将主体名称转换为 PostgreSQL 用户名。映射
允许从客户端主体映射到数据库用户名。有关详细信息,请参见 第 21.2 节。对于 GSSAPI/Kerberos 主体,例如
[email protected]
(或不太常见的username/[email protected]
),用于映射的用户名为[email protected]
(或username/[email protected]
),除非include_realm
已设置为 0,在这种情况下,username
(或username/hostbased
)在映射时被视为系统用户名。krb_realm
设置领域以匹配用户主体名称。如果设置此参数,则只接受该领域的用户名。如果未设置,则任何领域的用户名都可以连接,但需遵守所执行的任何用户名映射。
除了这些设置(对于不同的pg_hba.conf
条目可以不同)之外,还有服务器范围的krb_caseins_users配置参数。如果将其设置为 true,则客户端主体将与用户映射条目进行不区分大小写的匹配。如果设置了krb_realm
,则也会进行不区分大小写的匹配。