web-dev-qa-db-ja.com

export_authtokが有効になっている場合、pam_exec.soはスクリプトにパスワードを書き込みません

外部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ソースコードでこれを見つけました

https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth-pam.c#L1198

これは、パスワードが上書きされていることを示しています

https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth-pam.c#L234

これには、期待した文字が含まれています。コメントはその理由を説明しています:

/*
 * 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

これは、ユーザー/パスワードが無効である可能性があるすべての理由を示しています。

編集:リンクを更新して、特定のコミットにロックし、正しいままにするようにしました。コードは変更されましたが、動作は変更されていません。

7
uilwen

もう1つのよくある間違い/誤解は、stdinで渡されるpamからパスワードを取得する方法です。私が見た最も簡単な方法は

PASS=`cat -`

。 $ @、$ 1などの引数から読み取るより一般的な方法は機能しません。

1
JT Moree