Help us understand the problem. What is going on with this article?

AWSでJupyterHub (JupyterHubへのログイン)

概要

全体概要は,AWSでJupyterHub (概要) にあるので,参照してください.

今回は,前回セットアップしたJupyterHubへのログイン周りを固めていきます.
JupyterHubの認証はいくつかあるのですが,今回はPAM認証を利用しています.

前回のままでは,ログインできないので,正しくログインできるように整えてます.

おしながき

  • JupyterHubへのログイン
  • 権限の修正
  • リトライ
  • notebookのディレクトリ変更

JupterHubへのログイン

実はec2-userでログインしようとすると,ログインできないのです.
どんなに丁寧に入力してもログインできません.

ここで動作確認もかねて,テスト用のアカウントadmin_usertest_userの2つを作っておきます.
以下のコマンドで,ユーザ追加,パスワード設定,JupyterHub用ディレクトリの作成を行います.
ユーザ追加時にjupyterhubグループを指定しておきます.
パスワードは自分が分かるものにしておきます.(後で使うので)
ディレクトリは各ユーザのホームディレクトリ配下にnotebookという名前で作ります.

アカウント追加
useradd admin_user -g jupyterhub
passwd admin_user
sudo -u admin_user mkdir /home/admin_user/notebook

同様にtest_userも同じコマンドで作成していきます.
次に,jupyterhub_config.pyにユーザ追加します.
追加の仕方は次のようにします.

/etc/jupyterhub/jupyterhub_config.py
c.Authenticator.admin_users = {
  'ec2-user',
  'admin_user'
}
c.Authenticator.whitelist = {
  'ec2-user',
  'admin_user',
  'test_user'
}

追加したら,jupyterhubを起動させます.

ログイン画面で,作ったばかりのユーザでログインしてみます.
いずれのユーザもログインに失敗してしまいます.
ログにも同じような情報が出ていると思います./var/log/secureというログにもその時の記録がされています.(sudoを使おうとしているため記録されます)
これは,PAM認証がうまく機能していないためです.

PAM認証とは

Linuxには,各アプリケーションが共通して認証できる機構が備わっています.
それが,PAM(Pluggable Authentication Modules)のようです.
詳しい説明はここではやりません.(あまり知らないので出来ません...)

実行権限の修正

ユーザ名・パスワードがあってても,Linuxユーザのjupyterhubがログインユーザへのsudo権限がないためです.
jupyterhubがどのユーザにもsudoが使えるように設定していきます.
sudo権限を管理できる/etc/sudoers.d/というディレクトリがあります.実はec2-userの設定がここにあり,root同等の権限を持てる設定になってます.
jupyterhubというユーザがjupyterhubグループに対して,sudo -u {username} /opt/anaconda3/bin/sudospawnerというコマンドをパスワードなしで実行できるようにします.この手の権限付与はピンポイントでやっておくべきなので,コマンドに対して付与していきます.

/etc/sudoers.d/jupyterhub
## Jupyterhub
Cmnd_Alias JUPYTER_CMD = /opt/anaconda3/bin/sudospawner
%jupyterhub ALL=(jupyterhub) /usr/bin/sudo
jupyterhub ALL=(%jupyterhub) NOPASSWD:JUPYTER_CMD

次に,Anacondaにsudospawnerパッケージを追加します.

sudo /opt/anaconda3/bin/conda install -y -c conda-forge sudospawner

これとは他に,jupyterhubユーザにPAM認証の権限を付与するためにshadowグループに追加させる必要があります.
/etc/shadowというファイルを操作するため状態を確認しておきます.

[root@xxx ~] ls -l /etc/shadow
---------- 1 root root 708 Dec  4 07:41 /etc/shadow

権限はrootになっていますが,000と読み書きできないファイルになっています.以下のコマンドを実行して,変更していきます.

# shadowグループの追加
sudo groupadd shadow

# /etc/shadowファイルをshadowグループに変更
sudo chgrp shadow /etc/shadow

# /etc/shadowファイルのshadowグループにread権限追加
sudo chmod g+r /etc/shadow

# jupyterhubユーザをshadowグループに追加
sudo usermod -a -G shadow jupyterhub

/etc/shadowファイルについて

このファイルは,ユーザのパスワード情報が記録されています.
入力したパスワードを指定されたハッシュ化によって得られた値とファイル内のハッシュ値を突き合わせて認証をするようです.
ファイル内のec2-userが,!!となっているので,「このユーザにログインできない」というロック状態を意味しているようです.
そのため,JupyterHubでいくらログインしても失敗するようでした.(詳細まで理解できてないです)

再度,ログイン

jupyterhubの権限が設定出来たら,jupyterhubを起動させます.
起動コマンドは以下のようにします.JupyterHub.spawner_classのオプションを付けただけです.

cd /etc/jupyterhub
sudo -u jupyterhub /opt/anaconda3/bin/jupyterhub --JupyterHub.spawner_class=sudospawner.SudoSpawner

起動後,ブラウザでアクセスして,最初に作ったtest_userでログインしてみると,以下のような画面に遷移します.

ログイン後画面.png

ここまで表示できれば,JupyterHubの設定は完了です.

JupyterHubのホームディレクトリの変更

この時(AWSでJupyterHub (EC2))に追加したEBSに向けさせようと思います.
/etc/jupyterhub/jupyterhub_config.pyを以下のように修正します.

/etc/jupyterhub/jupyterhub_config.py
# c.Spawner.notebook_dir = '~/notebook'
c.Spawner.notebook_dir = '/mnt/jupyterhub/{username}'

修正したら,/mnt/jupyterhub/配下に各ユーザのディレクトリを作ります.今回はtest_userを対象にします.
ディレクトリが出来たら,JupyterHubを再起動させて設定ファイルを反映させます.

ディレクトリ作成
sudo -u test_user mkdir /mnt/jupyterhub/test_user

ログイン後,ブラウザで試しにnotebookを作成します.
/mnt/jupyterhub/test_user/Untitled.ipynbというファイルが作成されていれば,Spawner.notebook_dirの設定が反映できたことになります.

まとめ

今回は,JupyterHubのユーザ管理をPAM認証によって制御するための設定を行いました.
jupyterhubユーザへのsudo権限の追加,shadowファイルのread権限修正を経て,Linuxユーザでのログインができるようになりました.
また,notebookのディレクトリを追加したEBSに向けさせるようにしました.ストレージを分けることで管理しやすくなると同時に,JupyterHubが稼働するストレージに問題が起きても,notebookのあるストレージに影響が出ないため安全になります.

認証機能は,デフォルトでPAMAuthenticatorというクラスが機能するのですが,他にもLDAPやGitHubなどのアカウントでログインできるような仕組みがあります.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした