Frage von CaptTaifun, 73

Was ist die sicherste Methode einen Shell Befehl mit PHP auszuführen?

Einen schönen guten Morgen/Abend wünsche ich!

Meine Name ist Dominic Resch und meine Frage steht oben, allerdings möchte ich eben etwas genauer auf diese eingehen.

Folgende Problematik (Ich lasse die Hintergrundgeschichte mal weg, das würde nur zu sinnlosen Antworten und Diskussionen führen):

Ich arbeite zurzeit an einem Webinterface für diverse Server (zurzeit erstmal nur den TeamSpeak Server). Mit diesem Interface soll es möglich sein, diverse Befehle in der Bash auszuführen. Wir besitzen einen vServer auf dem natürlich alles nötige installiert ist.

Meine Frage:

Was ist nun die sicherste Methode, diese Problematik zu lösen? Ich habe mich selbstverständlich mal darüber schlau gemacht, jedoch kann ich mich nicht entscheiden.

Einerseits gibt es die Möglichkeit, per PHP über SSH zu connecten und dadurch Befehle ausführen zu lassen. Andererseits gibt es auch diverse Plugins um das Ganze zu lösen. ABER, und jetzt kommt das große aber: Ist das alles sicher ? Theoretisch könnte man alle Daten die an den Server geschickt werden mit einem MIM-Angriff abfangen, manipulieren und weiter schicken (oder sonst einem Angriff). Was ich mir deshalb überlegt habe ist: Ein kleines Bash-Script, welches durchgehend läuft, anhand einer Schleife natürlich, welche alle 10 Sekunden abfragt, ob eine bestimmte Datei vorhanden ist. Wenn sie vorhanden ist, führt das Script den Befehl aus (welcher natürlich im Script definiert ist, NICHT in PHP!). In PHP wird LEDIGLICH die Datei erstellt, wenn man auf einen Button drückt. Sie bekommt einen bestimmten Namen und das war's. Kein Inhalt, keine bestimmten Rechte, NICHTS. Das Bash-Script löscht (nach erfolgreicher Ausführung des Befehls) die von PHP erstellte Datei natürlich wieder (oder PHP selbst, muss ich noch schauen) und die Schleife startet wieder von neu.

Ist das nicht richtig sicher ? Klar, wenn alle 10 Sekunden eine Abfrage kommt, könnte man sich natürlich Gedanken wegen der Performance machen und so'n Schmarrn, gar keine Frage. Aber von der Sicherheit her, ist es doch die sicherste Methode oder irre ich mich da ?

Wenn ihr Vorschläge habt, welche ich nicht aufgezählt habe, sagt doch gerne Bescheid! Ich bin für jede Hilfe dankbar.

Mit freundlichen Grüßen

Dominic Resch

P.s.: Es handelt sich um einen Debian Server, einen Apache-Webserver mit PHP7.

Antwort
von mastema666, 25

Wenn ich das richtig verstanden habe was du erreichen willst, wie wäre es dann, wenn du ein Shell Script erstellst, in dem alle erlaubten Befehle enthalten sind, dann rufst du dieses Script in PHP via shell_exec() mit einem entsprechenden Parameter auf (z.B. shell_exec('/path/to/commands.sh start_ts'); um auf dem Server dann den Befehl zum starten von TS auszuführen, oder halt jeden beliebigen anderen Befehl. Welcher jeweils ausgeführt werden soll würde dann einfach anhand des übergebenen Parameters bestimmt, so könnten keine Befehle ausgeführt werden, die du nicht vorher explizit definiert hast). Vorteil wäre halt auch, dass du nicht dauernd irgendwas in einer Schleife laufen lassen musst (cron würde ja nicht reichen wenn du nur 10 Sek Intervalle willst) und die Befehle ohne Zeitverzögerung ausgeführt würden.

Kommentar von CaptTaifun ,

Tagchen, sorry für die späte Antwort, musste erstmal etwas Schlaf nachholen.

An genau DAS hab ich gedacht als ich mich ins Bett gelegt hatte. Das wäre wahrscheinlich die sinnvollste (wegen Performance) und sicherste (weil nur Befehle ausgeführt werden, welche deklariert sind) Variante die es gibt. Vielen Dank schon mal  jedenfalls!

Antwort
von BigBen38, 56

10 Sekunden im Netz sind doch wie 100 Jahre im RL !?

Kannst Du keine Adminabfrage einbauen, die es nur eingelogten Admins erlaubt, die Datei auszuführen ?

Ggfs via htaccess sperren ?

Kommentar von CaptTaifun ,

Selbstverständlich kann ich eine Adminabfrage einbauen (das wäre so oder so gemacht worden, ich bin ja nicht verrückt und mach keine rein..)

Nur ich kann nicht garantieren, dass mein Login-Script (welches ich zwar immer erweitere) auch sicher ist. Habe es schon gegen diverse Attacken abgesichert, zumindest in der Theorie, in der Praxis ist es bisher noch nicht geschehen (dreimal auf Holz klopfen).

