概要
LinuxにはPAMという認証システムとアプリケーションを分離するための仕組みが用意されています。
ref: https://docs.oracle.com/cd/E19253-01/819-0396/ch3pam-01/index.html
プラガブルという名前の通り、モジュールによって認証方法を簡単に切り替え可能になっています。
今回はその設定を理解します。
環境
- Ubuntu 18.04.3
PAMの設定
PAMの設定は/etc/pam.d/
でアプリケーション毎にあります。書式は以下のようになっています。
<module_interface> <control_flag> <module_name> <module_arguments>
具体的には以下のように設定されます。
auth required pam_unix.so
Module Interface
各モジュールインタフェースは以下の種類があります。
タイプ | 説明 |
---|---|
auth | ユーザの認証(正当性を確認する)モジュール |
account | ユーザに一般的な許可があるかどうかを確認するモジュール |
password | ユーザーのパスワード変更に使用するモジュール |
session | ユーザセッションの管理と設定を行うモジュール |
Control Flags
各制御フラグは以下の種類があります。
制御フラグ | 成功するとどうなる | 失敗するとどうなる |
---|---|---|
required | 次のモジュールへ | 認証は失敗。ただし次のモジュールがある場合は次のモジュールへ |
requisite | 次のモジュールへ | 認証は失敗。即エラーを返す。 |
sufficient | このモジュールが成功した時点で認証は成功。次のインタフェースへ。 ただし sufficient より上にrequired の失敗がない場合に限る。required 自体がなければ即成功 |
無視される。次のモジュールへ |
optional | 他に参照するモジュールがある場合は無視される。 他に参照するモジュールがない場合、成功すると認証は成功。 |
他に参照するモジュールがある場合は無視される。 他に参照するモジュールがない場合、認証は失敗。 |
このようにrequisite
やsufficient
はその時点で即失敗 or 成功するので、順番に注意する必要があります。
また@include
を使って別の設定ファイルを読み込んで、設定の共通化を行うこともできます。
sudoの場合
#%PAM-1.0 session required pam_env.so readenv=1 user_readenv=0 session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0 @include common-auth @include common-account @include common-session-noninteractive
common-auth
の中身は以下。
auth [success=1 default=ignore] pam_unix.so nullok_secure auth requisite pam_deny.so auth required pam_permit.so auth optional pam_cap.so
success=1 default=ignore
common-auth
の中身には先ほどの制御フラグとは異なる書き方になっています。
実は先ほどの制御フラグはシンタックスシュガーで、PAMは以下の書式でより詳細な設定をすることが可能です。
[value1=action1 value2=action2 ...]
これはモジュールの戻り値がvalueN
の場合はactionN
を実行するという意味です。
actionの種類
valueはモジュールによって様々ですが、actionは以下の種類があります。
action | 処理 |
---|---|
ignore | この行を無視する |
bad | この行を失敗とする |
die | badと同じだが、即時PAMの処理を終了する |
ok | この行を成功とする(直前の処理結果が失敗でない限り、この行の戻り値で上書きする) |
done | okと同じだが、即時PAMの処理を終了する |
reset | これまでの状態をリセット、次の行からやり直す |
n(数字) | この行を成功とし、次のn個のmoduleをスキップする |
つまりcommon-auth
の[success=1 default=ignore]
は
- 成功したら次の1個のモジュールをスキップする
- それ以外の戻り値は無視する
という意味になります。
デフォルトの制御フラグ
制御フラグをこの書式で表現すると以下になります。
制御フラグ | [...]シンタックスだとどうか |
---|---|
required | [success=ok new_authtok_reqd=ok ignore=ignore default=bad] |
requisite | [success=ok new_authtok_reqd=ok ignore=ignore default=die] |
sufficient | [success=done new_authtok_reqd=done default=ignore] |
optional | [success=ok new_authtok_reqd=ok default=ignore] |
まとめ
Unix, Linuxで標準で搭載されているプラガブルな認証システムPAMについて説明しました。