Pluggable Authentication Modules

最終更新: 2025-08-23 13:11:15 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

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) を呼び、ハンドルを無効化して登録済みクリーンアップ コールバックを実行します。

c
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 配下のファイルはファイル名からサービス名を取得します。

text
service  type     control     module-path            arguments
example  auth     required    pam_unix.so            try_first_pass

4 つの単純な制御は結果の流れを定義します。

  • 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 で閲覧・コメントする(投稿にはログインが必要です)