PAMセッション内の外部ユーザー認証/ PAMセッション内のPAMセッション認証

PAMセッション内の外部ユーザー認証/ PAMセッション内のPAMセッション認証

カスタムPAMセッションでユーザーを正しく認証する方法はありますか?

私は現在、ユーザーが外部トークンを介してログインできるようにする独自のPAM認証モジュールを作成しています。このトークンは、ユーザーが自分のモジュールを使用してログインする前に作成する必要があります。したがって、トークンがない場合は、基本的なPAM認証に戻り、ユーザーが認証されるとすぐに私のコードを使い続けたいと思います。

これは可能ですか?擬似コードでは、私のモジュールは次のようになります。

pam_sm_authenticate() {
  if (first_login) {
    code_copied_from_pam_unix_to_authenticate_user();
    // do something else here?
  } else {
    custom_auth();
  }
}

迅速な修正でLinux pam_unixモジュールのコードを私のモジュールにコピーし、正しく動作しました。しかし、これは追加のライブラリがたくさん必要で pam_unix が変更されない場合にのみ機能するため、あまり満足できません。私のセッション内で別のPAMセッションを開きたいのですが、まだ機能していません。

ベストアンサー1

コードにすべてのロジックを実行させないでください。まず、PAMとその構成を使用して、モジュールが最適な条件で実行されていることを確認してください(つまり、pam_unixコードを複製する必要はありません)。

まず、あなたのモジュールに別の疑似コードを提案します。

pam_sm_authenticate() {
    if (first_login) return PAM_CRED_INSUFFICIENT;
    else custom_auth();
}

ここで私の考えでは初めてログイン資格情報が不足している場合です。私は、PAMにユーザーを完全に認証するために必要なすべてがないため、モジュールが失敗したと言いました。ここでモジュールが呼び出されると仮定すると、my_module可能な構成は次のとおりです。

auth [cred_insufficient=ok success=done default=2] my_module.so
auth [success=ok default=1]      pam_unix.so
auth sufficient                  my_module.so
auth requisite                   pam_deny.so

詳細は次のとおりです。

  • まず要求がmy_module。これにはいくつかの可能性があります。

    1. 最初のログイン:モジュールはを返しますPAM_CRED_INSUFFICIENT。この事件は捕獲PAM(pass)を通じて、この場合チェーンを成功( )cred_insufficientで表示するように構成されますが、ok続く
    2. これは最初のログインではありません。あなたがログインして成功しcustom_auth()ました(返されますPAM_SUCCESS)。この場合、チェーン(done)を終了します。アクセス許可
    3. 今回が初めてログインするのではなく、custom_auth()良い結果が得られていません(PAM_AUTH_ERRまたは他の種類の内部エラー)。この場合、次の2行(default=2)をスキップしてください。チェーンは直接進行しますが、pam_deny常に失敗します。アクセス不可
  • 最初のシーンではチェーンが続きますpam_unix。これには2つの可能性があります。

    1. UNIX認証に成功しました。これはチェーンの成功を示します(ok)。次のモジュールに移動
    2. UNIX認証に失敗しました。次のモジュール(default=1)をスキップすると、チェーンは次に終了しますpam_denyアクセス不可
  • 3行目に到達すると、1行目が終わってmy_module成功しました。あなたのモジュールはagain()として呼び出されます。再び2つの可能性があります。PAM_CRED_INSUFFICIENTpam_unix// do something else here?sufficient

    1. 今回はモジュールが成功します。アクセス許可
    2. モジュールが再び失敗しましたが、資格情報が不足している以外の理由で:アクセス不可

カスタムコードを実行することもできます。UNIX認証後、失敗しても。これを行うには、2行目を次のように変更します。

auth [success=ok default=bad]    pam_unix.so

my_moduleそれにもかかわらず、これによりチェーンがもう一度通過するようになりますが、チェーンは次のように表示されます。失敗。モジュールが最終的にここで成功しても、チェーンは失敗します。

チェーンから呼び出された回数をモジュールが知りたい場合もあります。つまり、最初の呼び出しmy_moduleと2番目の呼び出しを区別します。これはパラメータを介して簡単に実行できます。

auth [cred_insufficient=ok success=done default=2] my_module.so
auth [success=ok default=1]      pam_unix.so
auth sufficient                  my_module.so second_time
auth requisite                   pam_deny.so

ここで、2番目の呼び出しには(および経由で)役立つpam_sm_authenticate引数が渡されます。argvargc場所ランタイムチェーンのモジュール。もちろん、firstLoginそのような区別をするには十分な条件が必要です。

おすすめ記事