受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

20.6. GSSAPI 认证 #

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

当编译PostgreSQL时,GSSAPI 支持必须被启用,详见Chapter 17

GSSAPI 使用 Kerberos 时,它会使用一个标准的服务主体(认证身份)名称,其格式为 servicename/hostname@realm。 某个安装实际使用的主体名(principal name)不会以任何方式硬编码在 PostgreSQL 服务器中;相反,它是在服务器读取的 keytab 文件中指定的,服务器据此确定自己的身份。 如果 keytab 文件中列出了多个主体,服务器会接受其中任意一个。 服务器的 realm 名称是服务器可访问的 Kerberos 配置文件中指定的首选 realm。

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

客户端也会有一个表示其自身身份的主体名(并且它必须持有该主体对应的有效票据)。 要使用 GSSAPI 进行认证,客户端主体必须与某个 PostgreSQL 数据库用户名关联。 可以使用 pg_ident.conf 配置文件将主体映射为用户名;例如,可以把 pgusername@realm 映射为简单的 pgusername。 另一种做法是不做任何映射,直接在 PostgreSQL 中把完整的 username@realm 主体名用作角色名。

PostgreSQL 还支持通过简单地从主体名中剥离 realm 来把客户端主体映射为用户名。 这种方式仅为向后兼容而提供,强烈不建议使用,因为这样就无法区分来自不同 realm 但用户名相同的不同用户。 要启用它,可将 include_realm 设为 0。 对于简单的单 realm 安装,如果再结合设置 krb_realm 参数(它会检查主体的 realm 是否与 krb_realm 中的值完全一致),这样做仍然是安全的;但与在 pg_ident.conf 中显式指定映射相比,这种方式的能力更弱。

服务器 keytab 文件的位置由配置参数 krb_server_keyfile 指定。 出于安全原因,建议为 PostgreSQL 服务器单独使用一个 keytab,而不要让服务器直接读取系统 keytab 文件。 请确保服务器 keytab 文件对 PostgreSQL 服务器账号可读(并且最好只读、不可写)(另见 Section 18.1)。

keytab 文件用 Kerberos 软件生成;详见 Kerberos 文档。 下面展示了用 MIT 兼容的 Kerberos 5 实现的kadmin来做这个的示例:

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

GSSAPI 认证方法支持下列认证选项:

include_realm

如果设为 0,则在通过用户名映射(Section 20.2)之前,会先从已认证用户的主体名中去掉 realm 名称。 不建议这样做;它主要是为了向后兼容而保留的,因为在多 realm 环境中这并不安全,除非同时使用了 krb_realm。 建议将 include_realm 保持为默认值(1),并在 pg_ident.conf 中提供显式映射,把主体名转换成 PostgreSQL 用户名。

map

允许把客户端主体映射为数据库用户名。详见 Section 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

设置用于匹配用户主体名的 realm。如果设置了该参数,则只接受来自该 realm 的用户;如果未设置,则允许来自任意 realm 的用户连接,但仍受已执行的用户名映射约束。

除了这些可针对不同 pg_hba.conf 项分别设置的选项之外,还有一个服务器范围的配置参数 krb_caseins_users。 如果它被设为真,客户端主体与用户映射条目的匹配将不区分大小写。 如果设置了 krb_realm,其匹配也同样不区分大小写。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。