JupyterHubにSSOを導入してみた
コンニチハ、千葉です。
JupyterHubを利用すると、JupyterNotebook環境にログイン機能が追加され、マルチユーザーで利用できるようになります。 今回はJupyterHubの oauthenticator を使ってSSOを実装してみます。oauthenticatorを利用することでGitHub、Google、GitLabなどと連携できるようになります。
ということで、検証してみました。
構成イメージ
今回試してみたのはこんな構成です。JupyterHubへログインすると、AWS上のGitLabにリダイレクトしSSO連携します。
- ローカル環境
- Docker for Mac(kubernetes)
- Helmを使いJupyterHubをインストール
- AWS環境
- ACMを使いELBのリスナーをHTTPSで設定
- EC2上にDockerをインストールし、GitLabを立ち上げる
はじめはGitLabもローカル環境で試していたのですが、認証連携時にJypyterHubで500エラーが出ました。なんでかなーって、色々調査したのですが、OAUTH2連携にはTLSが必要のようで、その影響でエラーになっているようでした。そのため、GitLabはAWS上にたて、ELBを使ってTLS終端しています。
やってみた
AWS環境
EC2とロードバランサー の設定
まずは、EC2を立ち上げます。
ログインし、DockerのインストールとGitLabの起動を行いましょう。
$ sudo yum install docker $ sudo systemctl start docker $ sudo systemctl enable docker $ sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 1022:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest
ELBのターゲットグループを作成します。別途EC2の80ポートを解放しておきましょう。
ELBを作成しましょう。Application Load Balancerを指定し、セキュリティグループは443を許可します。
ACMを発行し、ロドバランサーのリスナーを443に設定します。
作成したロードバランサーにDNSの設定もしておきましょう。今回はRoute53を使っています。
EC2とロードバランサーの設定は以上です。
GitLabの設定
GitLabへログインし、アプリケーションの設定をします。アプリケーションIDとシークレットIDを取得します。
左上のユーザーのアイコン > Settings > Application から設定します。
スコープは api
と read_user
を有効化します。
また、コールバックURLは http(s)://jupyterhub-domain/hub/oauth_callback
を指定します。
発行されたApplication ID
と Secret
は控えておきましょう。
ローカル環境
JupyterHub環境
ローカル環境には、JupyterHubを展開します。 セットアップはこちらを参考に。
事前にDocker for Macの設定からKubernetesを有効にしておきましょう。
Helmでデプロイするときに指定するconfig.yml
は、こんな感じで設定します。GitLab認証を有効化するための設定を入れています。取得したApplication ID
と Secret
を入力しましょう。GITLAB_HOST
にはGitLabのURLを指定します。(因みにGITLAB_HOSTの行を削除すると、パブリックのGitLabに連携されるようになります)
proxy: secretToken: "xxx" singleuser: defaultUrl: "/lab" hub: extraConfig: jupyterlab: | c.Spawner.cmd = ['jupyter-labhub'] extraConfig: | from oauthenticator.gitlab import GitLabOAuthenticator c.JupyterHub.authenticator_class = GitLabOAuthenticator extraEnv: GITLAB_HOST: "https://gitlab.example.com/" OAUTH_CALLBACK_URL: "http://localhost/hub/oauth_callback" OAUTH_CLIENT_ID: "Application ID" OAUTH_CLIENT_SECRET: "Secret"
ログインしてみる
では、JupyterHubへ接続してGitLabのアカウントでログインできるか試してみましょう。 アクセスすると、GitLabログインのためのリンクが表示されます。クリックしましょう。
AWS上に展開したGitLabのログイン画面になりました。ユーザー、パスワードを入力しログインしてみます。
初回だけ許可確認されるので Authorize
をクリックします。
ログインできました!
さいごに
あまりドキュメントがなく、はまりましたがSSOできるようになりました。特にGitLabをTLS接続していなかったため、ログイン時に500エラーが返されてました。OAUTH2にはTLS必要という認識がなかったので、とても勉強になりました。それではまた。