open_basedir und suphp

xwsnet

New Member
Hallo,
ich habe vor einiger Zeit suPHP auf meinem ISPConfig Server installiert. Jetzt ist einem aus meinem Team aufgefallen, dass man mit einem php Script die Config Files und andere Dateien aus anderen Webordnern auslesen kann.
Das wird ja sonst mit dem Safe Mode verhindert.

Ist es möglich "automatisiert" für alle User open_basedir einzustellen auf den entsprechenden WebXX Ordner?

Oder muss ich dafür für jeden User eine eigene php.ini erstellen?

mfg
 

planet_fox

Super-Moderator
Ja aber man könnte doch ISPConfig so konfigurieren das er nen Ordner anlegt
mit sagen wir mal PHP darin einmal PHP5.ini und PHP4.ini erstellt. Dann kann man für die alle Standard einstellen.Für speziele sachen wie regiosters global etc muss man selbst hand anlegen
 

Till

Administrator
Ja aber man könnte doch ISPConfig so konfigurieren das er nen Ordner anlegt
mit sagen wir mal PHP darin einmal PHP5.ini und PHP4.ini erstellt. Dann kann man für die alle Standard einstellen.Für speziele sachen wie regiosters global etc muss man selbst hand anlegen

Ja, das ist sicherlich eine gute Sache. Ich habe auf einem meiner Server auch ein SuPHP Setup mit angepasster php.ini und hab mich schon über das manualle anlegen geärgert. Ich werde das mal in den Bugtracker als Feature request mit aufnehmen.
 

planet_fox

Super-Moderator
Schön das wir den selben gedanken gang haben, das Feature kann man dann auch übern nen optionsbutton ein und auschalten, aber das wern dann eh eine sache für ISP3. Wenn ISP3 raus ist wird dann an der 2er Genaration nichts ausser Sicherheitslücken behoben oder ?
 

xwsnet

New Member
Ich hatte mir das schon so überlegt, einen Ordner zu erstellen in sagen wir /root/ispconfig/phpini/, der dann die php.ini´s beherbergt. Jede individuelle php.ini heißt dann webID_php.ini.
Dann hat man die alle zusammen, da ich auch nicht möchte, dass meine Kunden auf die php.ini direkt zugreifen können.

Jetzt muss ich das nur wahrscheinlich manuell für die 300-400 Kunden anlegen. Schade... Ich hatte gehofft es gäbe schon jemanden, der dafür eine automatisierung erstellt hat.

mfg

p.s. wir es denn ein Update von ISPC2 auf ISPC3 geben? Oder sind die untereinander incompatibel?
 

sqrt

New Member
Hallo!

Ich häng' mich einfach mal an diesen Thread hier dran.

Seit ein paar Tagen teste ich ISPconfig auf einem Debian Etch-System und bin soweit schon sehr zufrieden damit. Ein Lob an dieser Stelle an die Entwickler!

Nach diesem HowTo habe ich suPHP mit ISPConfig zum Laufen gebracht und bin dabei auch über die 'open_basedir'-Problematik gestolpert. Mein Lösungsansatz dafür sieht so aus:

Ich habe ein Script als Wrapper erstellt:

/usr/local/bin/php5-wrapper:
#!/bin/sh
/usr/bin/php5-cgi -d open_basedir=$DOCUMENT_ROOT

Und in der Datei /etc/suphp.conf dann folgenden Eintrag geändert:
;Handler for php-scripts
;x-httpd-php=php:/usr/bin/php5-cgi
x-httpd-php=php:/usr/local/bin/php5-wrapper

Ein Aufruf von phpinfo() in verschiedenen Webs zeigt, das die Einstellung von 'open_basedir ' übernommen wurde. Auch ein paar Testscripts, um auf Dateien außerhalb zuzugreifen bleiben an der Einstellung hängen. Soweit scheint auf dem Testsystem alles zu klappen. Von den Experten hier irgendwelche Einwände oder Anmerkungen? Ich erspare mir so die php.ini für jeden User. Das Wrapper-Script kann man natürlich noch etwas weiter anpassen, wenn man noch mehr machen möchte.

Aber wie gesagt, ich kenne ISPConfig erst seit ein paar Tagen und experimentiere noch damit rum...


Gruß,
Andreas
 

xwsnet

New Member
Geile Idee...
Ich warte jetzt nochmal ne runde, bis einer der Entwickler was dazu gesagt hat und werde dann das mal ausprobieren. Denn für alle Webs die php.ini zu erstellen ist doch sehr mühsam...
 

sqrt

New Member
Wie gesagt... auf meinem Testsystem läuft es soweit ohne Probleme. Obiges Beispiel-Wrapper-Script ist extra mal ganz simpel gehalten. Bei Übergabe der kompletten DOCUMENT_ROOT-Variablen wird dann open_basedir auf z.B. den Wert '/var/www/webX/web' gesetzt. Das ist wahrscheinlich vielen zu restriktiv. Folgendes Wrapper-Script erlaubt auch Zugriffe nach '/var/www/webX':

/usr/local/bin/php5-wrapper:
#!/bin/sh
BASEDIR=`/usr/bin/dirname ${DOCUMENT_ROOT}`
/usr/bin/php5-cgi -d open_basedir=$BASEDIR

