Achja, das ständig eine Wissenschaft und/oder Geheimnis aus allem gemacht werden muss...
Der TE möchte folgende Befehle über seine Webseite verwenden, für die er explizit root-Rechte benötigt:
halt
reboot
apt-get update
apt-get upgrade
Für eine Webseite kann man keine chroot Umgebung umsetzen - bzw ja oke, Goldwaagen-korrekt wäre das man es schon könnte, wäre aber völliger Schwachsinn...
Was macht man nun, damit diese root-Rechte-Befehle über eine Webseite trotzdem funktionieren?
2 Möglichkeiten:
- Die erste wäre die von mir bereits erwähnte Möglichkeit, ein Script zu erstellen, dieses eine Script über visudo zu erlauben und beim jeweiligen Aufruf das Script über sudo mit einem entsprechenden Paramter auszuführen.
-
/var/sudowebscript.sh
-
index.phpPHP
Alles anzeigen<?php session_start(); if (isset($_SESSION["username"])) { if (isset($_GET["page"]) AND $_GET["page"] == "4") { $halt = shell_exec('sudo /bin/bash /var/sudowebscript.sh pwroff'); } if (isset($_GET["page"]) AND $_GET["page"] == "2") { $reboot = shell_exec('sudo /bin/bash /var/sudowebscript.sh reb'); } if (isset($_GET["page"]) AND $_GET["page"] == "3") { $upgrade = shell_exec('sudo /bin/bash /var/sudowebscript.sh up-grade'); } ?> <html> <head> <title><?php include '../../include/title/name.php'; ?></title> <link rel='SHORTCUT ICON' href='../../img/itable.jpg'> </head> <body> <h1>Server</h1> <form action="index.php?page=4" method="post"> <input type="submit" value="Server herunterfahren" /> </form> <?php if (isset($halt)) { echo $halt."<br/>"; } ?> <br /> <br /> <form action="index.php?page=2" method="post"> <input type="submit" value="Server neustarten" /> </form> <?php if (isset($reboot)) { echo $reboot."<br/>"; } ?> <br /> <br /> <form action="index.php?page=3" method="post"> <input type="submit" value="Server aktualisieren" /> </form> <?php if (isset($upgrade)) { echo $upgrade."<br/>"; } ?> </body> </html> <?php } else { ?> Bitte erst anmelden, <a href="<?php include'include/link-login.php'; ?>">hier</a>. <?php } ?> [/php]..Ich habe hier bewusst die Befehle wie sie ans Script übergeben werden, etwas abgewandelt, damit es für Angreifer nicht zu offensichtlich und einfach ist.
-
/var/sudowebscript.sh
- Jeden einzelnen Befehl über visudo für den 'www-data' Benutzer eintragen:
- Die index.php so belassen wie es in Beitrag#12 bereits ist.
Hier lässt sich aber nicht weiter einschränken was an die Befehle übergeben wird, ein Angreifer könnte also auch Pakete über apt-get deinstallieren usw, und unter anderem deshalb ist diese Methode unsicherer.
Allgemein sei auch noch erwähnt das es besser wäre die Ausgabe von 'up-grade' sich ausgeben zu lassen, falls da etwas schief geht, und das ein wenig interactiver zu gestalten da es auch unter Linux nicht immer gut ist einfach 'blind' allem zuzustimmen.
Anstatt shell_exec(); sollte zudem lieber exec(); genutzt werden.
Siehe dazu auch: Sudo Befehle mit PHP absetzen