HiveServer2 中的 LDAP Atn 提供程序对用户和组过滤器的支持

LDAP 的用户和组过滤器支持

从 Hive 1.3.0 开始,HIVE-7193在 HiveServer2 中添加了对

  • LDAP 组过滤器

  • LDAP 用户过滤器

  • 自定义 LDAP 查询支持。

筛选器大大增强了 LDAP 身份验证提供程序的功能。它们允许 Hive 限制允许连接到 HiveServer2 的用户组。

有关为 HiveServer2 配置身份验证的一般信息,请参见Authentication/Security Configuration。另请参见Hive 配置属性– HiveServer2,以了解下面讨论的各个配置参数。

Group Membership

这使 HiveServer2 可以为用户强制执行组成员身份。如果用户属于 Hive 配置文件中列出的一个或多个组,则身份验证请求将成功。如果用户不属于所列的至少一个组,则用户身份验证失败。

四个配置参数支持基于组成员身份的身份验证:

  • hive.server2.authentication.ldap.groupDNPattern

  • hive.server2.authentication.ldap.groupFilter

  • hive.server2.authentication.ldap.groupMembershipKey(通过HIVE-13295版本 2.1.0)``

  • hive.server2.authentication.ldap.groupClassKey(通过HIVE-13295版本 2.1.0)

hive.server2.authentication.ldap.groupDNPattern

此值表示目录中组的“ distinguishedName”(DN)模式。如果 LDAP 组实体位于同一位置,则此值可以是单个 DN,如果组分散在不同的树中,则该值可以是用冒号分隔的所有 DN 模式的列表。

每个 DN 模式中都可以包含一个“%s”,提供者可以使用该名称替换组名称(来自组过滤器)以进行组搜索查询。

示例 1(单个 DN):

<property>
  <name>
    hive.server2.authentication.ldap.groupDNPattern
  </name>
  <value>CN=%s,OU=Groups,DC=apache,DC=org</value>
</property>

这表明所有 LDAP 组条目都在目录根目录*“ OU = Groups,DC = apache,DC = org” *下。

LDAP 身份验证提供程序将 LDAP 查询中的%s 替换为组名以查找组条目。例如,如果要查询名为“ group1”的组,它将使用*“ CN = group1,OU = Groups,DC = apache,DC = org” *。

示例 2(两个 DN):

<property>
  <name>
    hive.server2.authentication.ldap.groupDNPattern
  </name>
  <value>
      CN=%s,OU=Groups,DC=apache,DC=org:uid=%s,CN=Users,DC=apache,DC=org
  </value>
</property>

上面的模式建议 LDAPAtnProvider LDAP 组实体可以存在于目录中的两个单独的树中,并且可以在其 DN 中具有不同的属性。 (请注意冒号分隔符.)

hive.server2.authentication.ldap.groupFilter

此值表示将由 LDAPAtnProvider 强制执行的组名过滤器。所有单独的组都用***分隔的列表表示。用户必须属于这些组中的一个或多个组,身份验证请求才能成功。

Example:

<property>
  <name>hive.server2.authentication.ldap.groupFilter</name>
  <value>group1,group2</value>
</property>

hive.server2.authentication.ldap.groupMembershipKey

此值表示 LDAP 中组条目上的 LDAP 属性,该属性指示其成员。 (从version 2.1.0开始。)

该属性可能有多个条目,每个成员都有一个。默认情况下,LDAP 身份验证提供程序假定“成员”来搜索用户。要更改此默认值,请为提供者设置属性的值/键,以准确搜索组成员。

hive.server2.authentication.ldap.groupClassKey

该值表示每个组在 LDAP 中实现的 LDAP objectClass。默认情况下,LDAP 身份验证提供程序在搜索组时使用“ groupOfNames”。 (从version 2.1.0开始。)

上面的属性有助于正确找到 LDAP 中的用户组关联。

示例 :如果 LDAP 组“ testGroup”具有以下属性,则 Hive 的 LDAP 身份验证提供程序将无法找到组成员。设置 2 个属性将对此有所帮助。

dn:uid=testGroup,ou=Groups,dc=domain,dc=com     objectClass: group     objectClass: top     memberUid: uid=testUser1,ou=Users,dc=domain,dc=com     memberUid: uid=testUser2,ou=Users,dc=domain,dc=com     cn: HiveUserGroup

<property>
  <name>hive.server2.authentication.ldap.groupMembershipKey</name>
  <value>memberUid</value>
</property>
<property>
  <name>hive.server2.authentication.ldap.groupClassKey</name>
  <value>group</value>
</property>

用户搜索列表

这使 HiveServer2 可以限制对指定用户列表的访问。如果通过身份验证的用户不属于此用户列表,则访问将被拒绝。

有两个配置参数支持此功能:

  • hive.server2.authentication.ldap.userDNPattern

  • hive.server2.authentication.ldap.userFilter

hive.server2.authentication.ldap.userDNPattern

此值表示目录中用户的“ distinguishedName”(DN)模式。如果 LDAP 用户实体位于单个根目录中,则此值可以是单个 DN;如果用户分散在目录中的不同树/林中,则该值可以是用冒号分隔的所有 DN 模式的列表。 。

每个 DN 模式中都可以包含一个“%s”,提供者将使用用户名(来自用户过滤器)来替换该用户搜索查询。

示例 1(单个 DN):

<property>
  <name>
    hive.server2.authentication.ldap.userDNPattern
  </name>
  <value>
    CN=%s,CN=Users,DC=apache,DC=org
  </value>
</property>

