저는 적용 모드(정책: 대상 3.14.4-44.fc31)에서 SELinux를 실행하는 Fedora 31(linux 커널 5.4.13, Nginx 1.16.1, fcgiwrap 1.1.0)을 사용하고 있습니다.
내 상자는 Nginx로 구동되는 서버를 호스팅합니다. 그 중 일부는 Perl 스크립트에 의존합니다. Nginx는 fcgiwrap(Unix 소켓 /var/run/fcgiwrap/을 통한 연결)을 사용하여 FastCGI를 통해 CGI 실행을 넘겨주도록 구성되었습니다.[이메일 보호됨]).
모든 것이 "허용" 모드에서 테스트되었습니다. 그런 다음 "강제" 모드로 전환되었습니다. 감사 의견에서 제안한 대로 부울을 변경하거나 사용자 정의 정책을 생성하는 작업을 처리할 수 있는 여러 AVC를 받았습니다.
그러나 하나의 AVC를 처리할 수는 없습니다. 저널은 다음과 같이 말합니다.
type=AVC msg=audit(1580046727.459:548): avc: denied { connectto } for pid=4619 comm="nginx" path="/run/fcgiwrap/fcgiwrap-0.sock" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0
사용자 정의 정책에는 다음이 포함됩니다.
module nginx 1.0;
require {
type httpd_t;
type soundd_port_t;
type http_port_t;
type tor_port_t;
type unconfined_service_t;
type httpd_user_content_t;
class tcp_socket { name_bind name_connect };
class file { getattr read };
class unix_stream_socket connectto;
}
#============= httpd_t ==============
#!!!! This avc is allowed in the current policy
allow httpd_t http_port_t:tcp_socket name_connect;
#!!!! This avc is allowed in the current policy
allow httpd_t httpd_user_content_t:file { getattr read };
allow httpd_t soundd_port_t:tcp_socket name_bind;
#!!!! This avc is allowed in the current policy
allow httpd_t tor_port_t:tcp_socket name_connect;
allow httpd_t unconfined_service_t:unix_stream_socket connectto;
자동 생성된 설명에서 볼 수 있듯이 이 사용자 지정 정책은 이미 전역 정책에 포함되어 있으므로 아무런 효과가 없습니다.
이 모듈을 추가한 후에는 아무 것도 변경되지 않습니다. 동일한 수정 사항을 제안하는 AVC 경고가 계속 수신됩니다.
"허용"으로 되돌리거나 도메인을 설정하는 경우httpd허용 모드에서는 CGI 스크립트가 실행되고 예상된 출력이 수신됩니다.
ls -Z /var/run/fcgiwrap/fcgiwrap-0.sock
보고:
system_u:object_r:httpd_var_run_t:s0 /var/run/fcgiwrap/fcgiwrap-0.sock
나는 레이블이 사용된 위치와 이 파일 형식에 대한 부울 제어 액세스 여부를 찾을 수 없었습니다 httpd_var_run_t
(저는 SELinux 구성의 초보자입니다).
"적용" 모드에서 소켓에 대한 액세스 권한을 부여하려면 어떻게 해야 합니까?
2020-01-27 수정
모듈에 이미 전환 규칙이 있는 것 같습니다.아파치을 위한:
allow httpd_t unconfined_service_t:unix_stream_socket connectto;
하지만 효과가 없거나 다른 모듈(어떤 모듈?)이 이를 차단하고 있습니다. 임시 해결 방법은 도메인을 추가하는 것입니다.httpd허용 모드에서는 모든 웹 서버가 이제 무엇이든 할 수 있기 때문에 마음에 들지 않습니다.
전환이 거부된 이유를 아시나요?
답변1
나는 이것을 적절하게 확인하거나 테스트하지 않았습니다. 사실 이것만으로는 작동하지 않을 것이라고 확신합니다.
경로 생성에 /var/run/fcgiwrap
디렉터리 유형이 있다고 가정하고 unconfined_service_t
있는데 실제로 그런지는 확실하지 않습니다.
그러나 이렇게 하면 어딘가에서 시작할 수 있을 것입니다.
policy_module(nginx_local, 31.0.0)
require {
type httpd_t;
type unconfined_service_t;
}
stream_connect_pattern(httpd_t, unconfined_service_t, unconfined_service_t, unconfined_service_t)
httpd_can_network_connect
네트워킹 문제에 관해서는 이미 그 중 몇 가지를 침묵시키는 부울을 켜기를 원할 수도 있습니다 . 당신이 그것에 대해 구체적으로 찾고 있지 않는 한.
가장 좋고 이상적인 상황에서는 fcgi 프로세스에 특정한 정책을 만드는 것이 이상적이지만 이는 훨씬 더 어려운 작업이므로 nginx가 제한되지 않은 서비스와 상호 작용하도록 하는 것이 덜 안전하지만 훨씬 쉽습니다.