GSSAPI 是一个行业标准协议,用于在 RFC 2743 中定义的安全身份验证。PostgreSQL 支持 GSSAPI 用于身份验证、通信加密或两者。GSSAPI 为支持它的系统提供自动身份验证(单点登录)。身份验证本身是安全的。如果使用 GSSAPI 加密或SSL加密,则沿数据库连接发送的数据将被加密;否则,将不会被加密。
构建 PostgreSQL 时必须启用 GSSAPI 支持;有关详细信息,请参阅 第 17 章。
当 GSSAPI 使用 Kerberos 时,它使用格式为
的标准服务主体(身份验证标识)名称。特定安装使用的主体名称不会以任何方式编码在 PostgreSQL 服务器中;而是它在服务器读取以确定其身份的 keytab 文件中指定。如果 keytab 文件中列出了多个主体,服务器将接受其中任何一个。服务器的 realm 名称是服务器可以访问的 Kerberos 配置文件(s)中指定的首选 realm。servicename
/hostname
@realm
连接时,客户端必须知道它要连接到的服务器的主体名称。主体的 servicename
部分通常是 postgres
,但可以通过 libpq 的 krbsrvname 连接参数选择另一个值。 hostname
部分是 libpq 被告知连接到的完全限定主机名。realm 名称是客户端可以访问的 Kerberos 配置文件(s)中指定的首选 realm。
客户端还将有它自己的身份的主体名称(并且它必须具有该主体的有效票证)。要使用 GSSAPI 进行身份验证,客户端主体必须与 PostgreSQL 数据库用户名关联。 pg_ident.conf
配置文件可用于将主体映射到用户名;例如,pgusername@realm
可以映射到 pgusername
。或者,您可以使用完整的 username@realm
主体作为 PostgreSQL 中的角色名称,而无需任何映射。
PostgreSQL 还支持通过仅从主体中剥离 realm 来将客户端主体映射到用户名。此方法出于向后兼容性目的得到支持,强烈建议不要使用,因为它无法区分具有相同用户名但来自不同 realm 的不同用户。要启用此功能,请将 include_realm
设置为 0。对于简单的单 realm 安装,这样做并结合设置 krb_realm
参数(它检查主体的 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,则从经过身份验证的用户主体中剥离 realm 名称,然后将其传递给用户名映射(第 20.2 节)。不建议这样做,并且主要用于向后兼容性,因为在多 realm 环境中这样做是不安全的,除非也使用 krb_realm
。建议将 include_realm
设置为默认值(1),并在 pg_ident.conf
中提供显式映射,以将主体名称转换为 PostgreSQL 用户名。
map
允许从客户端主体映射到数据库用户名。有关详细信息,请参阅 第 20.2 节。对于 GSSAPI/Kerberos 主体,例如 [email protected]
(或不太常见的 username/[email protected]
),用于映射的用户名是 [email protected]
(或分别为 username/[email protected]
),除非 include_realm
已设置为 0,在这种情况下,username
(或 username/hostbased
)是在映射时作为系统用户名看到的。
krb_realm
设置 realm 以与用户主体名称进行匹配。如果设置了此参数,则只接受该 realm 的用户。如果没有设置,则任何 realm 的用户都可以连接,但会受到执行的用户名映射的影响。
除了这些设置(对于不同的 pg_hba.conf
条目可能不同)之外,还有一个服务器范围的 krb_caseins_users 配置参数。如果将其设置为 true,则客户端主体将不区分大小写地与用户映射条目匹配。如果设置了 krb_realm
,则也会不区分大小写地匹配。
如果您在文档中发现任何不正确的地方,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。