私はPAMを研究していますが、制御フラグのいくつかの組み合わせの意味については少し無知です。 Red Hatのドキュメントから:
必須
そのようなPAMの失敗は、最終的にPAM-APIが失敗を返すことにつながりますが、残りのスタックされたモジュール(このサービスおよびタイプ)が呼び出された後にのみ必要な
必須のように、そのようなモジュールが失敗を返した場合、制御はアプリケーションに直接返されます。十分
そのようなモジュールの成功は、モジュールのスタックの認証要件を満たすのに十分です(以前に必要なモジュールが失敗した場合、このモジュールの成功は無視されます)。このモジュールの失敗は、このタイプが成功したアプリケーションを満たすために致命的であるとは見なされません。モジュールが成功した場合、PAMフレームワークは他のモジュールを試行せずにすぐにアプリケーションに成功を返します。
したがって、私の理解では、モジュールrequisite
が失敗した場合、モジュールのスタック全体が解析されず、コントロールはすぐにアプリケーションに戻ります。モジュールsufficient
が成功した場合、残りのモジュールスタックは解析されず、コントロールはすぐにアプリケーションに戻ります。モジュールrequired
が失敗した場合、スタック全体が解析されます。
現在、特定のモジュールrequired
が失敗し、別のモジュールsufficient
が成功した場合の動作を理解できません。
PAMは、スタック上の項目を順番に処理します。それがどのような状態に到達したかということではなく、どの状態にあるか(成功または拒否、成功はこれまでの成功を意味する)のメモリを保持するだけです。
sufficient
とマークされたアイテムが成功すると、PAMライブラリはそのスタックの処理を停止します。これは、以前のrequired
アイテムがあったかどうかに関係なく発生します。この時点で、PAMは現在の状態を返します。前のrequired
アイテムが失敗しなかった場合は成功、それ以外の場合は拒否されます。
同様に、requisite
とマークされたアイテムが失敗すると、PAMライブラリは処理を停止し、失敗を返します。その時点では、前のrequired
アイテムが失敗したかどうかは関係ありません。
言い換えると、required
は必ずしもスタック全体を処理する必要はありません。続けるだけです。
私の意見では、モジュールが成功するためには、required
制御フラグが常に成功する必要があります。
sufficient
フラグの付いたモジュールは、失敗すると無視されます。それが成功し、上記のrequired
フラグ付きモジュールが失敗しなかった場合、同じタイプの他のモジュールをチェックする必要はなく、モジュールは成功したと見なされます。したがって、基本的には、required
フラグはsufficient
フラグよりも優先されますが、後者のフラグは、前のrequired
フラグが成功した場合、残りのフラグのチェックを停止することができます。
例:
1 auth required /lib/security/pam_nologin.so
2 auth required /lib/security/pam_securetty.so
3 auth required /lib/security/pam_env.so
4 auth sufficient /lib/security/pam_rhosts_auth.so
5 auth required /lib/security/pam_stack.so service=system-auth
1、2、3、4行目が成功した場合、5行目をスキップして、モジュールauth
が成功します。 4行目が失敗した場合は無視され、5行目がチェックされます。ライン1、2、3のいずれかに障害が発生した場合、ライン4は考慮されません。