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 から設定します。

スコープは apiread_user を有効化します。 また、コールバックURLは http(s)://jupyterhub-domain/hub/oauth_callback を指定します。

発行されたApplication IDSecret は控えておきましょう。

ローカル環境

JupyterHub環境

ローカル環境には、JupyterHubを展開します。 セットアップはこちらを参考に。

事前にDocker for Macの設定からKubernetesを有効にしておきましょう。

Helmでデプロイするときに指定するconfig.ymlは、こんな感じで設定します。GitLab認証を有効化するための設定を入れています。取得したApplication IDSecret を入力しましょう。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必要という認識がなかったので、とても勉強になりました。それではまた。

参考