如何在 Zeppelin 中基于 HadoopGroupProvider 中的组配置角色,使用 Knox 提供基于 SAML 的 SSO?

Posted

技术标签:

【中文标题】如何在 Zeppelin 中基于 HadoopGroupProvider 中的组配置角色,使用 Knox 提供基于 SAML 的 SSO?【英文标题】:How to configure roles based on groups from HadoopGroupProvider in Zeppelin, using Knox to provide SAML-based SSO? 【发布时间】:2020-02-05 13:02:49 【问题描述】:

我正在尝试在 Zeppelin 上实施角色库访问控制,使用 Knox 对外部 IdP 进行身份验证,并在用户成功通过身份验证后从 LDAP 实例执行组查找。

我目前能够登录 Zeppelin,HadoopGroupProvider 正在按预期查找用户的组,但经过身份验证的用户未映射到任何角色,因此无法创建笔记本或使用任何解释器。

我对 Knox 的配置如下所示:

<?xml version="1.0" encoding="utf-8"?>
<topology>
    <gateway>
      <provider>
        <role>federation</role>
        <name>pac4j</name>
        <enabled>true</enabled>
        <param>
          <name>pac4j.callbackUrl</name>
          <value>https://knox.example.com/gateway/knoxsso/api/v1/websso</value>
        </param>
        <param>
          <name>clientName</name>
          <value>SAML2Client</value>
        </param>
        <param>
          <name>saml.keystorePath</name>
          <value>/opt/knox-1.3.0/data/security/keystores/gateway.jks</value>
        </param>
        <param>
          <name>saml.keystorePassword</name>
          <value>password</value>
        </param>
        <param>
          <name>saml.privateKeyPassword</name>
          <value>password</value>
        </param>
        <param>
          <name>saml.identityProviderMetadataPath</name>
          <value>/etc/sso/idp.xml</value>
        </param>
        <param>
          <name>saml.maximumAuthenticationLifetime</name>
          <value>100000</value>
        </param>
        <param>
          <name>saml.serviceProviderEntityId</name>
          <value>https://knox.example.com/gateway/knoxsso/api/v1/websso?pac4jCallback=true&amp;client_name=SAML2Client</value>
        </param>
        <param>
          <name>saml.serviceProviderMetadataPath</name>
          <value>/etc/sso/sp.xml</value>
        </param>
        <param>
          <name>pac4j.id_attribute</name>
          <value>username</value>
        </param>
      </provider>
      <provider>
        <role>identity-assertion</role>
        <name>HadoopGroupProvider</name>
        <enabled>true</enabled>
        <param>
            <name>hadoop.security.group.mapping</name>
            <value>org.apache.hadoop.security.LdapGroupsMapping</value>
        </param>
        <param>
            <name>hadoop.security.group.mapping.ldap.bind.user</name>
            <value>cn=loginuser,ou=example,ou=example,dc=example,dc=example,dc=example,dc=com</value>
        </param>
        <param>
            <name>hadoop.security.group.mapping.ldap.bind.password</name>
            <value>password</value>
        </param>
        <param>
            <name>hadoop.security.group.mapping.ldap.url</name>
            <value>ldap://example.ldap.com:389</value>
        </param>
        <param>
            <name>hadoop.security.group.mapping.ldap.base</name>
            <value>ou=example,dc=example,dc=example,dc=example,dc=com</value>
        </param>
        <param>
            <name>hadoop.security.group.mapping.ldap.search.filter.user</name>
            <value>(&amp;(objectClass=user)(|(sAMAccountName=0)(mailNickname=0)))</value>
        </param>
        <param>
            <name>hadoop.security.group.mapping.ldap.search.filter.group</name>
            <value>(&amp;(cn=group*)(objectclass=Group))</value>
        </param>
        <param>
            <name>hadoop.security.group.mapping.ldap.search.attr.member</name>
            <value>member</value>
        </param>
        <param>
            <name>hadoop.security.group.mapping.ldap.search.attr.group.name</name>
            <value>cn</value>
        </param>
      </provider>
    </gateway>
    <service>
        <role>KNOXSSO</role>
        <param>
           <name>knoxsso.cookie.secure.only</name>
           <value>true</value>
        </param>
        <param>
          <name>knoxsso.token.ttl</name>
          <value>100000</value>
        </param>
        <param>
          <name>knoxsso.redirect.whitelist.regex</name>
          <value>.*</value>
        </param>
        <param>
            <name>knoxsso.token.ttl</name>
            <value>-1</value>
        </param>
    </service>
</topology>

这是我的 Zeppelin 的 shiro.ini 配置:

[main]
knoxJwtRealm = org.apache.zeppelin.realm.jwt.KnoxJwtRealm
knoxJwtRealm.providerUrl = https://knox.example.com/
knoxJwtRealm.login = gateway/knoxsso/api/v1/websso
knoxJwtRealm.publicKeyPath = /etc/pki/tls/certs/knox.example.com.pem
knoxJwtRealm.logoutAPI = false
knoxJwtRealm.logout = gateway/knoxsso/api/v1/webssout
knoxJwtRealm.cookieName = hadoop-jwt
knoxJwtRealm.redirectParam = originalUrl
knoxJwtRealm.groupPrincipalMapping = group.principal.mapping
knoxJwtRealm.principalMapping = principal.mapping
authc = org.apache.zeppelin.realm.jwt.KnoxAuthenticationFilter

securityManager.realms = $knoxJwtRealm

sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager

cookie = org.apache.shiro.web.servlet.SimpleCookie
cookie.name = JSESSIONID
cookie.httpOnly = true
sessionManager.sessionIdCookie = $cookie

securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 86400000
shiro.loginUrl = /api/login

[roles]
admin_role = *
user_role = *

[urls]
/api/version = anon
/** = authc

由于 gateway-audit.log,我确信 HadoopGroupProvider 正在连接到我的 LDAP 实例并成功查找我的组:

19/10/07 15:33:00 ||6348f279-0ed2-445b-8a73-b76a8fcb985a|audit|1.2.3.4|KNOXSSO|USER1|||identity-mapping|principal|USER1|success|Groups: [Group1, Group2, Group3]

我的问题是:

如何将这些组映射到 Zeppelin 中的角色?

KnoxJwtRealm 是否有与 org.apache.zeppelin.realm.LdapRealm 的 rolesByGroup 配置等效的配置?

非常感谢任何帮助,在此先感谢!

【问题讨论】:

我面临着类似的问题。你找到方法了吗? 【参考方案1】:

Knox 拓扑中 HadoopGroupProvider 中的组查找看起来正确,您将能够使用这些组进行服务级别授权,以保护对该拓扑所代理的服务的访问。

但是,这些组不会从网关传播到后端服务。 Zeppelin 需要配置为进行自己的组查找和角色映射。不幸的是,我不熟悉 Zeppelin 配置。

以下内容可能会有所帮助:https://zeppelin.apache.org/docs/0.8.0/setup/security/shiro_authentication.html#groups-and-permissions-optional

【讨论】:

以上是关于如何在 Zeppelin 中基于 HadoopGroupProvider 中的组配置角色,使用 Knox 提供基于 SAML 的 SSO?的主要内容,如果未能解决你的问题,请参考以下文章

数据分析 - Zeppelin

无法在基于 apache/zeppelin:0.9.0 的 Docker 映像中安装软件包

Zeppelin:如何在 zeppelin 中重新启动 sparkContext

Apache Zeppelin - 如何在 Apache Zeppelin 中使用 Helium 框架

在 Zeppelin 中如何使用 Hive

如何在 Zeppelin 中使用 Plotly