概要
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について説明しました。