Zeppelinにセキュリティを導入したい背景
Amazon EMR上 のZeppelinにガチャガチャとダッシュボードを作ったのでいざチームのみんなに見てもらえるようにしようと思ったのが背景。HDPのアドベントカレンダーなのにEMRでやっているのはご愛嬌。EMR久しぶりにさっているけど、コンフィグの管理と反映がやっぱり手間かかる。EMRだとConfiguring Applicationsみたいな機能を使って起動時にコンフィグをインジェクションしちゃうのがやっぱりよさげ。
いろいろ手元で試行錯誤するにはApache Ambariみたいなものが入っていると便利でいいね。
やったこと
- 認証の導入
- 単一ユーザーでの認証。
- ユーザーごとの権限管理は今回はやっていない。
- 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.allowed
をfalse
に変更する。
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
をサポートするように設定する必要があるのに注意。