SELinux, Nginx und fcgiWrap: Wie erlaube ich den Zugriff auf den fcgiWrap-Socket?

SELinux, Nginx und fcgiWrap: Wie erlaube ich den Zugriff auf den fcgiWrap-Socket?

Ich verwende Fedora 31 (Linux-Kernel 5.4.13, Nginx 1.16.1, fcgiwrap 1.1.0) mit SELinux im Durchsetzungsmodus (Richtlinie: Ziel ist 3.14.4-44.fc31).

Auf meiner Box läuft ein Server, der von Nginx betrieben wird. Ein Teil davon basiert auf Perl-Skripten. Nginx wurde so konfiguriert, dass die CGI-Ausführung über FastCGI mit fcgiwrap erfolgt (Verbindung über einen Unix-Socket /var/run/fcgiwrap/[email geschützt]).

Alles wurde im „Permissive“-Modus getestet. Dann wurde in den „Enforcing“-Modus gewechselt. Ich habe eine Reihe von AVCs erhalten, die entweder durch Ändern von Booleschen Werten oder Erstellen benutzerdefinierter Richtlinien, wie in den Audit-Kommentaren vorgeschlagen, gehandhabt werden konnten.

Ein AVC kann jedoch nicht angesprochen werden. Das Journal berichtet:

 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

Die benutzerdefinierte Richtlinie enthält Folgendes:

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;

Wie aus den automatisch generierten Kommentaren hervorgeht, hat diese benutzerdefinierte Richtlinie keine Wirkung, da sie bereits in der globalen Richtlinie enthalten ist.

Nachdem ich dieses Modul hinzugefügt habe, ändert sich nichts. Ich erhalte weiterhin AVC-Warnmeldungen, die dieselbe Lösung vorschlagen.

Wenn ich auf "Permissive" zurückgreife oder die DomainhttpdIm permissiven Modus werden die CGI-Skripte ausgeführt und ich erhalte die erwartete Ausgabe.

ls -Z /var/run/fcgiwrap/fcgiwrap-0.sockkehrt zurück:

system_u:object_r:httpd_var_run_t:s0 /var/run/fcgiwrap/fcgiwrap-0.sock

Ich konnte nicht herausfinden, wo das Label httpd_var_run_tverwendet wurde und ob ein boolescher Wert den Zugriff auf diesen Dateityp steuerte (ich bin ein ziemlicher Neuling in Sachen SELinux-Konfiguration).

Wie kann ich im Modus „Enforcing“ Zugriff auf den Socket gewähren?

BEARBEITEN 27.01.2020

Es sieht so aus, als ob es im Modul bereits eine Übergangsregel gibtApachefür:

allow httpd_t unconfined_service_t:unix_stream_socket connectto;

aber es ist ineffektiv oder ein anderes Modul (welches?) blockiert es. Die vorübergehende Problemumgehung besteht darin, die Domänehttpdim permissiven Modus, aber das gefällt mir nicht, weil jeder Webserver jetzt alles tun darf.

Irgendeine Idee, warum der Übergang verweigert wird?

Antwort1

Ich habe dies nicht ausreichend geprüft oder getestet – tatsächlich bin ich ziemlich sicher, dass dies alleine nicht funktionieren wird.

Ich gehe davon aus, dass die Erstellung des Pfades /var/run/fcgiwrapden Verzeichnistyp hat unconfined_service_tund bin nicht sicher, ob das tatsächlich der Fall ist.

Dies sollte Ihnen jedoch einen ersten Eindruck verschaffen.

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)

Was die Netzwerkprobleme angeht, möchten Sie vielleicht einfach den Booleschen Wert einschalten, httpd_can_network_connectder einige davon bereits zum Schweigen bringen sollte. Es sei denn, Sie möchten es ganz genau wissen.

Unter den besten und idealsten Umständen wäre es ideal, eine Richtlinie speziell für Ihren FCGI-Prozess zu erstellen, aber das ist ein viel schwierigeres Unterfangen. Daher ist es viel einfacher, Nginx dazu zu bringen, nur mit unbegrenzten Diensten zu interagieren – obwohl dies weniger sicher ist.

verwandte Informationen