PAM を使用するアプリケーション。PAM コンシューマとも呼ばれる
PAM フレームワーク。PAM ライブラリとも呼ばれる (libpam(3LIB) を参照)
PAM 構成。/etc/pam.d/ または /etc/pam.conf でシステム全体、およびユーザー単位 pam_user_policy(5)
PAM サービスモジュール。PAM サービスプロバイダとも呼ばれる
このフレームワークは、認証関連アクティビティーの統一的な実施手段を提供します。このアプローチを使えば、アプリケーション開発者は、PAM サービスのポリシーの意味を知らなくてもサービスを使用できるようになります。アルゴリズムは一元的に提供されます。アルゴリズムの変更は、個々のアプリケーションとは無関係に行えます。PAM を使えば、管理者は、アプリケーションを変更しないで、特定システムのニーズに合わせて認証プロセスを調整できるようになります。管理者は、/etc/pam.d ディレクトリにあるサービス別のファイルを使用して PAM を構成します。/etc/pam.conf ファイルには旧バージョンの構成が含まれています。
次の図は、PAM のアーキテクチャーを示したものです。アプリケーションは、PAM アプリケーションプログラミングインタフェース (API) 経由で PAM ライブラリと通信します。PAM モジュールは、PAM サービスプロバイダインタフェース (SPI) 経由で PAM ライブラリと通信します。したがって、PAM ライブラリを使えば、アプリケーションとモジュールとの相互通信を実現できます。
図 1 PAM のアーキテクチャー
PAM サービスモジュールは、login、su、ssh などのシステムエントリアプリケーションに対し、認証およびその他のセキュリティーサービスを提供する共有ライブラリです。
PAM サービスには次の 4 種類があります。
認証サービスモジュール (auth) – アカウントまたはサービスへのアクセス許可をユーザーに与えるためのモジュール。このサービスを提供するモジュールは、ユーザーの認証およびユーザー資格の設定を行います。
アカウント管理モジュール (account) – 現在のユーザーのアカウントが有効かどうかを決定するためのモジュール。このサービスを提供するモジュールは、パスワードまたはアカウントの有効期間を検査できるほか、時間制限付きアクセスの検査も行えます。
セッション管理モジュール (session) – ログインセッションの設定と終了を行うためのモジュール。
パスワード管理モジュール (password) – パスワードの強度規則の適用と認証トークンの更新を行うためのモジュール。
1 つの PAM モジュールには、上記サービスを 1 つ以上実装できます。タスクが明確に定義された単純なモジュールを使用すれば構成の柔軟性が増すため、PAM サービスは別個のモジュールとして実装することをお勧めします。その後、サービスを「積み上げる」、つまり実行の順序で PAM 構成ファイルに配置することができます。pam.conf(4) を参照してください。
たとえば、Oracle Solaris OS に付属する pam_authtok_check(5) モジュールを使えば、システム管理者はサイトのパスワードポリシーを構成できます。pam_authtok_check(5) モジュールは、提案されたパスワードを、さまざまな強度条件に基づいて検査します。
Oracle Solaris PAM モジュールの完全な一覧については、『SunOS リファレンスマニュアル 5 : 標準、環境、マクロ』を参照してください。PAM モジュールの接頭辞は pam_ です。
PAM ライブラリ libpam(3LIB) は、PAM アーキテクチャーの主要構成要素です。
libpam は pam(3PAM) API をエクスポートします。アプリケーションは、この API を呼び出すことで、認証、アカウント管理、資格の確立、セッション管理、およびパスワード変更を行えます。
libpam は、まず /etc/pam.conf、次に /etc/pam.d 内のサービス別 PAM ポリシーファイルで PAM 構成を探します。PAM 構成は、利用可能なサービスごとに PAM モジュール要件を指定し、システム管理者によって管理されます。
libpam は、サービスモジュールによってエクスポートされた pam_sm(3PAM) SPI をインポートします。
コンシューマが PAM ライブラリを使ってユーザー認証を行う例として、login がユーザー認証を行う手順を次に示します。
login アプリケーションは、PAM セッションを開始するために、pam_start(3PAM) を呼び出し、login サービスを指定します。
アプリケーションは、PAM ライブラリ pam_authenticate(3PAM) によってエクスポートされた PAM API に含まれる libpam(3LIB) を呼び出します。
PAM ライブラリは、認証のサービスモジュールタイプ (auth) に対応する login エントリを PAM 構成内で検索します。
PAM ライブラリは、PAM 構成内で login サービス用として構成されたモジュールごとに、pam_sm_authenticate(3PAM) を呼び出します。pam_sm_authenticate() は PAM SPI に含まれる関数です。PAM 構成ファイル内の制御フラグフィールドと、構成されているモジュールに対する各 pam_sm_authenticate() 呼び出しの結果の組み合わせによって、ユーザーがシステムへのアクセスを許可されるかどうかが決まります。このプロセスの詳細は、Oracle Solaris 11.3 での Kerberos およびその他の認証サービスの管理 の PAM の構成に記載されています。
PAM ライブラリはこのような方法で、PAM アプリケーションを、システム管理者によって構成された PAM モジュールへと接続します。
PAM コンシューマは PAM ライブラリ libpam とリンクする必要があります。各モジュールが提供するサービスをアプリケーションから利用するには、pam_start(3PAM) を呼び出して PAM ライブラリのインスタンスを初期化する必要があります。pam_start() を呼び出すと、ハンドルが初期化されます。このハンドルは、後続の PAM 呼び出し時に毎回指定する必要があります。アプリケーション内での PAM サービスの利用を終了する際には、pam_end() を呼び出し、PAM ライブラリが使用したすべてのデータをクリーンアップします。
PAM アプリケーションと PAM モジュール間の通信は、アイテム経由で実現されます。たとえば、初期化時に使うと便利なアイテムを、次に示します。
PAM_AUSER – 認証されたユーザー名
PAM_USER – 現在の認証ユーザー
PAM_RUSER – 信頼できないリモートユーザー名
PAM_AUTHTOK – パスワード
PAM_USER_PROMPT – ユーザー名プロンプト
PAM_TTY – ユーザーが通信に使用している端末
PAM_RHOST – ユーザーがシステムにアクセスする際に経由するリモートホスト
PAM_REPOSITORY - ユーザーのアカウントリポジトリに対するすべての制限
PAM_RESOURCE – リソースに対するすべての制御
利用可能なすべてのアイテムの一覧については、pam_set_item(3PAM) のマニュアルページを参照してください。アプリケーションからアイテムを設定するには、pam_set_item(3PAM) を使用します。モジュールによって設定された値をアプリケーション内で取り出すには、pam_get_item(3PAM) を使用します。ただし、PAM_AUTHTOK と PAM_OLDAUTHTOK はアプリケーションから取得できません。また、PAM_SERVICE アイテムは設定できません。