原文:INTEGRATING CLICKHOUSE WITH LDAP (PART TWO)[1]
在本文中,我们将继续研究如何将LDAP[2]与ClickHouse[3]一起使用。现在,我们将讨论如何将 LDAP 集成提高到一个新的水平。我们将使用 LDAP 服务器作为外部用户目录。这我们可以避免在 ClickHouse 服务器上定义用户,而是将 ClickHouse 配置为查找和认证仅在 LDAP 服务器上指定的任何用户。一旦完成该工作,我们将看到如何将 LDAP 用户组映射到RBAC[4]角色,以动态控制所有 LDAP 定义的用户的访问管理。
设置
我们将使用与第 1 部分完全相同的设置,因此,如果您想继续进行,请设置测试环境,然后确保通过健全性检查。最后,添加 LDAP 服务器配置,并检查配置是否已成功应用。
LDAP 用户角色
在配置 LDAP 外部目录之前,我们需要定义一个或多个 RBAC 角色,这些角色将分配给我们的 LDAP 用户。如果我们不这样做,则 LDAP 用户将没有任何特权。因此,
-
让我们为 LDAP 用户创建一个单独的角色。
$ docker-compose exec clickhouse1 bash -c 'clickhouse client -q "CREATE ROLE ldap_user_role"'
-
检查该角色已创建。
$ docker-compose exec clickhouse1 bash -c 'clickhouse client -q "SHOW ROLES"'
ldap_user_role
-
现在,我们赋予 ldap_user_role
所有的权限以简化我们的测试。
$ docker-compose exec clickhouse1 bash -c 'clickhouse client -q "GRANT ALL ON *.* TO ldap_user_role"'
-
并检查授权是否成功。
$ docker-compose exec clickhouse1 bash -c 'clickhouse client -q "SHOW ACCESS" | grep ldap_user_role'
CREATE ROLE ldap_user_role
GRANT ALL ON *.* TO ldap_user_role
看起来不错。现在,我们可以继续启用 LDAP 外部用户目录。
使用 LDAP 外部用户目录
随着[docker-compose[5]](https://docs.docker.com/compose/)环境和运行,LDAP 服务器 ClickHouse 配置,我们可以告诉 ClickHouse 通过定义使用 LDAP 服务器作为外部用户目录<ldap>
中的部分<yandex><user_directories>
的config.xml
。
但是,为了使用最佳实践,我们不会直接修改config.xml
而是在/etc/clickhouse-server/config.d
目录中添加单独的配置文件。
请注意,如果您刚刚完成第 1 部分的工作,则需要删除ldapuser.xml
配置文件,以使其与我们将要设置的 LDAP 外部目录不冲突。
$ docker-compose exec clickhouse1 bash -c 'rm -rf /etc/clickhouse-server/users.d/ldapuser.xml'
然后确保我们无法使用登录ldapuser
。
$ docker-compose exec clickhouse1 bash -c 'clickhouse client -n --user "ldapuser" --password "ldapuser" -q "SELECT user()"'
如预期的那样,登录失败。
Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: ldapuser: Authentication failed: password is incorrect or there is no user with such name.
现在,我们准备添加 LDAP 外部用户目录。
docker-compose exec clickhouse1 bash -c 'cat <<HEREDOC > /etc/clickhouse-server/config.d/ldap_external_user_directory.xml
<?xml version="1.0" encoding="utf-8"?>
<yandex>
<!--LDAP external user directory da296a1c-7874-11eb-998e-ddba30bbed5d -->
<user_directories>
<ldap>
<server>openldap1</server>
<roles>
<ldap_user_role/>
</roles>
</ldap>
</user_directories>
</yandex>
HEREDOC'
请注意,在<roles>
中,我们指定了要分配给所有 LDAP 用户的角色。在这种情况下,我们只有一个ldap_user_role
角色,但是您可以根据需要添加任意多个角色。这些角色将始终被分配,并且在身份验证尝试期间必须存在。如果其中一个角色不存在,则在添加缺少的角色之前,LDAP 用户将无法进行身份验证,并且您将收到类似于以下内容的消息。
Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: ldapuser: Authentication failed: password is incorrect or there is no user with such name.
现在,重新启动 ClickHouse 服务器以应用用户目录配置。需要重新启动服务器才能添加或删除外部用户目录。
$ docker-compose restart clickhouse1
Restarting docker-compose_clickhouse1_1 ... done
让我们检查配置是否已合并。
$ docker-compose exec clickhouse1 bash -c 'cat /var/lib/clickhouse/preprocessed_configs/config.xml | grep da296a1c-7874-11eb-998e-ddba30bbed5d'
<!--LDAP external user directory da296a1c-7874-11eb-998e-ddba30bbed5d -->
在我们的openldap1
服务器上,我们ldapuser
将密码设置为与用户名相同。因此,让我们尝试使用该用户登录 ClickHouse。
$ docker-compose exec clickhouse1 bash -c 'clickhouse client -n --user "ldapuser" --password "ldapuser" -q "SELECT user()"'
ldapuser
它可以正常工作,我们可以使用 LDAP 定义的用户登录。现在,让我们动态地将另一个用户添加到我们的 LDAP 服务器中,并测试我们是否也可以使用该用户登录而不接触任何配置文件。
$ docker-compose exec openldap1 bash -c 'echo -e "dn: cn=new_ldap_user,ou=users,dc=company,dc=com
cn: new_ldap_user
gidnumber: 501
givenname: John
homedirectory: /home/users
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: User
uid: new_ldap_user
uidnumber: 2000
userpassword: new_ldap_user" | ldapadd -x -H ldap://localhost -D "cn=admin,dc=company,dc=com" -w admin'
您应该看到以下消息,确认新用户条目已添加到 LDAP。
adding new entry "cn=new_ldap_user,ou=users,dc=company,dc=com"
现在,让我们尝试使用该新的 LDAP 用户登录。
$ docker-compose exec clickhouse1 bash -c 'clickhouse-client -n --user "new_ldap_user" --password "new_ldap_user" -q "SELECT user()"'
new_ldap_user
它可以正常工作,我们可以使用动态添加的 LDAP 用户成功进行身份验证。现在,让我们动态地从 LDAP 中删除新用户。
$ docker-compose exec openldap1 bash -c 'ldapdelete -x -H ldap://localhost -D "cn=admin,dc=company,dc=com" -w admin "cn=new_ldap_user,ou=users,dc=company,dc=com"'
尝试使用已删除的 LDAP 用户登录,您应该看到登录失败如预期的那样。
$ docker-compose exec clickhouse1 bash -c 'clickhouse-client -n --user "new_ldap_user" --password "new_ldap_user" -q "SELECT user()"'
Code: 516. DB::Exception: Received from localhost:9000. DB::Exception: new_ldap_user: Authentication failed: password is incorrect or there is no user with such name.
启用 LDAP 用户组映射到 RBAC 角色
我们之前已经提到过,当 LDAP 用户登录时,他们被分配了我们在 LDAP 外部用户目录配置中指定的角色。在我们的案例中,我们仅分配了一个角色,即ldap_user_role
。让我们看看ldapuser
尝试登录进行确认时将哪些角色分配给原始文件。
$ docker-compose exec clickhouse1 bash -c 'clickhouse-client -n --user "ldapuser" --password "ldapuser" -q "SHOW ROLES"'
ldap_user_role
如您所见,ldapuser
确实分配了ldap_user_role
,这是它唯一的角色。您不能将任何其他角色添加到 LDAP 用户,而是只能从配置中指定的角色之一授予或撤消特权。静态分配的角色在某些情况下可以工作,但是鉴于我们使用的是 LDAP,我们不仅要管理使用 LDAP 的用户,还要管理用户角色。通常,LDAP 用户将属于一个或多个 LDAP 组,因此根据 LDAP 用户所属的 LDAP 组分配 RBAC 角色不是很好吗?确实,这很好,角色映射也可以做到这一点。
我们可以通过<role_mapping>
在 LDAP 外部用户目录定义中添加部分来启用角色映射。
$ docker-compose exec clickhouse1 bash -c 'cat <<HEREDOC > /etc/clickhouse-server/config.d/ldap_external_user_directory.xml
<?xml version="1.0" encoding="utf-8"?>
<yandex>
<!--LDAP external user directory da296a1c-7874-11eb-998e-ddba30bbed5d -->
<user_directories>
<ldap>
<server>openldap1</server>
<roles>
<ldap_user_role/>
</roles>
<role_mapping>
<base_dn>ou=groups,dc=example,dc=com</base_dn>
<scope>subtree</scope>
<search_filter>(&(objectClass=groupOfNames)(member={bind_dn}))</search_filter>
<attribute>cn</attribute>
<prefix>clickhouse_</prefix>
</role_mapping>
</ldap>
</user_directories>
</yandex>
HEREDOC'
<role_mapping>
上面的部分定义了用于使用 LDAP 用户专有名称执行 LDAP 搜索的参数。在上述配置中,我们说要查找具有基本可分辨名称的所有对象ou=groups,dc=example,dc=com
,并且搜索范围为subtree
,搜索过滤器设置为(&(objectClass=groupOfNames)(member={bind_dn}))
,我们将用来映射到 RBAC 角色的属性是的值在cn
和属性值必须有前缀clickhouse_
。
这有点复杂,但是我们在此配置中使用的基本含义是,我们只想映射clickhouse_
以 RBAC 角色的前缀开头的,已分配 LDAP 用户的 LDAP 组名。如果您对这些选项感到困惑,那么最好与 LDAP 管理员联系,它们应该能够为您的组织提供正确的值。同样,ClickHouse 再次使用上述选项来执行 LDAP 搜索,并且如您所见,它们为查找和使用不同对象及其属性映射到 RBAC 角色提供了灵活性。
我们还必须注意,在我们的 XML 配置中,必须对&
符号进行转义。幸运的是,XML 仅需要转义几个字符,因此很容易留意它们。这是完整列表。
-
"
–"
-
'
–'
-
<
–<
-
>
–>
-
&
–&
现在,让我们重新启动 ClickHouse 服务器并启用角色映射。
$ docker-compose restart clickhouse1
现在,我们可以添加一个新的 LDAP 组,并将其分配给ldapuser
我们已经拥有的 LDAP 组。然后,我们需要添加将要映射的相应 RBAC 角色。因此,让我们创建一个 LDAP 角色组,并将其通用名称设置为clickhouse_role1
。
$ docker-compose exec openldap1 bash -c 'echo -e "dn: cn=clickhouse_role1,ou=groups,dc=company,dc=com
objectclass: top
objectclass: groupOfUniqueNames
uniquemember: cn=admin,dc=company,dc=com" | ldapadd -x -H ldap://localhost -D "cn=admin,dc=company,dc=com" -w admin'
您应该看到消息,确认我们的新条目已添加到 LDAP。
adding new entry "cn=clickhouse_role1,ou=groups,dc=company,dc=com"
现在添加ldapuser
到该组。
$ docker-compose exec openldap1 bash -c 'echo -e "dn: cn=clickhouse_role1,ou=groups,dc=company,dc=com
changetype: modify
add: uniquemember
uniquemember: cn=ldapuser,ou=users,dc=company,dc=com" | ldapmodify -x -H ldap://localhost -D "cn=admin,dc=company,dc=com" -w admin'
您应该确认 LDAP 组条目已被修改。
modifying entry "cn=clickhouse_role1,ou=groups,dc=company,dc=com"
现在剩下要做的就是登录ldapuser
并检查它现在具有什么角色。
$ docker-compose exec clickhouse1 bash -c 'clickhouse-client -n --user "ldapuser" --password "ldapuser" -q "SHOW ROLES"'
我们看到我们有以下内容:
一切都没有改变,我们只看到静态分配的角色。糟糕,我们忘记了要做的就是添加一个相应的 RBAC 角色!但这很好办
$ docker-compose exec clickhouse1 bash -c 'clickhouse client -q "CREATE ROLE clickhouse_role1"'
我们再试一次。
$ docker-compose exec clickhouse1 bash -c 'clickhouse-client -n --user "ldapuser" --password "ldapuser" -q "SHOW ROLES"'
您应该看到,现在ldapuser
具有静态分配ldap_user_role
和映射的两个角色clickhouse_role1
。
clickhouse_role1
ldap_user_role
这显示了我们如何将 LDAP 组映射到 RBAC 角色的基本行为。继续并添加更多的 LDAP 组和 RBAC 角色并进行使用。
结论
现在可以将 ClickHouse 与 LDAP 集成在一起 。我们已经看到,一旦将 LDAP 服务器定义添加到 ClickHouse 配置中,我们就可以对现有的 ClickHouse 用户进行身份验证,或者启用 LDAP 外部用户目录以使用 LDAP 服务器完全管理 ClickHouse 用户。我们还研究了如何为 LDAP 用户分配静态 RBAC 角色,或者如何使用角色映射将 LDAP 组映射到 RBAC 角色。
总而言之,我们现在不再需要在 XML 配置文件中定义密码和用户,最终大型组织可以将其 ClickHouse 安装与其使用 LDAP 的其余服务集成在一起。因此,如果您的组织使用的是 LDAP,请与您的 LDAP 管理员联系,然后开始使用 LDAP 管理所有 ClickHouse 用户。您的管理员和安全部门一定会对此表示赞赏。
如果您对 ClickHouse 安全性还有其他疑问,请随时通过 Altinity 与我们联系。我们的团队喜欢研究安全主题,并很乐意为您提供帮助。
参考资料
INTEGRATING CLICKHOUSE WITH LDAP (PART TWO): https://altinity.com/blog/integrating-clickhouse-with-ldap-part-two
[2]
LDAP: https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol
[3]
ClickHouse: https://clickhouse.tech/
[4]
RBAC: https://clickhouse.tech/docs/en/operations/access-rights/
[5]
[docker-compose: https://docs.docker.com/compose/
原文始发于微信公众号(alitrack):[译] CLICKHOUSE 与 LDAP 集成(第二部分)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/62938.html