カスタム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
。これにはいくつかの可能性があります。- 最初のログイン:モジュールはを返します
PAM_CRED_INSUFFICIENT
。この事件は捕獲PAM(pass)を通じて、この場合チェーンを成功( )cred_insufficient
で表示するように構成されますが、ok
続く。 - これは最初のログインではありません。あなたがログインして成功し
custom_auth()
ました(返されますPAM_SUCCESS
)。この場合、チェーン(done
)を終了します。アクセス許可。 - 今回が初めてログインするのではなく、
custom_auth()
良い結果が得られていません(PAM_AUTH_ERR
または他の種類の内部エラー)。この場合、次の2行(default=2
)をスキップしてください。チェーンは直接進行しますが、pam_deny
常に失敗します。アクセス不可。
- 最初のログイン:モジュールはを返します
最初のシーンではチェーンが続きます
pam_unix
。これには2つの可能性があります。- UNIX認証に成功しました。これはチェーンの成功を示します(
ok
)。次のモジュールに移動。 - UNIX認証に失敗しました。次のモジュール(
default=1
)をスキップすると、チェーンは次に終了しますpam_deny
。アクセス不可。
- UNIX認証に成功しました。これはチェーンの成功を示します(
3行目に到達すると、1行目が終わって
my_module
成功しました。あなたのモジュールはagain()として呼び出されます。再び2つの可能性があります。PAM_CRED_INSUFFICIENT
pam_unix
// do something else here?
sufficient
- 今回はモジュールが成功します。アクセス許可。
- モジュールが再び失敗しましたが、資格情報が不足している以外の理由で:アクセス不可。
カスタムコードを実行することもできます。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
引数が渡されます。argv
argc
場所ランタイムチェーンのモジュール。もちろん、firstLogin
そのような区別をするには十分な条件が必要です。