GSSAPI 是一种行业标准协议,用于 RFC 2743 中定义的安全身份验证。PostgreSQL 支持 GSSAPI 进行身份验证、通信加密或两者兼备。GSSAPI 为支持它的系统提供自动身份验证(单点登录)。身份验证本身是安全的。如果 GSSAPI 加密或SSL加密使用,沿数据库连接发送的数据将被加密;否则,将不会加密。
在构建 PostgreSQL 时必须启用 GSSAPI 支持;请参阅 第 17 章 了解更多信息。
当 GSSAPI 使用 Kerberos 时,它会使用格式为
的标准服务主体(身份验证标识)名称。特定的安装所使用的主体名称不会以任何方式在 PostgreSQL 服务器中进行编码;相反,它是在服务器读取以确定其自身身份的主钥表文件中指定的。如果密钥表文件中列出了多个主体,服务器会接受其中任何一个。服务器的 realm 名称是服务器可访问的 Kerberos 配置文件中指定的首选 realm。servicename
/hostname
@realm
进行连接时,客户端必须知道它打算连接到的服务器的主体名称。主体名称中的 servicename
部分通常为 postgres
,但可以通过 libpq 的 krbsrvname 连接参数选择其他值。当 libpq 被告知连接到 hostname
部分时,则该部分是完全限定的主机名称。realm 名称是客户端可访问的 Kerberos 配置文件中指定的首选 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
文件中指定显式映射相比,这种方法功能较弱。
服务器密钥表文件的位置由 krb_server_keyfile 配置参数指定。出于安全原因,建议为 PostgreSQL 服务器使用独立的密钥表,而不是允许服务器读取系统密钥表文件。确保服务器密钥表文件可供 PostgreSQL 服务器帐户读取(最好只可读,不可写)。(另请参见第 18.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,则经过身份验证的用户主体的领域名称会在通过用户名映射 (第 20.2 节) 传递之前被删除。不建议使用该方法,并且主要支持向后兼容,因为在多域环境中不安全,除非还使用了 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
设置要与用户主体名称匹配的领域。如果设置此参数,则只接受该领域的用户的连接。如果未设置此参数,则任何领域的用户的连接都可被接受,具体取决于完成的用户名映射。
除了这些设置(它们对于不同的 pg_hba.conf
条目可能不同)之外,还有用于全服务器的 krb_caseins_users 配置参数。如果将该参数设置为 true,那么客户端主体将与用户映射条目进行不区分大小写的匹配。如果设置了 krb_realm
,则它也将进行不区分大小写的匹配。