
Sudo 중에 인증이 실패하면 메시지를 표시하고 싶은 CentOS 7 시스템이 있습니다. 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_authenticate의 0x00007f9879eba7e0(pamh=0x56373c553960, flags=flags@entry=32768) pam_auth.c:34 sudo_pam_verify의 #14 0x00007f987a3510de (pw=, 프롬프트=0x56373c553d00 "[sudo] 스티브의 비밀번호: ", auth=, callback=0x7ffea8406880) auth/pam.c:182에서 auth/sudo_auth에서 verify_user의 0x00007f987a35052c (pw=0x56373c54ce98, 프롬프트=prompt@entry=0x56373c553d00 "[sudo] steve의 비밀번호: ", verifyd=validated@entry=2, callback=callback@entry=0x7ffea8406880) .c: 294 #16 check_user의 0x00007f987a3520e5(auth_pw=0x56373c54ce98, 모드=, 유효성 검사=2) at ./check.c:149 #17 ./check.c:212의 check_user(validated=validated@entry=2, 모드=)의 0x00007f987a3520e5 sudoers_policy_main의 #18 0x00007f987a36506d(argc=argc@entry=1, argv=argv@entry=0x7ffea8406cf0, pwflag=pwflag@entry=0, env_add=env_add@entry=0x56373c5414f0, closure=closure@entry=0x7ffea8 4069f0) ./sudoers에서 .c:423 sudoers_policy_check의 #19 0x00007f987a35eca4(argc=1, argv=0x7ffea8406cf0, env_add=0x56373c5414f0, command_infop=0x7ffea8406a80, argv_out=0x7ffea8406a88, user_env_out=0x7ffea8) 406a90) ./policy.c:758 메인의 #20 0x000056373aee448f (플러그인=0x56373b102480 , user_env_out=0x7ffea8406a90, argv_out=0x7ffea8406a88, command_info=0x7ffea8406a80, env_add=0x56373c5414f0, 0x7ffea8406cf0, argc=1) ./sudo.c:1342 #21 ./sudo.c:261의 메인(argc=, argv=, envp=)에 있는 0x000056373aee448f
auth/pam.c의 181-182행에서 pam_authenticate가 출력을 방지하기 위해 PAM_SILENT 플래그와 함께 호출되는 것을 발견했습니다.
/* PAM_SILENT는 인증 서비스가 출력을 생성하는 것을 방지합니다. */ *pam_status = pam_authenticate(pamh, PAM_SILENT);