概要
全体概要は,AWSでJupyterHub (概要) にあるので,参照してください.
今回は,前回セットアップしたJupyterHubへのログイン周りを固めていきます.
JupyterHubの認証はいくつかあるのですが,今回はPAM認証を利用しています.
前回のままでは,ログインできないので,正しくログインできるように整えてます.
おしながき
- JupyterHubへのログイン
- 権限の修正
- リトライ
- notebookのディレクトリ変更
JupterHubへのログイン
実はec2-userでログインしようとすると,ログインできないのです.
どんなに丁寧に入力してもログインできません.
ここで動作確認もかねて,テスト用のアカウントadmin_userとtest_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にユーザ追加します.
追加の仕方は次のようにします.
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というコマンドをパスワードなしで実行できるようにします.この手の権限付与はピンポイントでやっておくべきなので,コマンドに対して付与していきます.
## 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でログインしてみると,以下のような画面に遷移します.
ここまで表示できれば,JupyterHubの設定は完了です.
JupyterHubのホームディレクトリの変更
この時(AWSでJupyterHub (EC2))に追加したEBSに向けさせようと思います.
/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などのアカウントでログインできるような仕組みがあります.
