방금 VPS에 Fedora 22를 설치했고 간단한 작업을 수행하려고 합니다. pam_exec를 통해 모든 SSH 로그인에서 정보 스크립트를 실행합니다. 하지만 예상치 못한 어려움에 부딪혔습니다. pam_exec가 종료 코드 13으로 실패했습니다.
/etc/pam.d/sshd 끝에 사용자 지정 줄을 추가했습니다.
session optional pam_exec.so seteuid /usr/local/bin/loginformer.py
물론 loginformer.py에는 실행 플래그가 있습니다:
$ ls -l /usr/local/bin/loginformer.py
-rwxr-xr-x. 1 root root 4254 Jun 8 09:35 /usr/local/bin/loginformer.py
그러나 여기에는 고통스러운 발췌문이 있습니다 journalctl -lb SYSLOG_FACILITY=10
.
Jun 08 11:58:49 fedora22 sshd[671]: pam_exec(sshd:session): execve(/usr/local/bin/loginformer.py,...) failed: Permission denied
Jun 08 11:58:49 fedora22 sshd[663]: pam_exec(sshd:session): /usr/local/bin/loginformer.py failed: exit code 13
항상 내 ArchLinux에서 실행되기 때문에 무슨 일이 일어나고 있는지 잘 모르겠습니다. 나는 이것이 SELinux 제한일지도 모른다고 생각하지만 확실하지 않습니다.
내가 뭘 잘못했나요?
고쳐 쓰다
글쎄요, SELinux를 깊이있게 이해하고 스크립트를 변경해야 하는 SELinux 컨텍스트를 이해하려고 노력했습니다.
이제 SELinux 컨텍스트는 다음과 같습니다.
$ ls -Z /usr/local/bin/loginformer.py
unconfined_u:object_r:user_home_t:s0 /usr/local/bin/loginformer.py
그런데 스크립트에 어떤 컨텍스트를 설정해야 합니까?
업데이트 2
또한 SELinux AVC 로그는 문제를 감지하는 데 매우 유용할 수 있다고 생각합니다. 더 일찍 주지 못해서 미안해요.
cat /var/log/audit/audit.log | grep loginformer.py
동일한 문자열을 많이 반환합니다.
type=AVC msg=audit(1433784991.570:265): avc: denied { execute } for pid=7866 comm="sshd" name="loginfomer.py" dev="vda1" ino=11924 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
답변1
pam_exec
및 pam_selinux
호출되는 순서가 중요합니다. 매뉴얼 페이지pam_selinux
노트:
PAM 스택에 pam_selinux를 추가하면 애플리케이션을 실행하는 다른 PAM 모듈의 동작이 중단될 수 있습니다. 이를 방지하려면pam_selinux.so 열기PAM 스택에서 해당 모듈 뒤에 배치되어야 하며, pam_selinux.so 닫기그것은 그들 앞에 놓여져야 한다. 그러한 배치가 불가능할 때,pam_selinux.so 복구원래 보안 컨텍스트를 임시로 복원하는 데 사용할 수 있습니다.
비슷하게,댄 월시가 썼다.주제에 대하여:
pam_mount와 같이 사용자가 실행할 수 없는 명령을 실행하기 위해 pam_module을 추가하려면 이를 추가해야 합니다.앞으로pam_selinux.so 열기 명령. 사용자가 실행할 수 있는 명령을 실행하기 위해 pam_module을 추가하는 경우 다음이 필요할 수 있습니다.뒤쪽에pam_selinux.so가 라인을 엽니다.
또한 스크립트의 현재 보안 컨텍스트는 user_home_t
기본 정책과 호환되지 않을 수 있습니다(파일 이동 시 파일 컨텍스트가 유지됩니다. 홈 디렉터리에 파일을 생성한 경우 파일을 이동하면 원래 컨텍스트가 유지됩니다). 아마도 기본 bin_t
컨텍스트를 사용해야 할 것입니다. 기본 컨텍스트를 복원하려면 다음을 수행하십시오.
restorecon /usr/local/bin/loginformer.py
스크립트가 너무 특별한 작업을 수행하지 않는 경우 컨텍스트 앞에 배치 pam_exec
하고 pam_selinux
다시 문자열을 지정하면 문제를 해결하기에 충분합니다.