GSSAPI是一种在 RFC 2743 中定义的安全认证行业标准协议。 PostgreSQL支持GSSAPI用于认证、 通信加密,或两者兼而有之。 GSSAPI为支持它的系统提供自动认证(单点登录)。 认证本身是安全的。如果使用GSSAPI加密 或SSL加密,沿数据库连接发送的数据将被加密; 否则,将不会被加密。
当编译PostgreSQL时,GSSAPI 支持必须被启用,详见Chapter 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 服务器账号可读(并且最好只读、不可写)(另见 Section 18.1)。
keytab 文件用 Kerberos 软件生成;详见 Kerberos 文档。 下面展示了用 MIT 兼容的 Kerberos 5 实现的kadmin来做这个的示例:
kadmin%addprinc -randkey postgres/server.my.domain.orgkadmin%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,其匹配也同样不区分大小写。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。