
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);