Daher versuche ich, die sicherste Lösung zu finden, dieses Problem zu lösen. Bei der Schleife habe ich halt einen wesentlichen Vorteil: Es KANN keine Übergabeparameter geben! Klar, außer ich programmier es so, dass es welche geben kann. Aber DAS ist der wesentliche Punkt! Sobald ich bspw. Übergabeparameter zulasse, schieße ich mir ins eigene Bein. Ich weiß nach wie vor nicht wie sicher mein Login-Script ist und ich möchte nicht unbedingt etwas riskieren. Daher die Frage mit der Schleife. Es kann nur DAS ausgeführt werden, was ICH vorher definiert habe. Klar, wie gesagt, wenn ich dann mehrere solcher Schleifen habe, geht das auf die Performance und so weiter. Aber was wäre die SICHERSTE Alternative ? Auf gut Glück hoffen, dass mein Login-Script sicher ist, ist bestimmt nicht die sicherste Variante möchte ich meinen.

Mit freundlichen Grüßen

Dominic Resch

Kommentar von BigBen38 ,

Also wir hatten seinerzeit (Onlineshop) den Adminlogin mit einem in einer zweiten htaccess-Datei hinterlegten Loginnamen und Passwort (in einer dritten unsichtbaren Datei) gesichert.

Weder Login noch Passwort waren dabei sichtbar - die Paßwörter zudem verschlüsselt.

http://www.homepage-kosten.de/htaccess/

Kommentar von CaptTaifun ,

Ich glaube wir reden irgendwie aneinander vorbei.

Selbstverständlich könnte ich einen (eigentlichen) "Verzeichnisschutz" via .htaccess anwenden. Angenommen ich mache das jetzt, toll. Und nun? Jetzt habe ich ein "Login-System", wo sich genau EIN User einloggen kann (natürlich könnte ich den ganzen Spaß umschreiben, dass es mir vlt. möglich wäre, mehrere Nutzer "anzulegen"), welcher dann nicht mal auf der Website im Backend Bereich eingeloggt ist, sondern lediglich in ein gesperrtes Verzeichnis kommt, vorausgesetzt mit den richtigen Daten. Das selbe hätte ich auch mit meinem Login-Script. 

Und nun ? Schlauer bin ich daraus immer noch nicht geworden, was jetzt die sicherste Variante ist, einen Befehl über PHP auf dem Linux System auszuführen.

Kommentar von BigBen38 ,

Wir reden aneinander vorbei...ja

Und man kann beliebig viele User /Userpasswörter anlegen...

Die diversen Admins /Passwörter  müssen dabei ja auch nicht Personen zugeordnet werden, sondern durchaus auch unterschiedlichen Befehlen.

Eingelogt sind die Nutzer ja eh schon.

Nur - wenn ich Befehl A übermitteln will, dann ist der Befehl dadurch Passwortgeschützt, verschlüsselt und unsichtbar.

Aber vlt hab ich nur nicht verstanden was Du damit bezweckst ;-)

Kommentar von CaptTaifun ,

Jap, wir reden definitiv aneinander vorbei.

Sorry das ich mich jetzt erst melde, musste mal etwas Schlaf nachholen.

1. Wenn die Passwortdatei "unsichtbar" ist, wieso verschlüsselt man das Passwort denn dann ? Das widerspricht sich irgendwie, denn wenn etwas unsichtbar ist, braucht man es doch nicht verschlüsseln. Wenn es unsichtbar wäre, könnte man an das Passwort nicht kommen. De Facto wird es wohl eine (oder mehrere) Möglichkeit geben, an dieses Passwort zu kommen. Daher die Verschlüsselung für das "Unsichtbare" Passwort, andernfalls wäre es Schwachsinn, meiner Meinung nach. Somit, wenn meine Theorie stimmt, ist der Verzeichnisschutz nicht sicherer als mein Login-Script.

2. Jetzt erklär ich mal kurz weshalb wir aneinander vorbeireden.

Sie beschreiben mir diesen Weg:

User <----> SICHERHEIT --> PHP --> Server

Ich möchte aber diesen Weg:

User <----> PHP --> SICHERHEIT --> Server

Mir geht es nicht darum, die Ausführung des Befehls zu schützen. Nehmen wir an es soll kein Login Script oder .htaccess Datei geben (Was selbstverständlich sehr dumm wäre, wenn man den Server dazu auch noch verwendet aber nehme es als Beispiel). Was dann? Ich hoffe Sie verstehen worauf ich hinaus möchte. Ich will keine Tipps dazu, den Befehl an sich zu schützen. Ich will wissen was der sicherste weg ist, zwischen PHP und vServer zu kommunizieren. Darum geht's mir, das mit dem Login und dergleichen kann ich mir im Nachhinein auch noch überlegen. Mir gehts erstmal nur um den Weg von PHP zum Server, nichts anderes. Insofern reden wir aneinander vorbei. Dennoch Danke für die Tipps und dergleichen.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten