open_basedir oder der Zugriff auf außerhalb des Apache DocumentRoot

Die open_basedir Problematik

Um zum Beispiel Konfigurationsdateien einer PHP Installation vor allzu neugierigen Blicken zu schützen, kann es ratsam sein, eben diese sensitiven Daten außerhalb des Dokumenten-Roots abzulegen. Damit ein Skript auf diese ausgelagerten Daten zugreifen kann, bedarf es der PHP.ini Direktive open_basedir.

Wenn beim ausführen eines Scriptes die Meldung „open_basedir restriction in effect“ erscheint, dann ist man ebenso davon betroffen und kann mit der nachfolgenden Lösung dieses Problem lösen.

Die open_basedir begrenzt den Zugriff auf Dateien auf einen bestimmten Ordner, die von PHP geöffnet werden, inklusive der darin enthaltenen Unterordner. Diese Direktive ist wirksam, EGAL, ob Safe Mode an oder aus ist. Wenn ein PHP Skript versucht, eine Datei zu öffnen, so wird der Speicherort der Datei geprüft ob dieser im Verzeichnisbaum, in der open_basedir Deklaration hinterlegt ist. Falls nicht, wird PHP die Datei nicht öffnen.

Wir wollen nun, für ein PHP Skript, den Zugang auf das Verzeichnis config gewähren, welches außerhalb unseres Dokument-Root (DocumentRoot) liegt und in welchem wir die Passwörter für den Zugriff auf die SQL Datenbank ablegen möchten.

Die verwendeten Programme

Die folgenden Zutaten (Programme) werden benötigt:

  • Editor zum erstellen der Konfigurationsdatei (z.B. Notepad++)
  • FTP Client zum (sicheren) übertragen der erstellten Datei (z.B. WinSCP)
  • Telnet Client – Konsole auf Kommandozeilenebene (z.B. PuTTY)

Das nachfolgende Rezept wurde unter SuSE Linux 10.x und CenOS 5.x unter Verwendung von Plesk Panel 8,9 und 10.x erfolgreich getestet.

Hinweis: Sichern Sie Ihre Daten unbedingt vor dem durchführen der nachfolgenden Anleitung. Der Autor übernimmt keine Haftung für eventuellen entstehenden Datenverlust.

So wird’s gemacht

  1. Verzeichnis erstellen
    Als erstes erstellen wir das Verzeichnis, auf das wir außerhalb des Dokumenten-Verzeichnisses zugreifen wollen. Wir starten WinSCP und wechseln in den Ordner in dem sich das physikalische Hosting befindet.Unter SuSE Linux 10.x ist das der Ordner /srv/www/vhosts/domain-name.com/ wobei wir domain-name.com durch den jeweils echten domain-namen ersetzen.Unter CenOS 5.x ist es der Ordner /var/www/vhosts/domain-name.com/ Bitte passen Sie in den weiteren Zeilen die jeweiligen Ordner /usr oder /var dem Ihrem OS entsprechend an.Hier erstellen wir den den Ordner config und setzen die Berechtigung auf 777. Somit ist gewährleistet, dass wir auch später mit einem FTP-Programm unter dem jeweiligen Benutzer-Kontext auf die Datei zugreifen können.
  2. Erstellen der Konfigurationsdatei die die Direktive enthält
    Mit dem Editor unserer Wahl erstellen wir eine neue Datei und speichern diese unter dem Namen vhost.conf lokal auf unserem Rechner ab und fügen den folgenden Inhalt in die Datei ein:

    <Directory /srv/www/vhosts/domain-name.com/httpdocs>

    php_admin_value open_basedir „/srv/www/vhosts/domain-name.com/httpdocs:/tmp:/srv/www/vhosts/domain-name.com/config“
    </Directory>

    Wir ersetzen domain-name.com durch den aktuellen Domain-Namen! Verzeichnisse werden durch einen Doppelpunkt (:) voneinander getrennt.Das einleitenden Directory Tag (<Directory …) spezifiziert das Verzeichnis, ab dem die Regel gelten soll. Der Variable php_admin_value open_basedir wird der Wert innerhalb der doppelten Anführungszeichen („) zugewiesen. Nach dem Doppelpunkt wird das Verzeichnis genannt. Zum Beispiel: /srv/www/vhosts/domain-name.com/config.
  3. Hochladen der vhost.conf Datei
    Mit Hilfe von WinSCP oder jedes anderen FTP Programms die zuvor erstellte Datei in das folgende Verzeichnis kopieren: /srv/www/vhosts/domain-name.com/conf/Achtung nicht in den Ordner config sondern conf! Dieser wird von Plesk erstellt und nimmt die Konfigurationseinstellungen je Hosting auf.
  4. Neuladen der Plesk Konfiguration
    Mit einem Telnet Client (PuTTY) am Server anmelden und auf der Kommandozeile den folgenden Befehl absenden:Plesk Version 8 und 9
    /usr/local/psa/admin/bin/websrvmng -a –v
    Plesk Version ab 10.x
    /usr/local/psa/admin/sbin/httpdmng –reconfigure-all (vor reconfigure 2x – !!! WordPress schneidet immer eines ab)
  5. Neustarten von Apache
    Nachdem einlesen der Konfigurationsdatei durch Plesk müssen wir nur noch den Apache Dienst neu starten und alles ist im Butter.
    Unter CentOS:
    /etc/init.d/httpd restart
    Unter SuSE Linux:
    /etc/init.d/apache2 restart 

    Neustarten des Apache httpd Dienst

Quellen

I get an „open_basedir“ error in PHP script. How can I fix it?
How to include domain-specific Apache configuration directives into web server configuration file?
Beschreibung der php.ini-Direktiven des Sprachkerns

Ein Gedanke zu „open_basedir oder der Zugriff auf außerhalb des Apache DocumentRoot

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*