[

Saravanan Elumalai

](https://.com/@saravsars?source=post_page—–dea2362e3dda——————————–)[

Data Collective

](https://.com/data-collective?source=post_page—–dea2362e3dda——————————–)

Pache Zeppelin 是一个基于 Web 的笔记本平台,可通过交互式数据可视化和笔记本共享实现交互式数据分析。

Zeppelin 原生支持使用 Apache Shiro 的基于 LDAP/PAM 的身份验证和用户角色映射。OAuth 集成本身不可用,但在最新版本中添加了 KnoxSSO 支持。使用 KnoxSSO,我们可以将 Zeppelin 与任何 OAuth 提供商集成。

 阿帕奇诺克斯

Apache Knox 是一个应用程序网关,用于与 Apache Hadoop 部署的 REST API 和 UI 进行交互。Knox 支持使用 KnoxSSO 服务对 hadoop 应用程序进行 OAuth 身份验证。

KnoxSSO 服务是一种集成服务,它提供规范化的 SSO 令牌来表示经过身份验证的用户。

Knox 用户指南是关于如何安装和配置它的最佳资源。如果您打算使用 Google OAuth,由于 cookie 大小问题,您可能需要从源代码构建 Knox。

生成 OAuth 凭据

使用以下配置在任何 OAuth 提供程序中为 Web 应用程序创建客户端 ID 和客户端密码

<span id="0d37" data-selectable-paragraph="">Authorized JavaScript origins<em>:</em> https://KNOX_DOMAIN:KNOX_PORT<br>Authorized redirect URIs<em>:</em> https://KNOX_DOMAIN:KNOX_PORT/gateway/knoxsso/api/v1/websso?pac4jCallback=true&amp;client_name=OidcClient</span>

 KnoxSSO 配置

在 KNOX_PATH/conf/topologies/knoxsso.xml 中为 KnoxSSO 创建新拓扑

对于 OAuth 支持,Pac4j 可用作联合提供程序。

<span id="377d" data-selectable-paragraph="">&lt;?xml version="1.0" encoding="utf-8"?&gt;<br>&lt;topology&gt;<br>  &lt;gateway&gt;<br>    &lt;provider&gt;<br>      &lt;role&gt;federation&lt;/role&gt;<br>      &lt;name&gt;pac4j&lt;/name&gt;<br>      &lt;enabled&gt;true&lt;/enabled&gt;<br>      &lt;param&gt;<br>        &lt;name&gt;pac4j.callbackUrl&lt;/name&gt;<br>        &lt;value&gt;<a href="https://.com/data-collective/apache-zeppelin-oauth-integration-using-apache-knox-dea2362e3ddahttps://KNOX_DOMAIN:KNOX_PORT/gateway/knoxsso/api/v1/websso" rel="noopener ugc nofollow" target="_blank">https://KNOX_DOMAIN:KNOX_PORT/gateway/knoxsso/api/v1/websso</a>&lt;/value&gt;<br>      &lt;/param&gt;<br>      &lt;param&gt;<br>        &lt;name&gt;clientName&lt;/name&gt;<br>        &lt;value&gt;OidcClient&lt;/value&gt;<br>      &lt;/param&gt;<br>      &lt;param&gt;<br>        &lt;name&gt;oidc.id&lt;/name&gt;<br>        &lt;value&gt;CLIENT_ID&lt;/value&gt;<br>      &lt;/param&gt;<br>      &lt;param&gt;<br>        &lt;name&gt;oidc.secret&lt;/name&gt;<br>        &lt;value&gt;CLIENT_SECRET/value&gt;<br>      &lt;/param&gt;<br>      &lt;param&gt;<br>        &lt;name&gt;oidc.preferredJwsAlgorithm&lt;/name&gt;<br>        &lt;value&gt;RS256&lt;/value&gt;<br>      &lt;/param&gt;<br>      &lt;param&gt;<br>        &lt;name&gt;pac4j.id_attribute&lt;/name&gt;<br>        &lt;value&gt;email&lt;/value&gt;<br>      &lt;/param&gt;<br>      &lt;param&gt;<br>        &lt;name&gt;oidc.discoveryUri&lt;/name&gt;<br>        &lt;value&gt;OPENID_CONFIGURATION_URL&lt;/value&gt;<br>      &lt;/param&gt;<br>      &lt;param&gt;<br>       &lt;name&gt;pac4j.cookie.domain.suffix&lt;/name&gt;<br>       &lt;value&gt;KNOX_DOMAIN_SUFFIX&lt;/value&gt;<br>     &lt;/param&gt;<br>   &lt;/provider&gt;<br>&lt;/gateway&gt;<br>&lt;/topology&gt;</span>

 身份断言

标识断言提供程序在传达要使用的标识主体方面起着关键作用。在上面的配置中,电子邮件是在pac4j.id_attribute中配置的,该电子邮件作为用户名传递给Zeppelin。在某些情况下,我们需要转换此属性以匹配我们在内部使用的格式。例如,我们需要将 firstname.lastname@example.com 转换为firstname_lastname。标识断言提供程序可用于这些转换。识别断言支持静态主体映射、concat、switch case 和正则表达式。要将电子邮件转换为名称格式,我们可以使用正则表达式。

<span id="d237" data-selectable-paragraph="">&lt;provider&gt;<br>    &lt;role&gt;identity-assertion&lt;/role&gt;<br>    &lt;name&gt;Regex&lt;/name&gt;<br>    &lt;enabled&gt;true&lt;/enabled&gt;<br>    &lt;param&gt;<br>      &lt;name&gt;input&lt;/name&gt;<br>      &lt;value&gt;(.*)\.(.*)@example\.com&lt;/value&gt;<br>    &lt;/param&gt;<br>    &lt;param&gt;<br>      &lt;name&gt;output&lt;/name&gt;<br>      &lt;value&gt;{1}_{2}&lt;/value&gt;<br>    &lt;/param&gt;<br>  &lt;/provider&gt;</span>

 组映射

为了支持 Zeppelin 中基于角色的访问,例如对 Interpreter 设置的管理员访问,我们需要将用户映射到组。身份断言提供了 HadoopGroupProvider,它支持多种方法,如 unix 组、LDAP 查找等。

如果实例已配置了 Active directory,则可以使用 ShellBasedUnixGroupsMapping。

<span id="7da6" data-selectable-paragraph="">&lt;provider&gt;<br>    &lt;role&gt;identity-assertion&lt;/role&gt;<br>    &lt;name&gt;HadoopGroupProvider&lt;/name&gt;<br>    &lt;enabled&gt;true&lt;/enabled&gt;<br>    &lt;param&gt;<br>      &lt;name&gt;hadoop.security.group.mapping&lt;/name&gt;          &lt;value&gt;org.apache.hadoop.security.ShellBasedUnixGroupsMapping&lt;/value&gt;<br>    &lt;/param&gt;<br>  &lt;/provider&gt;</span>

 KnoxSSO 服务

将 KnoxSSO 服务添加到拓扑

<span id="710e" data-selectable-paragraph="">&lt;service&gt;<br>  &lt;role&gt;KNOXSSO&lt;/role&gt;<br>  &lt;param&gt;<br>    &lt;name&gt;knoxsso.cookie.secure.only&lt;/name&gt;<br>    &lt;value&gt;true&lt;/value&gt;<br>  &lt;/param&gt;<br>  &lt;param&gt;<br>    &lt;name&gt;knoxsso.token.ttl&lt;/name&gt;<br>    &lt;value&gt;3600000&lt;/value&gt;<br>  &lt;/param&gt;<br>  &lt;param&gt;<br>   &lt;name&gt;knoxsso.redirect.whitelist.regex&lt;/name&gt;<br>   &lt;value&gt;^/.*$;^https?://KNOX_DOMAIN:\d{0,9}/.*$$&lt;/value&gt;<br> &lt;/param&gt;<br>&lt;/service&gt;</span>

 Knoxssout 拓扑

在 KNOX_PATH/conf/topologies/knoxsso.xml 中创建新的拓扑 Knoxssout 以及用于注销的以下拓扑

<span id="0414" data-selectable-paragraph="">&lt;topology&gt;<br>  &lt;gateway&gt;<br>   &lt;provider&gt;<br>    &lt;role&gt;webappsec&lt;/role&gt;<br>    &lt;name&gt;WebAppSec&lt;/name&gt;<br>    &lt;enabled&gt;true&lt;/enabled&gt;<br>    &lt;param&gt;<br>     &lt;name&gt;cors.enabled&lt;/name&gt;<br>     &lt;value&gt;true&lt;/value&gt;<br>   &lt;/param&gt;<br> &lt;/provider&gt;<br>&lt;/gateway&gt;<br>&lt;service&gt;<br>  &lt;role&gt;KNOXSSO&lt;/role&gt;<br>&lt;/service&gt;<br>&lt;/topology&gt;</span>

我们需要 knox 服务器的公钥进行签名验证。导出证书并将其复制到 conf 文件夹。

<span id="5258" data-selectable-paragraph=""><em>KNOX_PATH/bin/</em>knoxcli.sh export-cert<br>cp KNOX_PATH/data/security/keystores/gateway-identity.pem /etc/knox/conf/knoxsso.pem</span>

 Zeppelin 配置

在 shiro.ini 中配置 KnoxSSO 身份验证

<span id="a07e" data-selectable-paragraph="">[main]<br>knoxJwtRealm = org.apache.zeppelin.realm.jwt.KnoxJwtRealm<br>knoxJwtRealm.providerUrl = <a href="https://.com/data-collective/apache-zeppelin-oauth-integration-using-apache-knox-dea2362e3ddahttps://KNOX_DOMAIN:KNOX_PORT/" rel="noopener ugc nofollow" target="_blank">https://KNOX_DOMAIN:KNOX_PORT/</a><br>knoxJwtRealm.login = gateway/knoxsso/api/v1/websso<br>knoxJwtRealm.logout = gateway/knoxssout/api/v1/webssout<br>knoxJwtRealm.logoutAPI = true<br>knoxJwtRealm.redirectParam = originalUrl<br>knoxJwtRealm.cookieName = hadoop-jwt<br>knoxJwtRealm.publicKeyPath = /etc/knox/conf/knoxsso.pem<br>knoxJwtRealm.groupPrincipalMapping = group.principal.mapping<br>knoxJwtRealm.principalMapping = principal.mapping<br>authc = org.apache.zeppelin.realm.jwt.KnoxAuthenticationFilter</span>