나는 사용자가 로그인할 때마다(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
항상 권한이 거부되었습니다(루트를 사용해도). 그래서 아마도 제가 완전히 이해하지 못하는 일을 하고 있는 것 같습니다.
그런데, 나는 또한 seteuid
pam 규칙을 사용해 보았지만 아무것도 바뀌지 않았습니다.
일반적으로 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
지금은 제대로 작동하고 있습니다.