web-dev-qa-db-ja.com

PAM-必須かつ十分な制御フラグ

私はPAMを研究していますが、制御フラグのいくつかの組み合わせの意味については少し無知です。 Red Hatのドキュメントから:

  • 必須
    そのようなPAMの失敗は、最終的にPAM-APIが失敗を返すことにつながりますが、残りのスタックされたモジュール(このサービスおよびタイプ)が呼び出された後にのみ

  • 必要な
    必須のように、そのようなモジュールが失敗を返した場合、制御はアプリケーションに直接返されます。

  • 十分
    そのようなモジュールの成功は、モジュールのスタックの認証要件を満たすのに十分です(以前に必要なモジュールが失敗した場合、このモジュールの成功は無視されます)。このモジュールの失敗は、このタイプが成功したアプリケーションを満たすために致命的であるとは見なされません。モジュールが成功した場合、PAMフレームワークは他のモジュールを試行せずにすぐにアプリケーションに成功を返します。

したがって、私の理解では、モジュールrequisiteが失敗した場合、モジュールのスタック全体が解析されず、コントロールはすぐにアプリケーションに戻ります。モジュールsufficientが成功した場合、残りのモジュールスタックは解析されず、コントロールはすぐにアプリケーションに戻ります。モジュールrequiredが失敗した場合、スタック全体が解析されます。

現在、特定のモジュールrequiredが失敗し、別のモジュールsufficientが成功した場合の動作を理解できません。

14
ludiegu

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は考慮されません。

1
dsmsk80