在上面的示例中,所有用户都位于单个根*“ * * CN = Users,DC = apache,DC = org * *” 下。为了搜索用户“ foo”,LDAPAtnProvider 尝试查找具有 DN 的用户,例如“ * * CN = foo,CN = Users,DC = apache,DC = org * *” *。

示例 2(两个 DN):

<property>
  <name>
    hive.server2.authentication.ldap.userDNPattern
  </name>
  <value>
      CN=%s,OU=Users,DC=apache,DC=org:uid=%s,CN=UnixUsers,DC=apache,DC=org
  </value>
</property>

上面的模式建议 LDAPAtnProvider LDAP 用户实体可以存在于目录中的两个单独的树中,并且可以在其 DN 中具有不同的属性。 (请注意冒号分隔符.)

hive.server2.authentication.ldap.userFilter

这是用逗号分隔的用户名列表,用于授予访问权限。如果正在通过身份验证的用户是此列表的一部分,则 Atn 提供程序将授予访问权限,否则将拒绝访问。

Example:

<property>
  <name>
    hive.server2.authentication.ldap.userFilter
  </name>
  <value>
    hive-admin,hive,hivetest,hive-user
  </value>
</property>

自定义查询字符串

有几种 LDAP 实现可用于商业用途,每种实现中都没有标准的属性集。如果以上任何一个过滤器由于某些不可预见的原因都不符合要求,则 HiveServer2 可以使用用户指定的 LDAP 查询字符串对 LDAP 服务器执行。预期此配置的查询将返回代表各个用户的一组 DN(请参阅以下有关组的支持)。然后,返回的结果将用于将 GRANT/DENY 决策裁定为认证用户。为了支持此配置,引入了新的配置属性。

hive.server2.authentication.ldap.customLDAPQuery

Example:

<property>
  <name>hive.server2.authentication.ldap.customLDAPQuery</name>
  <value><![CDATA[(&(objectClass=person)(|(memberOf=CN=Domain Admins,CN=Users,DC=apache,DC=org)(memberOf=CN=Administrators,CN=Builtin,DC=apache,DC=org)))]]>
  </value>
</property>

上面的查询返回作为组之一(域 Management 员或 Management 员)成员的所有用户。这提供了更多的灵 Active,使 Hive 用户可以为实现 LDAP 定制 LDAP 配置。

自定义 LDAP 查询中对组的支持

Version information

从 Hive 2.1.1 开始可用(请参阅HIVE-14513)。

能够编写返回用户的查询并不总是那么简单。例如,要允许对“来自 group1 和 group2 的所有用户”进行身份验证,LDAP 查询必须返回 group1 和 group2 的所有成员的并集。

一种常见配置是组包含用户列表:

"dn: uid=group1,ou=Groups,dc=example,dc=com",    "distinguishedName: uid=group1,ou=Groups,dc=example,dc=com",    "objectClass: top",    "objectClass: groupOfNames",    "objectClass: ExtensibleObject",    "cn: group1",    "ou: Groups",    "sn: group1",    "member: uid=user1,ou=People,dc=example,dc=com",

The query

(&(objectClass=groupOfNames)(|(cn=group1)(cn=group2)))

将返回条目

uid=group1,ou=Groups,dc=example,dc=com    uid=group2,ou=Groups,dc=example,dc=com

但是没有办法构成仅返回“成员”属性值的查询。 (LDAP API 允许过滤结果集上的属性.)

为了允许此类查询返回组成员的用户 DN,而不是组 DN 本身,从 Hive 版本 2.1.1 开始,LDAP 身份验证提供程序将(重新)使用配置属性hive.server2.authentication.ldap.groupMembershipKey。此属性表示属性名称,该属性名称表示组条目上的用户 DN。在上面的示例中,该属性为“ * member *”。

这使 Hive LDAP 身份验证提供程序可以指定一个查询,该查询返回以下组和单个用户(将允许所有group1用户user4的用户进行身份验证):

<property>  
  <name>hive.server2.authentication.ldap.customLDAPQuery</name>
  <value><![CDATA[(|(&(objectClass=groupOfNames)(cn=group1))(&(objectClass=person)(sn=user4)))]]>
  </value>
</property>

优先 Sequences

可以将组成员资格参数与用户列表结合使用,以强制执行更严格的访问。 LDAP Atn 提供程序根据以下条件裁定认证决定:

  • 如果 hive-site.xml 包含*“ hive.server2.authentication.ldap.customLDAPQuery”,则仅**此查询的结果用于裁定身份验证决策。所有其他属性值(* .groupDNPattern,.groupFilter,.userDNPattern,*.userFilter)将被完全忽略。

  • 如果在配置文件中同时指定了* .groupFilter 和* .userFilter 参数,则仅在以下情况下才授予访问权限:被验证的用户满足两个条件;否则将拒绝访问。因此,必须在* .userFilter **中列出该用户,并且该用户必须也必须属于 .groupFilter 中列出的组之一。

  • 如果仅指定一个过滤器((* .userDNPattern * .userFilter)||(* .groupDNPattern * .groupFilter)),则根据要认证的用户是否满足指定的过滤器来做出决定。

  • 如果在配置文件中未指定* .groupFilter 和* .userFilter,则提供程序将尝试在* baseDN *树内的 LDAP 目录中搜索用户。如果已找到用户,则授予访问权限,否则将拒绝访问。 重要提示: 与以前的实现相比,此实现更加严格。在先前的实现中,如果未提供 baseDN,则如果提供者能够与用户绑定到 LDAP,则将授予身份验证