Datum --set nicht zulässig für Benutzer www-data

1183
Nick

Ich betreibe einen lighttpd-Server unter Debian GNU / Linux 7.5 (wheezy) und möchte eine PHP-Webseite verwenden, um die Systemzeit zu ändern (ich weiß, ich kann nur die Zeit der Seite ändern, aber das ist nicht das, was ich für dieses Projekt brauche). Im Moment verwende ich den exec()Befehl, um Befehle direkt auszugeben und einfach ein Shell-Skript auszuführen. Also entweder:

exec('date --set [HH:MM:SS]')

oder

exec("sh /full/file/path/updateTime.sh") //contains command 'date --set [HH:MM:SS]'

Wenn ich den Benutzer in der Befehlszeile auf www-data umschalte und versuche, den Date-Befehl auszuführen, erhalte ich die Antwort "Datum: Datum kann nicht festgelegt werden: Vorgang nicht zulässig."

Das Shell-Skript wird erfolgreich ausgeführt, wenn ich es als root ausführte.

Wenn ich ein zweites Argument vorlege exec(), um die Antwort zu speichern, enthält sie die Datums- / Uhrzeitinformationen, die ich versuche zu setzen.

Ich habe auch versucht, Sudoer zu bearbeiten

www-data ALL=(ALL:ALL) ALL 

unter user privilege specificationund includedir /etc/sudoers.dohne Veränderung. Ich habe auch versucht, eine Cmnd-Alias-Spezifikation für /bin/dateden www-data-Benutzer zu erstellen, ohne sie zu ändern.

Ich bin mit allem, was dazu gehört, ziemlich unerfahren, also wird jede Hilfe geschätzt.

Die Site ist nicht live, aber ich bin mir der Gefahren bewusst, die mit dem Akzeptieren von Shellbefehlen von Benutzern verbunden sind. Ich habe die php.iniDatei überprüft, um sicherzustellen, dass der exec()Befehl nicht deaktiviert ist. Ich habe versucht, den Besitz des Shell-Skripts /var/www/ohne Änderung an www-data zu übergeben. Die Berechtigungen sind jetzt auf 777 festgelegt.

0

2 Antworten auf die Frage

2
mt025

Wenn sich www-data in der sudoers-Datei befindet, würden Sie angeben, dass für den sudoBefehl kein Kennwort erforderlich ist, da www-data kein Kennwort eingeben kann.

Der Sudoers-Eintrag sollte sein www-data ALL=(ALL:ALL) NOPASSWD: ALL

Dann müssten Sie sudo date --set [HH:MM:SS]statt nur laufen date --set [HH:MM:SS].

www-data sollte niemals sudoRechte haben, es sei denn, Sie verwenden sie nur für Ihre persönliche Entwicklung auf einem Testserver. Dies ist eine große Sicherheitslücke.

Edit: Schauen Sie sich diese Frage an, die simalar sudo in php exec () ist.

Es wäre sicherer (wenn auch immer noch zu gefährlich für die "echte" Verwendung), wenn Sie die www-Daten auf "date --set" als root beschränken. Ich bin nicht sicher, ob ich die Sudoers-Syntax richtig verstehe, aber ich denke, es wäre "www-data ALL = (root) NOPASSWD: / bin / date --set" (und dann `exec ('/ usr) / bin / suro / bin / date --set [HH: MM: SS] ') `, obwohl Ihre Pfade etwas anders sein können). Gordon Davisson vor 7 Jahren 0
@GordonDavisson, warum muss ich den `/ usr / bin / sudo'-Teil hinzufügen, der dem Argument im` exec () `-Befehl hinzugefügt wurde? Ist es der Ort, an dem sich der Sudo-Befehl befindet (wieder lerne ich viel, wenn ich so traurig gehe, wenn das nach einer dummen Frage klingt)? Nick vor 7 Jahren 0
Das Hinzufügen von "--set" in sudoers verhinderte, dass www-data irgendetwas löste, aber es endete einfach mit "/ bin / date". Vielen Dank! Nick vor 7 Jahren 0
@ Nick: Ich denke nicht, dass es wirklich notwendig ist, den vollständigen Pfad zu `sudo` (oder` date`) anzugeben. Ich ziehe es vor, sie einzuschließen, falls das Skript mit einem komischen `PATH` läuft, der nicht beinhaltet die relevanten Verzeichnisse. Was die "--set" -Option betrifft, die Probleme verursacht: Möglicherweise müssen Sie angeben, dass ein anderes Argument zulässig ist, beispielsweise "/ bin / date --set *". Wenn Sie es jedoch deaktivieren, funktioniert das nicht das ist wesentlich weniger sicher. Gordon Davisson vor 7 Jahren 0
@GordonDavisson, stellt sich heraus, dass mein Fehler in "/ bin / date --set *" in Sudoers Anführungszeichen gesetzt hat. Ich bin nicht sicher, warum ich dachte, dass sie überhaupt dort sein sollten. Nick vor 7 Jahren 0
0
G-Man

Hier ist ein anderer Ansatz:

  • Erstellen Sie ein FIFO (Named Pipe) an einem angemessen sicheren Ort - jeder Ort, der nicht weltweit beschreibbar ist, sollte in Ordnung sein. 
  • Machen Sie es im Besitz von www-data, Modus 600. Oder 200 sollte funktionieren.
  • Jedes Mal, wenn die PHP-Anwendung die Systemzeit ändern möchte, muss sie die neue Uhrzeit in den FIFO schreiben.
  • Lassen Sie einen Daemon-Prozess, der als Root ausgeführt wird, aus dem FIFO lesen. Wenn eine korrekt formatierte Zeit gelesen wird, lassen Sie die Systemuhr einstellen.

Keine Notwendigkeit, sich damit zu beschäftigen sudo. Das Schlimmste, was passieren kann, wenn jemand in Ihr System einbricht, www-data weil er Zeitänderungen in den FIFO schreiben und den Daemon dazu veranlassen kann, die Zeit zu ändern. Es scheint fast unmöglich zu sein, dass der Angreifer seine Privilegien erhöhen kann root (es sei denn, Sie erstellen eine Sicherheitsanfälligkeit im Dämon).