外部プロセスからユーザー名とパスワードを取得し、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;
}