外部RADIUSサーバーでの認証にPAMを使用しています。 /etc/pam.d/common-authに次の行があります
auth [success = 6 default = ignore] pam_exec.so Exposure_authtok /home/cliuser/radiusAuth.sh
PAMは、パスワードをスクリプトのstdinに書き込み、ユーザー名を環境変数として提供します。
これは、libpam-modulesバージョン1.1.1-6.1まで機能していました。 1.1.3-7.1にアップグレードした後、スクリプトを読み込もうとすると、パスワードが空になります。 sshサーバーとしてopen-sshを使用しています。
ありがとう、プラシャーント
短い答え
私はこの問題を経験していましたが、問題は/ etc/ssh/sshd_configに違反しているポリシーがあったことでした。私の場合、AllowUsersが設定されていて、システムにまだ存在していないユーザーとしてログインしようとしていました。
長い回答
より長い答えは、パスワードが上書きされていたということです。それは実際には空っぽではありませんでした。たまたま、最初の行に表示できないバックスペース文字(^ H)と改行が含まれていました。私が使用していた読み取りコマンドは、変数の最初の行のみを読み取っていました。 stdinでcatを使用した後、完全なコンテンツ(vim with:set listで表示)は
"^H$
^M^?INCORRECT^@"
ドル記号は改行です。
少し掘り下げた後、opensshソースコードでこれを見つけました
これは、パスワードが上書きされていることを示しています
これには、期待した文字が含まれています。コメントはその理由を説明しています:
/*
* If the user logging in is invalid, or is root but is not permitted
* by PermitRootLogin, use an invalid password to prevent leaking
* information via timing (eg if the PAM config has a delay on fail).
*/
Authctxt-> validをfalseとしてマークするために使用される検証ロジックはここにあります https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth.c#L98
これは、ユーザー/パスワードが無効である可能性があるすべての理由を示しています。
編集:リンクを更新して、特定のコミットにロックし、正しいままにするようにしました。コードは変更されましたが、動作は変更されていません。
もう1つのよくある間違い/誤解は、stdinで渡されるpamからパスワードを取得する方法です。私が見た最も簡単な方法は
PASS=`cat -`
。 $ @、$ 1などの引数から読み取るより一般的な方法は機能しません。