Shutdown via Webinterface

In diesem Forum können Wünsche geschrieben werden, die sich Benutzer für zukünftige OrderSprinter-Versionen wünschen.
Benutzeravatar
PCFreak
Beiträge: 18
Registriert: Di 12. Jun 2018, 17:30
Wohnort: Bayern

Shutdown via Webinterface

Beitrag von PCFreak »

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

Code: Alles auswählen

sudo visudo
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
pichel
Administrator
Beiträge: 1467
Registriert: So 13. Sep 2015, 19:48
Wohnort: Hamburg
Kontaktdaten:

Re: Shutdown via Webinterface

Beitrag von pichel »

Hallo Peter,

vielen Dank für deinen Einsatz!

Du hast natürlich vollkommen Recht, dass das nicht State-of-the-art ist und man es besser per sudoers umsetzen sollte. Allerdings halte ich die Gefahr trotzdem gering, wenn ich mir so überlege, in welchen Szenarien das ausgenutzt werden kann.

Aber ja, ich sollte es ändern. Genau wie einige andere Security-relevante Stellen, die mir bekannt sind und bei denen mir auch die Zeit fehlt, das anzufassen. Ganz konkret:
- Backups verschlüsseln (gerade bei Sicherung auf USB-Stick per Nightly-Job relevant, denn der ist schnell mal abgezogen oder vergessen)
- Backups ohne enthaltene Passwörter für Email usw. anlegen können - falls mir Benutzer etwas zuschicken wollen.
- OpenSSL ersetzen - bringt nur Probleme im Windows-Umfeld und hat sowieso ständig mit Bugs zu kämpfen. Da gibt es mittlerweile bessere Alternativen.
- und noch vieles mehr...

Aber mir fehlt schlicht die Zeit...

Viele Grüße,

Stefan
Stefan Pichel
Entwickler der Kassensoftware OrderSprinter (http://www.ordersprinter.de)
Antworten