Linux-PAM により、アプリケーションは認証ポリシーを管理者が制御するモジュールへ委譲 できます。アプリケーションはユーザー対話と権限境界を所有し、PAM はトランザクション ハンドルを所有して設定済みスタックをロードし、モジュール結果を組み合わせます。 その結果、アプリケーションはローカルパスワード、スマートカード、ディレクトリ サービス、MFA、アカウント制限を、これらの仕組みを組み込まずに使用できます。
トランザクションの役割 #
PAM トランザクションには 5 つの役割があります。
- アプリケーション はトランザクションを開始・終了します。
- サービス は
pam_startに渡すポリシー名で、通常はlogin、sshd、sudoです。 - 管理グループ は
auth、account、session、passwordの操作を選択します。 - モジュール は 1 つ以上の管理グループのエントリポイントを実装する共有オブジェクトです。
- 会話関数 は、アプリケーション経由でプロンプト、情報メッセージ、応答を要求できるようにします。
The application begins with pam_start(service, user, &conversation, &pamh). pam_handle_t は不透明で 1 つのトランザクションに属します。別の並行トランザクション
には別のハンドルを作成します。一般的な認可経路では pam_authenticate、必要に応じて
pam_setcred、続いて pam_acct_mgmt を呼び出します。セッションを許可する前に
pam_open_session を呼び、終了時に pam_close_session を呼びます。パスワード変更
には pam_chauthtok を使います。経路に関係なく、アプリケーションは
pam_end(pamh, last_status) を呼び、ハンドルを無効化して登録済みクリーンアップ
コールバックを実行します。
pam_handle_t *pamh = NULL;
int status = pam_start("example", user, &conversation, &pamh);
if (status == PAM_SUCCESS)
status = pam_authenticate(pamh, 0);
if (status == PAM_SUCCESS)
status = pam_acct_mgmt(pamh, 0);
if (pamh != NULL)
pam_end(pamh, status);auth はアイデンティティを確立し、認証情報も確立する場合があります。account は
有効期限やポリシー制限を含め、現在アクセスが許可されるか確認します。session は
監査設定、制限、マウントなどのライフサイクル処理を行います。password は認証
トークンを更新します。適切な account と session の呼び出しを伴わない認証成功は、
完全なログインフローではありません。
ポリシーファイルとスタック #
Linux-PAM はディレクトリが存在する場合 /etc/pam.d/SERVICE を読み、存在しない場合
は /etc/pam.conf を使用します。/etc/pam.d のポリシーは、/usr/lib/pam.d にある
同名のベンダーファイルを上書きします。pam.conf の規則にはサービスフィールドが
含まれますが、pam.d 配下のファイルはファイル名からサービス名を取得します。
service type control module-path arguments
example auth required pam_unix.so try_first_pass4 つの単純な制御は結果の流れを定義します。
requiredは失敗を記録しますが、スタックの残りを評価します。requisiteは直ちに失敗します。sufficientは以前の required モジュールが失敗していなければ直ちに成功し、失敗は無視されます。optionalはスタック内で唯一有効なモジュールの場合にだけ意味を持ちます。
[success=1 default=bad] などの拡張制御は、特定の PAM_* 戻り値を ignore、bad、
die、ok、done、reset、数値ジャンプなどのアクションに対応付けます。これは
装飾ではありません。ジャンプやデフォルトアクションを変更すると、要素を迂回したり、
サービス停止を認可に変えたりする可能性があります。
include は別のポリシーファイルから要求された管理型の規則を挿入します。substack
も別ファイルを評価しますが、done、die、ジャンプはその substack 内に閉じます。
モジュール引数はモジュール固有です。引用符を保持し、あるモジュールが受け付ける
オプションが別のモジュールでも意味を持つと仮定しないでください。
モジュールを安全に記述する #
モジュールは pam_sm_authenticate、pam_sm_acct_mgmt、pam_sm_open_session、
pam_sm_chauthtok など、グループ固有のシンボルを実装します。競合するプロンプトを
作成せず、pam_get_user でユーザーを取得し、pam_get_authtok で認証トークンを
取得します。トランザクションスコープの状態は pam_set_data で保存し、クリーン
アップコールバックを提供します。パスワード、トークン、秘密から導出したデータを
ログに記録せず、pam_syslog で診断を報告します。
失敗を表す文書化された PAM_* 結果を返します。利用できないディレクトリ、無効な
パスワード、内部エラーを誤って成功にまとめないでください。モジュールコードは
セキュリティに敏感で、ときに特権付きのプロセスで実行されるため、すべての外部入力を
検証し、安全でない環境の仮定を避け、メモリ処理に上限を設け、クリーンアップを冪等に
します。
ポリシー変更はまず専用のサービス名とアカウントでテストします。既存の root コンソール またはリカバリーパスを既知の正常なポリシーで認証可能に保ち、インストール前に構文を 検証し、成功と想定される各失敗経路をテストします。リカバリーパスなしでリモート管理 セッションが使用するポリシーを編集すると、すべての管理者を締め出す可能性があります。
The Linux-PAM application manual, especially pam_start(3), pam_end(3), and pam.conf(5), is the authoritative interface for Linux-PAM behavior.
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)