sudo pam スタックで pam_echo.so を使用できないのはなぜですか?

sudo pam スタックで pam_echo.so を使用できないのはなぜですか?

CentOS 7 マシンがあり、sudo 中に認証が失敗したときにメッセージを表示したいと考えています。pam_echoに行を追加してこれを実行しようとしました/etc/pam.d/sudo

/etc/security/fooテスト用に、文字列「bar」を含むファイル を作成しました。

これは私のsudo pamスタックです/etc/pam.d/sudo:

auth       include      system-auth
auth       optional     pam_echo.so file=/etc/security/foo
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so revoke
session    required     pam_limits.so

何らかの理由で、認証に失敗したときに pam_echo のこの出力が表示されません。

$ sudo ls
[sudo] password for steve: 
Sorry, try again.
[sudo] password for steve: 
Sorry, try again.
[sudo] password for steve: 
sudo: 3 incorrect password attempts

pamtester を使用して sudo pam スタックをテストしたところ、間違ったパスワードを入力した後、期待どおりの結果が得られました。

$ pamtester sudo steve authenticate
Password:
bar

同様に、正しいパスワードを入力しても出力はありませんでした。

$ pamtester sudo steve authenticate
Password: 
pamtester: successfully authenticated

sudo が何らかの形で pam 出力を上書きまたは妨害しているようです。sudo がこれを行う必要があるのはなぜでしょうか? 出力が通過するように sudo の動作を変更できますか?

答え1

sudo を実行し、GDB を使用してバックトレースを行いました。パンくずをたどっていくと、PAM 出力の防止が sudo にハードコードされていることがわかりました。

バックトレース:

#13 pam_auth.c:34 の pam_authenticate (pamh=0x56373c553960、flags=flags@entry=32768) の 0x00007f9879eba7e0
#14 sudo_pam_verify の 0x00007f987a3510de (pw=、prompt=0x56373c553d00 "[sudo] steve のパスワード: "、auth=、callback=0x7ffea8406880)
    auth/pam.c:182 で
#15 0x00007f987a35052c が verify_user にあります (pw=0x56373c54ce98、プロンプト=prompt@entry=0x56373c553d00 "[sudo] steve のパスワード: "、検証済み=validated@entry=2、コールバック=callback@entry=0x7ffea8406880)、auth/sudo_auth.c:294
#16 0x00007f987a3520e5 が check_user (auth_pw=0x56373c54ce98、mode=、validated=2) にあります (./check.c:149)
#17 0x00007f987a3520e5 が check_user (validated=validated@entry=2, mode=) にあります (./check.c:212)
#18 0x00007f987a36506d が sudoers_policy_main にあります (argc=argc@entry=1、argv=argv@entry=0x7ffea8406cf0、pwflag=pwflag@entry=0、env_add=env_add@entry=0x56373c5414f0、closure=closure@entry=0x7ffea84069f0)、./sudoers.c:423
#19 sudoers_policy_check の 0x00007f987a35eca4 (argc=1、argv=0x7ffea8406cf0、env_add=0x56373c5414f0、command_infop=0x7ffea8406a80、argv_out=0x7ffea8406a88、user_env_out=0x7ffea8406a90)、./policy.c:758
#20 0x000056373aee448f がメインにあります (plugin=0x56373b102480、user_env_out=0x7ffea8406a90、argv_out=0x7ffea8406a88、command_info=0x7ffea8406a80、env_add=0x56373c5414f0、argv=0x7ffea8406cf0、argc=1) ./sudo.c:1342
#21 0x000056373aee448f が main (argc=, argv=, envp=) にあります (./sudo.c:261)

auth/pam.c の 181 行目から 182 行目で、出力を防ぐために PAM_SILENT フラグを指定して pam_authenticate が呼び出されていることがわかりました。

    /* PAM_SILENT は認証サービスが出力を生成しないようにします。 */
    *pam_status = pam_authenticate(pamh、PAM_SILENT);

関連情報