Ist vielleicht etwas angenehmer, da man so z.B. Konfigurationsdateien etc. außerhalb des DocumentRoot ablegen kann, auf die man aber mit PHP noch zugreifen kann. Ist aber Geschmackssache bzw. eine Frage der eingesetzten Software.

Würde mich freuen, wenn mein Lösungsvorschlag irgendwie bei der Problematik hilft. Dann muss ich nicht weiter suchen... :D

Schön ist natürlich, dass man dem php5-cgi-Binary über den Parameter '-d' noch viele andere Konfigurationsoptionen übergeben kann.

--
Gruß,
Andreas
 

sqrt

New Member
Ich sehe auch noch kein wirkliches Problem bei der Vorgehensweise. Auf meinem Testsystem gibt es keinerlei Auffälligkeiten. Anfang nächsten Jahres werd' ich dann aber wohl auch den Produktiv-Test machen können auf einem System mit etwa 400-500 VirtualHosts. Aber ich habe keine Bedenken, das sich der Ansatz von der Performance her merklich zum normalen PHP-CGI-Verfahren unterscheiden wird.

Man sollte aber wohl drauf achten, dass das neue Wrapper-Script vernünftige Rechte besitzt um sich darüber kein Sicherheitsproblem zu schaffen. Auch weiß ich nicht, in wie weit man allen Umgebungsvariablen trauen kann, die der Apache beim Start des Scripts setzt. Ich denke, DOCUMENT_ROOT z.B. ist eher unkritisch, da es direkt aus der VirtualHost-Konfiguration genommen wird. Aber Inhalte aus Variablen zu verarbeiten, die der Client selber beeinflussen kann sollte man vielleicht wenn möglich vermeiden. Oder bin ich wieder zu paranoid? ;)
 

HarWee

New Member
Ich habe den Wrapper getestet, und es Funktioniert ganz gut. Außer das dadurch Datei- Uploads nicht mehr funktionieren.
Hab folgendes im php5-wrapper geändert:

#!/bin/sh
BASEDIR=`/usr/bin/dirname ${DOCUMENT_ROOT}`
/usr/bin/php5-cgi -d open_basedir=$BASEDIR -d upload_tmp_dir=$BASEDIR/phptmp
 
Zuletzt bearbeitet:

sqrt

New Member
Ja, das wäre jetzt auch mein Vorschlag gewesen. Wie weiter oben im Thread schon erwähnt kann man über den Wrapper-Ansatz beliebige Variablen aus der php.ini setzen. So z.B. auch den Session-Save-Path. Das hat dann auch den Vorteil, das die temporären Session-Dateien nicht alle in einem großen Ordner rumfliegen sondern nach Usern getrennt...

#!/bin/sh

BASEDIR=`/usr/bin/dirname ${DOCUMENT_ROOT}`
TMPDIR=${BASEDIR}/phptmp
SESSDIR=${TMPDIR}

/usr/bin/php5-cgi -d open_basedir=${BASEDIR} -d upload_tmp_dir=${TMPDIR} -d session.save_path=${SESSDIR}

Netterweise wird ja von ispConfig schon ein phptmp-Verzeichnis angelegt. Dann sollte man das auch nutzen.

Wer lieber das alte Verhalten beibehalten möchte und für alles /tmp nutzen will, der kann auch den Pfad /tmp zusätzlich an die Variable open_basedir anhängen:


Das kann man sehr flexibel handhaben... :cool:
 

xwsnet

New Member
Ich habe zu dem Script nochmal eine Frage. Und zwar wenn ich BASEDIR=`/usr/bin/dirname ${DOCUMENT_ROOT}` schreibe, muss ich dann statt /usr/bin/dirname das Verzeichniss angeben, in dem die Webs gespeichert sind? Oder soll das so bleiben?

Denn ich würde das gerne einsetzen, wenn das Script auch bei anderen läuft...

Danke schon mal für die Hilfe :)
 

sqrt

New Member

sollte etwas mehr Klarheit darüber, was der Befehl macht, schaffen. ;-)

Kurz: Dieser Befehl interpretiert den übergebenen Parameter (im obigen Beispiel den Inhalt der Variablen DOCUMENT_ROOT) als Pfadangabe und schneidet den hinteren Teil weg, so daß nur noch das Verzeichnis übrigbleibt, in dem sich die Datei, auf die sich der übergebene Pfad bezieht, befindet. :cool:
 

xwsnet

New Member
So, ich hab das jetzt einmal ausprobiert, und wenn ich für das Wrapper-Script das folgende einsetze:

#!/bin/sh

BASEDIR=`/usr/bin/dirname ${DOCUMENT_ROOT}`
TMPDIR=${BASEDIR}/phptmp
SESSDIR=${TMPDIR}

/usr/bin/php5-cgi -d open_basedir=${BASEDIR} -d upload_tmp_dir=${TMPDIR} -d session.save_path=${SESSDIR}


dann kommt folgender Fehler:

Internal Server Error

Could not execute script "/var/www/web10/web/index.php"
suPHP 0.6.2

Was mache ich falsch???
 

Werbung

Top