Carpe Diem

備忘録

PAM (Pluggable Authentication Modules)

概要

LinuxにはPAMという認証システムとアプリケーションを分離するための仕組みが用意されています。

f:id:quoll00:20200223221238p:plain

ref: https://docs.oracle.com/cd/E19253-01/819-0396/ch3pam-01/index.html

プラガブルという名前の通り、モジュールによって認証方法を簡単に切り替え可能になっています。

今回はその設定を理解します。

環境

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 他に参照するモジュールがある場合は無視される。
他に参照するモジュールがない場合、成功すると認証は成功。
他に参照するモジュールがある場合は無視される。
他に参照するモジュールがない場合、認証は失敗。

このようにrequisitesufficientはその時点で即失敗 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について説明しました。

ソース