Linux/pam

pam (2015-12-24)


PAM は Pluggable Authentication Modules(プラグ可能認証モジュール) for Linux のことで、認証周りの設定に使います。
書式はman pam.d で確認できます。とはいえ、この英語のマニュアル読んでもいまいちよく分かりません。
備忘録として具体的な記載例をいくつかメモします。

以下、例としてログイン認証処理から一部分を抜粋

$ cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
session    required     pam_selinux.so open

ログインした時の認証処理で、以下の順番に検証されていきます。

1行目auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so/etc/securetty に定義されたttyからのみ root ログインを可能にする。
[user_unknown~] の部分は後述。
2行目auth include system-authユーザ認証をsystem-authで実行する
3行目account required pam_nologin.so/etc/nologin があればrootのみを許可する

required はこの行で判定NGの場合にログイン失敗となるが、3行目以降へ処理は続行されるという命令
4行目account include system-authユーザアカウントの有効性をsystem-authで検証する
5行目password include system-authパスワードの有効性をsystem-authで検証する
6行目session required pam_selinux.so open接続時にselinuxを実行する

書式構成は

<管理タイプ>  <コントロール>  <モジュール(path指定)>  <モジュールへの引数>

1列目の<管理タイプ>で何を管理するのかを指定。4タイプあります(account/auth/passwd/session)

2列目の<コントロール>は
 <この行の戻り値=実行するアクション> の書式で指定。アクションの内容は以下。

ignoreこの行の戻り値を無視する
badこの行で処理失敗となったときは、後に続く行の処理結果についても失敗とみなす
diebadと同様で、かつその行で終了となる
ok前の行で成功であった場合は、この行の戻り値で上書きする
doneokと同様で、かつその行で終了となる
resetこれまでの状態をリセット、次の行からやり直す

これを踏まえて、<required>などは、以下の内容を省略したものになる。

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]この行での処理結果は問わない
include-管理タイプに関する処理をモジュールから読込む、処理結果は読込み先モジュールの内容次第

3列目の各モジュール名は「man system-auth」とかで使い方の詳細が見れるようです。割愛。

例その2。/etc/pam.d/su より抜粋。
suコマンドは root ユーザで実行した場合(pam_rootok)、認証OKとして終了することになる(sufficient)。その場合は二行目のsystem-authが実行されない。

auth            sufficient      pam_rootok.so
auth            include         system-auth

例その3。/etc/pam.d/system-auth より抜粋。
パスワード強度を検証して(prm_cracklib)、判定NGの場合はエラー終了とする。(requisite)
つまり、パスワード変更とかで3回怒られた場合には変更されずに(pam_unixには行かずに)終了するということ。

password    requisite     pam_cracklib.so try_first_pass retry=3
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok

あとは、PAM認証はlibpamやlibpam_miscを読込むことで、
アプリケーションから pam_start() などの関数を使うことができるようですが、
手元の環境に pam_misc.h 等が見当たらないので、今回はここまで。