Selinux blockiert Ping von PHP Exec

Selinux blockiert Ping von PHP Exec

Apache-Server mit Centos7. Ich versuche, einen Ping vom PHP-Befehl „exec“ auszuführen, erhalte aber die Meldung „Socket: Zugriff verweigert“. Es funktioniert mit deaktiviertem Selinux. Meine Linux-Kenntnisse sind etwas begrenzt, ich bin nicht sicher, wie ich das beheben kann.

Habe einige Richtlinienaktualisierungen in Selinux vorgenommen und Ping läuft jetzt, verursacht aber einen Paketverlust von 100 %, als ob die Ziel-IP nicht erreicht werden könnte, erreicht sie aber mit deaktiviertem Selinux.

Antwort1

Ich liebe es, wenn SELinux tatsächlich die schlechten Dinge erkennt. In diesem Fall

  1. exec: ja, ich kann verstehen, dass eine Serverkonfiguration allergisch auf ein PHP-Skript reagiert, das eine externe ausführbare Datei ausführt; klassischer Einstiegspunkt. Ich hoffe zumindest, dass Sie die Benutzereingaben nicht tatsächlich an eine Shell weitergeben!
  2. Wenn Sie wirklich eine ICMP-Anfrage („Ping“) durchführen müssen, müssen Sie der aufrufenden ausführbaren Datei (wahrscheinlich /usr/bin/php oder so) den ping_exec_tDateityp angeben.Dokumentation.

Alles in allem, wenn Sie ein unerfahrener Entwickler sind (das sind wir alle in gewisser Hinsicht!), ist es sehr wahrscheinlich, dass Sie etwas schreiben, dasGenau genommenSetzen Sie Ihren Server Remote-Ausführungsproblemen aus (die Verwendung execin PHP ist normalerweise ein wirklich großes Warnsignal, deshalb konfiguriert Ihr CentOS SELinux so, dass dies nicht möglich ist). Der Aufruf pingkann dadurch ersetzt werden, dass Sie direkt (z. B. eine TCP-)Verbindung zu dem Dienst herstellen, an dem Sie tatsächlich interessiert sind, und das sollten Sie, wenn möglich, wahrscheinlich auch tun.

Antwort2

Ich stimme Marcus Müller zu, dass Sie das wahrscheinlich nicht wollen. Aber das hier wird wahrscheinlich funktionieren:

Erstellen Sie eine Datei my-httpd-php-ping.teund fügen Sie Folgendes ein:

module my-httpd-php-ping 1.0;

require {
        type httpd_t;
        class capability { net_admin net_raw };
        class icmp_socket create;
        class rawip_socket { create getopt read setopt write };
}

#============= httpd_t ==============
allow httpd_t self:capability { net_admin net_raw };
allow httpd_t self:icmp_socket create;
allow httpd_t self:rawip_socket { create getopt read setopt write };

Kompilieren Sie es wie folgt in ein SELinux-Modul:

checkmodule -M -m -o my-httpd-php-ping.mod my-httpd-php-ping.te
semodule_package -o my-httpd-php-ping.pp -m my-httpd-php-ping.mod

Und installieren Sie es:

semodule -i my-httpd-php-ping.pp

Aktivieren Sie anschließend SELinux wieder:

setenforce 1

Ping sollte jetzt funktionieren. Wenn nicht, posten Sie die Ausgabe, ausearch -ts recent -m avc -iwie ich in meinem Kommentar gefragt habe.

verwandte Informationen