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,则将授予身份验证