suphp + chroot() Support

Apache, Lighttpd, nginx, Cherokee
grandcat
Posts: 104
Joined: 2006-08-15 12:26
Location: Bayern

suphp + chroot() Support

Post by grandcat » 2006-12-21 22:53

Hallo zusammen :)

als Schnittstelle für PHP verwende ich momentan suPHP. Ich bin eigentlich ganz zufrieden, auch mit der Performanz, da es keinen "so" :wink: großen Ansturm auf meinen Webserver gibt. Da aber seit Version 0.6.1 chroot() als Zusatzfeature angeboten wird, wollte ich dies mal austesten (meine Version: 0.6.2). Nun gut, hat aber mal wieder nicht ganz so geklappt wie ich mir das vorgestellt habe :? Dabei habe ich mich etwas an diesen Beitrag http://www.redhat.com/archives/fedora-e ... 00930.html angelehnt, aber meine suPHP-Version nicht gepatcht und die dort genannten Vorteile damit beiseite liegen lassen.

Jetzt aber mal die Fehlermeldungen, mit denen ich konfrontiert werde:

Code: Select all

[Thu Dec 21 18:44:03 2006] [error] [client 89.11.11.11] SystemException in API_Linux.cpp:53: Could not stat "/var/webserver/var/www-web/gmg/httpdocs/gregori.php": No such file or directory
[Thu Dec 21 18:44:03 2006] [error] [client 89.11.11.11] Premature end of script headers: gregori.php
"/var/webserver/" ist hierbei das Verzeichnis, das durch suPHP gechrootet wird. Eintrag in der "suphp.conf": siehe unten!
Darin liegen halt die üblichen Verzeichnisse, die so auch auf einem Server liegen (=>gechrootet).

Libraries:

Diese habe ich mittels "ldd" dem PHP-Binary entlockt und nach "/var/webserver/lib64..." und "/var/webserver/usr/lib64..." kopiert, wie es sich halt gehört. Das PHP-Binary und die "php.ini" habe ich an die Stelle kopiert, an denen sie im richtigen System auch liegen (=>chrootet :!: )

Nun die suPHP-config:

Code: Select all

[global]
;Path to logfile
logfile=/var/log/suphp.log

;Loglevel
loglevel=info

;User Apache is running as
webserver_user=wwwrun

;Path all scripts have to be in
docroot=/var/webserver/var/www-web

;Path to chroot() to before executing script
chroot=/var/webserver

; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false

;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=true

;Send minor error messages to browser
errors_to_browser=false

;PATH environment variable
env_path=bin:/usr/bin

;Umask to set, specify in octal notation
umask=0077

; Minimum UID
min_uid=100

; Minimum GID
min_gid=100


[handlers]
;Handler for php-scripts
x-httpd-php=php:/var/webserver/home/php5/bin/php
"/var/webserver" bei "x-httpd-php=php" habe ich wieder angegeben, da wir uns ja in einer chroot()-Umgebung befinden.


Nun noch die Apachekonfiguration. Wer sich bis hier noch mit meinem eröffneten Thema auseinandersetzt, dem danke ich ganz herzlichst. Aber nun zur Konfiguration:

Code: Select all

<VirtualHost *:80>
    ServerAdmin admin@blubdieblub.de
    ServerName gmg.blubdieblub.de

    DocumentRoot /var/webserver/var/www-web/gmg/httpdocs

    
    ErrorLog /var/webserver/var/www-web/gmg/logs/errors.log
    CustomLog /var/webserver/var/www-web/gmg/logs/custom.log combined

    # don't loose time with IP address lookups
    HostnameLookups Off

    # needed for named virtual hosts
    UseCanonicalName Off

    # configures the footer on server-generated documents
    ServerSignature Off

suPHP_Engine on
    suPHP_ConfigPath /etc
    suPHP_UserGroup userblub groupblubi
    AddType application/x-httpd-php .php
    AddHandler x-httpd-php .php

    
    <Directory "/var/webserver/var/www-web/gmg/httpdocs">
        suPHP_AddHandler x-httpd-php
        AllowOverride None
        Options -FollowSymLinks +ExecCGI -Includes
        Order allow,deny
        Allow from all
    </Directory>
