1

外部プロセスからユーザー名とパスワードを取得し、Vintela を使用してユーザー認証を行う perl スクリプトがあります。誰かが Vintela に強制的にキャッシュをフラッシュさせるまで、すべてが完全に機能します。キャッシュがフラッシュされた後、Authen::PAM モジュールはコード 10 を返します。これは、ユーザー名が見つからなかったことを意味します。

シェルで「id $username」コマンドを実行してからスクリプトを実行すると、そのユーザーのすべてが正常に戻ります。または、ユーザーがシステムに SSH 接続した場合、Authen::PAM は完全に機能します。

本番サーバーでは、ユーザーはサーバーに SSH 接続しないため、Vintela フラッシュの後、ユーザーはログインできなくなります。認証する前に、すべてのユーザーに対して「id」コマンドを実行したくありません。スクリプトまたは PAM モジュールに強制的にユーザーを検索させてから認証させる方法はありますか?

脚本 -

BEGIN {
    unshift(@INC, "..", "/usr/local/staf/bin", "/usr/local/staf/lib", "C:/STAF/Bin");
}

use strict;
use PLSTAF;
require Authen::PAM;

my $GlobalUserName = <STDIN>;
my $GlobalPasswd = <STDIN>;
my $result = -1;


$GlobalPasswd = STAF::RemovePrivacyDelimiters($GlobalPasswd);

my $pamHandle = Authen::PAM->new("login", $GlobalUserName, \&conversionFunction);
$result = $pamHandle->pam_authenticate();

# force the destructor execution for PAM
$pamHandle = 0;

# When $result is 0 then user has been authenticated
if ($result == 0) {
    print $result;
    exit $result;
}
else {
    exit $result;
}


sub conversionFunction {

    my @response = ();

    # PAM constants
    my $pamEchoOn = Authen::PAM->PAM_PROMPT_ECHO_ON();
    my $pamEchoOff = Authen::PAM->PAM_PROMPT_ECHO_OFF();
    my $pamSuccess = Authen::PAM->PAM_SUCCESS();

    while ( @_ ) {
        my $code = shift;
        my $msg = shift;
        my $answer = "";

        if ($code == $pamEchoOn) {
            $answer = $GlobalUserName;
        }
        if ($code == $pamEchoOff) {
            $answer = $GlobalPasswd;
        }

        # response is always in pairs, response code and the actual answer
        push(@response, $pamSuccess, $answer);
    }
    push(@response, $pamSuccess);

    return @response;
}
4

0 に答える 0