20.6. GSSAPI 认证 #
GSSAPI 是一种在 RFC 2743 中定义的安全认证行业标准协议。PostgreSQL 支持 GSSAPI 用于认证、通信加密,或两者兼而有之。GSSAPI 为支持它的系统提供自动认证(单点登录)。认证本身是安全的。如果使用 GSSAPI 加密或 SSL 加密,沿数据库连接发送的数据将被加密;否则,将不会被加密。
当编译 PostgreSQL 时,GSSAPI 支持必须被启用,详见第 17 章。
当 GSSAPI 使用 Kerberos 时,它会使用一个标准的服务主体(认证身份)名称,其格式为 。某个安装实际使用的主体名(principal name)不会以任何方式硬编码在 PostgreSQL 服务器中;相反,它是在服务器读取的 keytab 文件中指定的,服务器据此确定自己的身份。如果 keytab 文件中列出了多个主体,服务器会接受其中任意一个。服务器的 realm 名称是服务器可访问的 Kerberos 配置文件中指定的首选 realm。
servicename/hostname@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 服务器账号可读(并且最好只读、不可写)(另见第 18.1 节)。
keytab 文件用 Kerberos 软件生成;详见 Kerberos 文档。下面的示例展示了如何使用 MIT Kerberos 的 kadmin 工具生成该文件:
kadmin%addprinc -randkey postgres/server.my.domain.orgkadmin%ktadd -k krb5.keytab postgres/server.my.domain.org
GSSAPI 认证方法支持下列认证选项:
include_realm#如果设为 0,则在通过用户名映射(第 20.2 节)之前,会先从已认证用户的主体名中去掉 realm 名称。不建议这样做;它主要是为了向后兼容而保留的,因为在多 realm 环境中这并不安全,除非同时使用了
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#设置用于匹配用户主体名的 realm。如果设置了该参数,则只接受来自该 realm 的用户;如果未设置,则允许来自任意 realm 的用户连接,但仍受已执行的用户名映射约束。
除了这些可针对不同 pg_hba.conf 项分别设置的选项之外,还有一个服务器范围的配置参数 krb_caseins_users。如果它被设为真,客户端主体与用户映射条目的匹配将不区分大小写。如果设置了 krb_realm,其匹配也同样不区分大小写。