Hier ist ebenfalls diese seltsame Verzeichnisstruktur wegen des "chrootens()" :wink: vorhanden.

:arrow: Nun ja, wie schon oben erwähnt, stimmt da wohl was nicht :? , ich habe zwar schon viel herumprobiert, aber bis jetzt den Fehler nicht beheben können. Am Verzweifeln (wie viele immer sagen) bin ich allerdings noch nicht :roll: .

:arrow: Ich habe auch die Vermutung, dass das PHP Binary nicht den korrekten Pfad zur Datei erhält ( API_Linux.cpp:53: Could not stat....) und dadurch ins Wanken kommt.
Mit diesem chroot()-Feature blicke ich jedenfalls noch nicht ganz so durch, ich wäre aber sehr glücklich darüber, wenn mir jemand auf die Sprünge helfen oder zumindest eine Vermutung aufstellen könnte.

Also, schon mal vielen Dank im Voraus!

Opakatze

P.S.: Joyeux Noël et une bonne année :-D :o :) :wink:

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: suphp + chroot() Support

Post by Roger Wilco » 2006-12-21 23:01

Es scheint eher so, dass das Skript im Endeffekt unter /var/webserver/var/webserver/var/www-web (eben wegen dem chroot()-Call) gesucht wird. Der Apache übergibt anscheinend den gesamten Pfad zu dem Skript, der dann in der chroot-Umgebung anders lautet.

grandcat
Posts: 104
Joined: 2006-08-15 12:26
Location: Bayern

Re: suphp + chroot() Support

Post by grandcat » 2006-12-21 23:09

Vielen Dank schon mal für deine Antwort, Roger Wilco :)

Heißt das dann, dass ich "/var/webserver/var/webserver/var/www-web" als Verzeichnisstruktur anlegen soll und davon weiterhin nur /var/webserver/ chrooten soll? Wenn ich etwas falsch verstanden habe, korrigiere mich bitte :) Oder ist ein anderes Workaround nötig?

Übrigens: Dir wünsche ich auch schöne Weihnachten :wink:

grandcat
Posts: 104
Joined: 2006-08-15 12:26
Location: Bayern

Re: suphp + chroot() Support

Post by grandcat » 2006-12-22 20:22

Also, nach logischem Überlegen habe ich nun festgestellt, dass meine Überlegung nicht ganz stimmen kann.

Der Apache2 sagt also, dass ein Script z.B. in "/var/webserver/var/www-web/script.php" liegt. Nun ist ja suPHP schon unter "/var/webserver/" gechrootet. Folglich wird dann das Script, wie Roger Wilco schon geschrieben hat, tatsächlich in "/var/webserver/var/webserver/var/www-web/script.php" gesucht wird.

:arrow: Als Workaround bietet sich daher an, das Script in "/var/webserver/var/www-web/script.php", aber gleichzeitig auch in "/var/webserver/var/webserver/var/www-web/script.php" abzulegen. Ersteres ist hierbei für den Apache gedacht und zweiteres wird mit suPHP bearbeitet.

Allerdings gefällt mir diese Methode nicht so sehr. Auf http://www.redhat.com/archives/fedora-e ... 00930.html wird zwar ein (inoffizieller) Patch angeboten, aber der scheint mir nicht ganz so sicher. Naja, dann werde ich die Sache doch lieber sein lassen mit dem chroot() oder ich setze gleich den kompletten Apache2 dort hinein :)

Oder weiß von Euch noch jemand eine Möglichkeit? :wink:

EDIT:

Hab es jetzt mal so ausprobiert. Funktioniert allerdings wieder nicht, aber es gibt noch eine andere Fehlermeldung:

Code: Select all

[Fri Dec 22 20:32:05 2006] [error] [client 89.11.11.11] Premature end of script headers: gregori.php
[Fri Dec 22 21:00:12 2006] [error] [client 89.11.11.11] terminate called after throwing an instance of 'suPHP::LookupException'