あるアプリケーションが次の関数を呼び出すと、libpam は構成ファイル /etc/pam.conf を読み取り、そのサービスの操作に関与するモジュールを決定します。
認証管理やアカウント管理など、このサービスのある操作に対するモジュールが /etc/pam.conf に 1 つしか含まれていない場合、そのモジュールの結果によって、その操作の結果が決まります。たとえば、passwd アプリケーションのデフォルトの認証操作には、1 つのモジュール pam_passwd_auth.so.1 が含まれています。
passwd auth required pam_passwd_auth.so.1 |
これに対し、サービスのある操作に対して複数のモジュールが定義されている場合、それらのモジュールは「スタック」を形成しており、そのサービスに対する「PAM スタック」が存在している、と言います。たとえば、pam.conf に次のエントリが含まれる場合を考えます。
login auth requisite pam_authtok_get.so.1 login auth required pam_dhkeys.so.1 login auth required pam_unix_cred.so.1 login auth required pam_unix_auth.so.1 login auth required pam_dial_auth.so.1 |
これらのエントリは、login サービスに対するサンプルの auth スタックを表現したものです。このスタックの結果を決定するには、個々のモジュールの結果コードに対して「統合プロセス」を実行する必要があります。統合プロセスでは、各モジュールが、/etc/pam.conf 内で指定された順番で実行されます。個々の成功コードまたは失敗コードが、モジュールの制御フラグに基づいて総合結果へと統合されます。制御フラグによっては、スタックの早期終了が発生する可能性があります。たとえば、requisite モジュールが失敗したり、sufficient モジュールや binding モジュールが成功したりする可能性があります。スタックの処理が完了すると、個々の結果が組み合わされて単一の総合結果が算出され、それがアプリケーションに渡されます。
制御フラグは、サービスへのアクセスを決定するうえで、ある PAM モジュールが果たす役割を示します。制御フラグとその効果は、次のとおりです。
binding – binding モジュールの要件を満たすことに成功すると、その時点までの required モジュールがどれも失敗しなかった場合には、すぐにアプリケーションに成功が返されます。これらの条件が満たされると、後続のモジュールは実行されません。失敗すると、required 失敗が記録され、モジュールの処理が継続されます。
include – 別の PAM 構成ファイルに含まれる行を追加し、それらの行がその時点で PAM スタック内で使用されるようにします。このフラグは成功または失敗の動作を制御しません。新しいファイルが読み取られると、PAM のインクルードスタックが 1 増やされます。新しいファイル内でのスタックチェックが完了すると、インクルードスタック値が 1 減らされます。ファイルの末尾に到達し、かつ PAM インクルードスタックが 0 であれば、スタック処理は終了します。PAM インクルードスタックの最大数は、32 です。
optional – optional モジュールの要件を満たすことに成功することは、サービスを使用するために必要な条件ではありません。失敗すると、optional 失敗が記録されます。
required – required モジュールの要件を満たすことに成功することは、サービスを使用するために必要な条件です。失敗すると、このサービスの残りのモジュールの実行完了後に、エラーが返されます。サービスの最終的な成功が返されるのは、binding または required モジュールがどれも失敗を報告しなかった場合だけです。
requisite – requisite モジュールの要件を満たすことに成功することは、サービスを使用するために必要な条件です。失敗するとすぐにエラーが返され、後続のモジュールは実行されません。あるサービスのすべての requisite モジュールが成功を返さないと、この機能がアプリケーションに成功を返すことができません。
sufficient – その時点までに required 失敗が一度も発生しなかった場合、sufficient モジュールが成功するとすぐにアプリケーションに成功が返され、後続のモジュールは実行されません。失敗すると、optional 失敗が記録されます。
次の 2 つの図は、統合プロセスでアクセスがどのように決定されるかを示したものです。最初の図は、制御フラグのタイプごとに成功または失敗がどのように記録されるのかを示しています。2 番目の図は、統合された値の決定方法を示しています。