Es begann mit dem üblichen Pendleralltag: dank dem üblichen Ärger mit der Bahn (ja wir haben doch angekündigt, dass ihr Zug etwas später kommt, da haben Sie jetzt kein Anrecht darauf, dass ihr Anschlusszug wartet oder Sie auf einen Schnellzug umsteigen dürfen) hatte ich also insgesamt über 3 Stunden Zeit eine Webanwendung auf meinem Laptop weiterzuentwickeln.

Abends dann den Projektordner noch schnell auf den Server hochgeladen. Fertig und ab ins Bett… wo ich dann angefangen habe zu grübeln:

Dateirechte?

Welche Dateirechte hatte ich nochmal in meiner lokalen Entwicklungsumgebung? Waren es wirklich die bösen 777 damit ich ohne große Konfigurationsprobleme die PHP-Dateien per Editor, Konsole und apache-Webserver ausführen/bearbeiten kann? Welche Rechte haben die denn jetzt auf dem Server?

Je nach Serverkonfiguration oder Uploadtool werden die Dateirechte beim Hochladen glücklicherweise korrigiert aber das ist nicht immer so!

Außerdem gibt es auch diverse Dateien, die nicht die Standardrechte haben sollten. Dazu gehört z.B. die configuration.php von Joomla!, die im für alle zugänglichen Dokument-Root liegt und z.B. das Passwort für den Zugang zur Datenbank im Klartext enthält. Oder auch .htaccess und ev. zugehörige Passwortdateien (auch wenn die eigentlich nicht im Dokument-Root liegen sollten. Hier muss man also nachkorrigieren!

Abhilfe:

Man kann natürlich seinen eigenen User dem Gruppe des Webservers zuweisen. Dann kann man die Berechtigungen so setzen, dass man auch lokal ohne zu freie Dateirechte auskommt. Außerdem sind die folgenden Befehle ganz nützlich:

find . -type d -exec chmod 0755 {}\;

Setzt die Rechte aller Verzeichnisse im aktuellen Verzeichnis auf 0755.

find . -type f -exec chmod 0644 {} \;

Setzt die Rechte aller normalen Dateien im aktuellen Verzeichnis auf 0644.

find . -name "configuration.php" -exec chmod 0600 {}\;

Setzt die Rechte aller configuration.php auf 600.

Gibt es nur die eine Datei, dann kann man die Rechte natürlich auch direkt setzen und braucht dafür nicht das komplette Verzeichnis inklusive Unterverzeichnisse mit find zu durchsuchen.

Habe ich auch die versteckten Dateien hochgeladen?

Schöne Urls via mod-rewrite, Schutz für Downloadverzeichnisse oder andere Verzeichnisse, Zugangskontrollen… .htaccess-Dateien sind fester Bestandteil von PHP-Anwendungen, die auf einem Unix-Server laufen. Da es sich hierbei um Steuerungsdateien handelt, gehören diese Dateien zu den versteckten Dateien und werden in der „normalen“ Dateiansicht ausgeblendet. Dies berücksichtigen auch eine Uploadtools und es braucht einen Extraklick oder einen Blick in die Einstellungen/Paramater um auch versteckte Dateien mit zu übertragen. Ansonnsten kann es sein, dass diverse Verzeichnisse plötzlich ungeschützt für jeden zugänglich sind.

Habe ich wirklich alle versteckten Dateien hochgeladen?

Viele Editoren legen Sicherheitskopien der gerade bearbeiteten Dateien an. Diese landen im selben Verzeichnis und unterscheiden sich vom Original nur durch eine angehängte Schlange (~), haben also normalerweise auch die gleichen Dateirechte. Diese Dateien gehören auch zu den versteckten Dateien und sind im Normalfall nicht ausgeblendet. Überträgt man jedoch komplette Verzeichniss inklusive der versteckten Dateien so landen ev. auch die Sicherungskopien auf dem Server.

Diese werden (je nach Servereinstellungen) nicht als PHP-Dateien geparsed (haben ja die Dateiendung .php~) und als Klartext ausgegeben. Und plötzlich hat man als User Zugriff auf den Quelltext aller PHP-Dateien in ungeschützten Verzeichnissen, die die „normalen“ Dateirechte haben. Dies gilt natürlich besonders für die oben erwähnte configuration.php von Joomla, die ja im Datei-Root liegt und somit (im Normalfall) nicht direkt per .htaccess geschützt werden kann.

Ansätze dies zu vermeiden gibt s an den unterschiedlichsten Stellen.

  • Editor wechseln
  • Dem Editor verbieten Sicherheitskopien anzulegen bzw. diese in einen anderen Ordner legen lassen.
  • Dem Uploadtool verbieten Sicherheitskopien hochzuladen
  • Dem Server verbieten Sicherheitskopien auszuliefern
  • Dem User verbieten Sicherheitskopien aufzurufen
  • Alle Verzeichnisse schützen oder mit entsprechend restriktiven Dateirechten versehen
  • Per Befehl alle Sicherheitskopien vorm Upload löschen lassen

find . -name "*~" -exec rm -f {} \;

Löscht alle Dateien, die mit „~“ enden im aktuellen Verzeichnis.