selinux는 pam_exec 명령 실행을 방지합니다.

selinux는 pam_exec 명령 실행을 방지합니다.

나는 사용자가 로그인할 때마다(ssh, gdm 또는 tty를 통해) 나에게 알리도록 컴퓨터를 설정하려고 합니다. 이제 sshd를 설정하고 다음에 추가합니다 /etc/pam.d/sshd.

session optional pam_exec.so /etc/pam_scripts/notify.sh

어떤 이유로 명령이 실패하더라도 여전히 ssh를 통해 로그인하고 싶기 때문에 이것은 선택 사항입니다.

첫째: 이 줄을 배치했습니다.뒤쪽에 pam_selinux close그리고앞으로 pam_selinux open, 처럼여기에 제안됨.

whoami스크립트에 a를 배치하고 실행 , I can see that the command is run as루트를 기록하면 구체적으로 다음과 같습니다.

uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:sshd_t:s0-s0:c0.c1023

문제는 로그를 보면 selinux가 curl내부에서 사용되는 스크립트의 실행을 차단한다는 것을 알 수 있다는 것입니다.

AVC avc:  denied  { name_connect } for  pid=1810 comm="curl" dest=443 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket permissive=0

내 스크립트에는 다음 태그가 있습니다.

unconfined_u:object_r:etc_t:s0

Change context를 사용해 보았지만 chcon항상 권한이 거부되었습니다(루트를 사용해도). 그래서 아마도 제가 완전히 이해하지 못하는 일을 하고 있는 것 같습니다.

그런데, 나는 또한 seteuidpam 규칙을 사용해 보았지만 아무것도 바뀌지 않았습니다.

일반적으로 selinux가 실행 액세스 권한을 부여하는 데 필요한 스크립트 컨텍스트를 결정하는 방법을 이해하지 못합니다.

또한 스크립트는 잘 실행되지만 selinux는 컬을 중지하므로 이는 스크립트 자체보다 컬과 더 관련이 있는 것 같습니다.

이 문제를 어떻게 해결할 수 있나요?

답변1

이미 답을 찾았지만 이 문제를 해결하는 중이므로 후손을 위해 여기에 남겨 두겠습니다.


이러한 selinux 거부가 발생하면 이 audit2allow도구를 사용하여 해당 작업을 허용하는 업데이트된 selinux 정책을 생성할 수 있습니다. 먼저, selinux를 허용 모드로 전환할 수 있습니다:

setenforce 0

이제 로그인하여 PAM 구성이 예상대로 작동하는지 확인하세요. 우리는 그럴 가능성이 매우 높기 때문에 이렇게 합니다.추가의selinux는 첫 번째 이후에는 거부하고 허용 모드에서 실행하면 모두 기록됩니다.

이제 selinux를 다시 강제 모드로 전환할 수 있습니다.

setenforce 1

달리기 audit2allow -a. 그러면 다음과 같은 내용이 생성됩니다.

#============= sshd_t ==============

#!!!! This avc can be allowed using one of the these booleans:
#     authlogin_yubikey, nis_enabled
allow sshd_t http_port_t:tcp_socket name_connect;

내가 "좋아요"라고 말한 이유는 (a) 이전에 말했듯이 현재 PAM 구성과 관련된 다른 거부가 있을 수 있고, (b) 이 명령은 감사 로그의 모든 항목을 확인하므로 이전 거부 결과를 얻을 수 있기 때문입니다. 실제로 현재 문제와 관련이 없습니다.

이 경우 기존 selinux 부울 값을 설정하여 거부된 작업을 허용할 수 있음을 알 수 있습니다. 그것은 다음과 같습니다:

setsebool nis_enabled=1

이것이 당신에게 필요할 수도 있습니다. 또는 다음과 같이 selinux 정책에 대한 업데이트를 생성할 수 있습니다.

audit2allow -a -M local

그러면 새 정책 파일이 생성됩니다 local.pp. 다음 명령을 실행하여 활성화할 수 있습니다.

semodule -i local.pp

selinux 사용에 대한 좋은 정보가 있습니다.여기, 더 자세한 사용법 개요를 포함합니다 audit2allow.

답변2

글쎄요, 시간이 좀 걸렸지만 문제를 해결할 수 있었습니다. 내 문제는 훌륭한 기사를 읽은 후에도 selinux 규칙을 확인하는 방법을 모른다는 것입니다.젠투 SELinux 튜토리얼다음을 사용하여 규칙을 쿼리하는 방법을 알아냈습니다 sesearch.

# sesearch --allow -s sshd_t -t unreserved_port_t -c tcp_socket -p name_connect

이 경우 알림 스크립트를 알려진 포트에서 임의의 포트로 전환했기 때문에 감사 로그에서 보고된 대상 unresolved_port_t대신 대상 유형으로 http_port_t검색했습니다 .

목록에는 다음과 같은 규칙이 있습니다.

allow sshd_t unreserved_port_t:tcp_socket name_connect; [ nis_enabled ]:True

이는 허용되지만 boolean 의 영향을 받으며 nis_enabled실제로 내 시스템에서는 (검사에 의해 getsebool -a | grep nis_enable) 비활성화되어 있습니다.

이 규칙을 한 번 활성화 했는데 setsebool nis_enabled on지금은 제대로 작동하고 있습니다.

관련 정보