Edited at

Apache Zeppelinにチームで利用するためのセキュリティ設定

More than 1 year has passed since last update.


Zeppelinにセキュリティを導入したい背景

Amazon EMR上 のZeppelinにガチャガチャとダッシュボードを作ったのでいざチームのみんなに見てもらえるようにしようと思ったのが背景。HDPのアドベントカレンダーなのにEMRでやっているのはご愛嬌。EMR久しぶりにさっているけど、コンフィグの管理と反映がやっぱり手間かかる。EMRだとConfiguring Applicationsみたいな機能を使って起動時にコンフィグをインジェクションしちゃうのがやっぱりよさげ。

いろいろ手元で試行錯誤するにはApache Ambariみたいなものが入っていると便利でいいね。


やったこと


  1. 認証の導入


    • 単一ユーザーでの認証。

    • ユーザーごとの権限管理は今回はやっていない。



  2. HTTPS化


認証


ZeppelinはApache Shiroを認証認可に利用している

ZeppelinのドキュメントのShiro authentication for Apache Zeppelinを参照して設定。手順は以下のとおり


1. shiro.ini: 認証有効可のために編集

shiro.iniはEMRだと/etc/zeppelin/conf/shiro.iniにある。これをドキュメントどおり

/** = anon

#/** = authc

から

#/** = anon

/** = authc

に変更。


2. zeppelin-site.xml: Zeppelin側で匿名ユーザーをアクセス拒否するようにする

/etc/zeppelin/conf/zeppelin-site.xml.templateというファイルがあるのでこれを/etc/zeppelin/conf/zeppelin-site.xmlにコピーしてzeppelin.anonymous.allowedfalseに変更する。


3. Zeppelinを再起動して設定を適用

$ sudo -u zeppelin /usr/lib/zeppelin/bin/zeppelin-daemon.sh restart


4. アクセスしてみる

shiro.iniを見ると以下の様なデフォルトユーザーが設定されているので、ZeppelinにアクセスしてLoginボタンからユーザー名とパスワードを入力してやればOK

admin = password1

user1 = password2
user2 = password3


 shiro.iniをちょっと覗いてみる

さっと覗いてみると、LDAPやActive Directory関連の設定項目が並んでいる。必要に応じて設定してやればバックエンドにLDAPなどを簡単に利用できそう。いまのところ不要なのでためしていない。

activeDirectoryRealm = org.apache.zeppelin.server.ActiveDirectoryGroupRealm

activeDirectoryRealm.systemUsername = userNameA
activeDirectoryRealm.systemPassword = passwordA
activeDirectoryRealm.searchBase = CN=Users,DC=SOME_GROUP,DC=COMPANY,DC=COM
activeDirectoryRealm.url = ldap://ldap.test.com:389
activeDirectoryRealm.groupRolesMap = "CN=aGroupName,OU=groups,DC=SOME_GROUP,DC=COMPANY,DC=COM":"group1"
activeDirectoryRealm.authorizationCachingEnabled = false

ldapRealm = org.apache.zeppelin.server.LdapGroupRealm
# search base for ldap groups (only relevant for LdapGroupRealm):
ldapRealm.contextFactory.environment[ldap.searchBase] = dc=COMPANY,dc=COM
ldapRealm.contextFactory.url = ldap://ldap.test.com:389
ldapRealm.userDnTemplate = uid={0},ou=Users,dc=COMPANY,dc=COM
ldapRealm.contextFactory.authenticationMechanism = SIMPLE

今回は小さな利用だしチーム内で権限をわける必要がないのでLDAP等は利用の検討対象外だったけれども、大きな組織の中で利用するような場合や、HDPを使っている場合などはLDAPやActive Directoryを使っていることも多いと思う。そういうときにサクッと設定できそうでよさげ。


HTTPS化

ユーザー認証ができたので、あとは通信を暗号化してやればまあOKかなということで、nginxでSSL Terminationをする。ZeppelinはWebSocketを利用するので、Reverse ProxyはConnection: Upgradeをサポートするように設定する必要があるのに注意。