SELinux, Nginx 및 fcgiWrap: fcgiWrap 소켓에 대한 액세스를 허용하는 방법은 무엇입니까?

SELinux, Nginx 및 fcgiWrap: fcgiWrap 소켓에 대한 액세스를 허용하는 방법은 무엇입니까?

저는 적용 모드(정책: 대상 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가 제한되지 않은 서비스와 상호 작용하도록 하는 것이 덜 안전하지만 훨씬 쉽습니다.

관련 정보