Hallo,
die Shutdown-Funktion in der Datei
admin.php sollte meiner Meinung aus Sicherheitsaspekten geändert werden. Ich spreche von der Linux Variante. Derzeit sieht der betreffende Code-Teil so aus:
Code: Alles auswählen
private function shutdown() {
try {
if (substr(php_uname(), 0, 7) == "Windows"){
$comd = "shutdown /s /t 10";
pclose(popen("start /B ". $cmd, "r"));
}
else {
chmod("shutdown.bat", "700");
$cmd = "sh < shutdown.bat";
exec($cmd . " > /dev/null &");
}
echo json_encode(array("status" => "OK"));
} catch(Exception $e) {
echo json_encode(array("status" => "ERROR", "code" => ERROR_SCRIPT_NOT_EXECUTABLE, "msg" => ERROR_SCRIPT_NOT_EXECUTABLE_MSG));
}
}
Der Benutzer, unter dem der Webserver läuft (bei Ubuntu z.B.
www-data) muss bei dieser Implementierung
- Dateiberechtigungen ändern dürfen - chmod("shutdown.bat", "700");
- sh (eine vollwertige Shell !!) starten dürfen - $cmd = "sh < shutdown.bat";
Die Berechtigung eine Shell auszuführen ist meiner Meinung doch eine etwas zu hohe Berechtigung und Dateirechte verändern ebenso.
Ich gehe davon aus, dass man sowieso nur bei selbstgehosteten Varianten die Möglichkeit hat die Rechte des Benutzers www-data anzupassen, deshalb halte ich folgenden Ansatz für zielführender und sicherer:
- Benutzer www-data erlauben per sudo den Befehl shutdown (und nur diesen) auszuführen
- admin.php anpassen, den Befehl shutdown per sudo auszuführen
Ich habe das folgendermaßen gelöst:
Zunächst habe ich mit dem Befehl
die sudoers Datei geöffnet (obiger Befehl öffnet automatisch den Standard-Editor im Terminal und damit die sudoers Datei).
Ich habe dann folgende Zeilen am Ende der sudoers Datei angehängt:
Code: Alles auswählen
# Allow webserver to shutdown system
# so shutdown via ordersprinter website works
www-data ALL = NOPASSWD: /sbin/shutdown
In der admin.php steht nun bei mir folgender Code:
Code: Alles auswählen
private function shutdown() {
try {
if (substr(php_uname(), 0, 7) == "Windows"){
$comd = "shutdown /s /t 10";
pclose(popen("start /B ". $cmd, "r"));
}
else {
system("sudo shutdown 0");
}
echo json_encode(array("status" => "OK"));
} catch(Exception $e) {
echo json_encode(array("status" => "ERROR", "code" => ERROR_SCRIPT_NOT_EXECUTABLE, "msg" => ERROR_SCRIPT_NOT_EXECUTABLE_MSG));
}
}
Der Code funktioniert und der Benutzer www-data darf ausschließlich den Befehl /sbin/shutdown ausführen.
Meiner Meinung nach wesentlich sicherer und die Nutzung von sudo hat sich in modernen Linux-Distributionen eigentlich als Standard durchgesetzt.
Weiterhin könnte man das Webinterface erweitern, den Shutdown Befehl in verschiedenen Varianten auszuführen, z.B.
- ' shutdown -r now' für reboots
- shutdown zu bestimmter Uhrzeit
- usw.
Es wäre nett, wenn über diese Idee nachgedacht würde und sie vielleicht implementiert wird?
Ich könnte mir auch vorstellen, dass ggf. die Shutdown Funktion nicht mehr direkt in der admin.php steht sondern nur als include File eingebunden wird. Das hätte den Scharm, dass Änderungen im Bereich shutdown nur an dieser Include Datei vorgenommen werden müssten und diese könnte man dann bei Updates von Ordersprinter einfach in Ruhe lassen, sodass individualisierte Shutdown-Mechanismen weiterhin funktionieren auch wenn Ordersprinter aktualisiert wird/wurde.
Vielen Dank vorab
Gruß
Peter