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
- 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. - 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. - 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. - 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)
- 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
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
Als Chefkoch arbeite ich als Systemadministrator und Programmierer. Hier blogge ich über Joomla, Magento, WordPress und Windows. In meiner Freizeit fotografiere ich viel, fahre mit meiner Yamaha XT660R oder Jogge durch die Gegend.
Ein Gedanke zu „open_basedir oder der Zugriff auf außerhalb des Apache DocumentRoot“