21.6. GSSAPI 认证

GSSAPI是用于RFC 2743中定义的安全认证的一个工业标准协议。 PostgreSQL支持GSSAPI用于认证,通讯加密或两者都做。 GSSAPI为支持它的系统提供自动认证(单点登录)。 认证本身是安全的。 如果使用了GSSAPI 加密或SSL加密,数据库连接发送的数据将被加密,否则将不加密。

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

GSSAPI 使用Kerberos的时候, 它使用一个标准服务主体(身份验证)名称,以servicename/hostname@realm的格式。 特定安装使用的主体名称(principal name)没有被以任何方式编码在PostgreSQL服务器中;而是被指定在keytab文件中,服务器读取该文件以决定它的身份。 如果在keytab文件中罗列着多个主体,服务器将接受其中任何一个。 服务器的领域名称(realm name)是在服务器可访问的Kerberos配置文件中指定的优先领域。

当连接时,客户端必须知道它打算连接的服务器的主体名称。 主体名称的servicename部分通常是postgres,但是其他值可以通过libpqkrbsrvname连接参数来选择。 hostname部分是libpq告知要连接的全限制的主机名称。 领域名称是在客户端可访问的Kerberos配置文件中指定的优先领域。

客户端也可以有主体名称作为它自己的身份(并且它必须拥有针对这个主体的有效的标签[ticket])。 要使用GSSAPI做身份验证,客户端的主体必须与PostgreSQL数据库用户名关联。 pg_ident.conf配置文件可以用于映射主体到用户名;例如,pgusername@realm可能会被映射到pgusername。 或者,你可以使用完整的username@realm当事人作为PostgreSQL中的角色而无需任何映射。

PostgreSQL也支持映射客户端主体到用户名,通过从主体中剥离领域(realm)的方式。 这种方法是为了向后兼容性,并且我们强烈反对使用它,因为这样就无法区分具有相同用户名却来自不同 realm 的不同用户了。 要启用这种方法,可将include_realm设置为 0。 对于简单的单 realm 安装,这样做并且设置krb_realm参数(这会检查 principal 的 realm 是否正好匹配krb_realm中的参数)仍然是安全的。 但比起在pg_ident.conf中指定一个显式映射来说,这种方法的能力较低。

服务器的keytab文件的位置是由krb_server_keyfile配置参数指定的。 出于安全原因,它建议针对PostgreSQL使用独立的keytab而不是允许服务器读取系统的keytab文件。 确保你的服务器的keytab文件是对PostgreSQL服务器账号可读的(并且最好是只读的,不可写) (参见第 19.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,在通过用户名映射之前(第 21.2 节),来自已认证用户 principal 的 realm 名称会被剥离掉。 我们不鼓励这样做,这种方法主要是为了向后兼容性而存在的,因为它在多 realm 环境中是不安全的(除非也使用 krb_realm)。 推荐用户让include_realm设置为默认值(1)并且在pg_ident.conf中提供一条显式的映射来把 principal 名称转换成PostgreSQL用户名。

map

允许从客户端主体到数据库用户名之间的映射。 详见第 21.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

Sets the realm to match user principal names against. If this parameter is set, only users of that realm will be accepted. If it is not set, users of any realm can connect, subject to whatever user name mapping is done.

在这些设置之外,对于不同的pg_hba.conf项可能有所不同,还有服务器范围的krb_caseins_users 配置参数。 如果设置为真,客户端主体匹配用户映射条目是大小写不敏感的。 如果设置了krb_realm,也不区分大小写。