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
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!- 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_t
Dateityp 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 exec
in PHP ist normalerweise ein wirklich großes Warnsignal, deshalb konfiguriert Ihr CentOS SELinux so, dass dies nicht möglich ist). Der Aufruf ping
kann 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.te
und 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 -i
wie ich in meinem Kommentar gefragt habe.