Webserver: Userdir

Problem: suexec will ein Subdir des Homverzeichnisses eines Users als dessen Webverzeichnis, default ist public_html. Unsere Webverzeichnisse heissen aber web-docs und liegen unter /www/username/ . Das Umbiegen des Webservers auf ein anderes als das normale User-Homeverzeichnis geht mit mod_userdir. Allerdings kann suexec nur *einfache* mod_userdir - Anweisungen verstehen, d.h. wohl insbesondere keine Platzhalter fuer den Usernamen.

Andere Moeglichkeit: Auf dem Webserver hat der User ein Homeverzeichnis, hinter dem sich tatsaechlich /www/Username verbirgt. Dieses Verzeichnis enthaelt aber nicht sein tatsaechliches Homeverzeichnis (es liegt auch lokal auf einer Partition des Webservers). Stattdessen gibt es darin nur das Verzeichnis public_html, in dem die Webseiten des Users liegen.

Bsp: Der User troth hat ein /misc-Filesystem. Fuer suexec muss also das Verzeichnis mit den Webseiten von troth unter /misc/troth liegen. Dazu wird die autofs.misc veraendert:
troth           rw,tcp,soft,    ...     ,retrans=10 lxwww02:/www/&

Wenn nun im Verzeichnis lxwww02:/www/troth das Unterverzeichnis public_html existiert und keine anderweitige Angabe in mod_userdir steht, findet der Webserver unter http://lxwww02.gsi.de/~troth dieses Verzeichnis.

Damit der User seine Webseiten wie gewohnt unter /u/Username/web-docs findet, muss die /etc/autofs/autofs.www Eintraege bekommen wie z.B.
troth      -soft,ro,bg,intr,  ...   ,nosuid    www-linux:/www/troth/public_html
Auf dem /u-Fileserver muss der Link /u/Username/web-docs dann auf /WWW/Username verweisen.

Webserver: Userdir und suExec

Laut Apache-Docu zu suexec, all suEXEC requests must remain within either a top-level document root for virtual host requests, or one top-level personal document root for userdir requests

Wir setzen die DocumentRoot fuer lxwww02.gsi.de auf /www/lxwww02 Als UserDir ist /www/*/public_html angegeben. Ein Skript unter /www/troth/pulic_html/skript.cgi kann dann nicht ausgefuehrt werden, weil

command not in docroot (/www/rz/troth/public_html/skript.cgi)

Zunaechst liegt der Schluss nahe, dass es sich bei docroot um DocumentRoot handelt und das Skript nicht ausgefuehrt wird, weil es nicht unter /www/lxwww02/ liegt.

Liegt das Skript in /www/lxwww02/thomas/skript.cgi, so wird ein Teil davon, der in der Ausgabe einiger Variablen besteht, ausgefuehrt. Das Skript soll allerdings auch einen Touch auf ein Datei ausfuehren, was nicht geschieht: /var/log/apache2/error.log : Permission denied Bezeichnenderweise ist in /var/log/apache2/suedxec.log von diesem Skriptversuch nichts zu sehen! Der Touch auf die Datei funktioniert, wenn Verzeichnis und Skript dem ApacheUser gehoeren. Letzteres ist natuerlich Standard, ersteres ist wohl auch verstaendlich, da hier der Request nicht ueber eine UserDir-Direktive abgewickelt wird (dazu muesste sowas wie ~troth in der URL vorkommen). suexec nimmt also nicht etwa den Besitzer von Verzeichnis und Skript als target user an. Vielmehr gibt es vermutlich hierfuer die Direktive SuexecUserGroup, die dort angegebenen UID/GID sind dann generell fuer das Ausfuehren der Skripte verantwortlich.

Was ist also unter one top-level personal document root for userdir requests zu verstehen? Es ist zu erwarten, dass ein 0815-Serverlayout keine derartigen Probleme verursacht. Dabei wird ein Apache laufen, dem mit DocumentRoot=SomeDir sein Hauptverzeichnis zugewiesen wird, die UserDir sind einfach /home/*/public_html bzw ~/public_html. Dann befindet sich aus Sicht des Dateisystems das Userdirectory nicht unterhalb von DocumentRoot.

Eine Moeglichkeit, warum es dennoch hier mit DocumentRoot=/www/lxwww02 und UserDir=/www/*/public_html nicht klappt, koennte sein, dass es sich bei lxwww02 um einen VirtualHost handelt. Um das zu pruefen und eventuell auch den Fall eines one top-level personal document root for userdir requests zu erschlagen, wird in /etc/apache2/apache2.conf ein weiteres DocumentRoot=/www eingefuegt. Das ist voellig erfolglos. Weiterhin behauptet suexec, das Skript sei nicht im docroot. Das aendert sich auch nicht, wenn ganz auf VirtualHosts verzichtet wird und alle Direktiven direkt in der apache2.conf stehen. Damit wird wohl auch die Annahme hinfaellig, dass das Problem irgendwie mit den unterschiedlichen Verzeichnissen /www/lxwww02 und /www/rz/troth/public_html/ in Verbindung steht.

Verzichtet man auf VirtualHosts und aktiviert auch nicht die userdir.conf (Loeschen des Links in /etc/apache2/mods_enabled), so funktioniert das Ausfuehren des Skripts inklusive Anlegen der Datei, also als User troth.rz. Entsprechend sieht die Meldung in /var/log/apache2/suexec.log aus. Allerdings kann dann keine Stelle im Dateisystem gefunden werden, die als einkompiliertes DocumentRoot fuer den dann eben nicht weiter konfigurierten Webserver lxwww02.gsi.de dient. In dieser Variante sind also nur die Seiten lxwww02.gsi.de/~Username verfuegbar, Seiten a la lxwww02.gsi.de/index.html dagegen nicht.

In der Apache-Docu steht zum Begriff docroot

--with-suexec-docroot=DIR Define as the DocumentRoot set for Apache. This will be the only hierarchy (aside from UserDirs) that can be used for suEXEC behavior. The default directory is the --datadir value with the suffix "/htdocs"

--datadir ist eine Konfigurationsoption fuer Apache selbst. Default ist PREFIX/share Mit Hilfe von phpinfo() laesst sich in Erfahrung bringen, dass PREFIX = /usr. Es ergibt sich also ein suexec-docroot von /usr/share/htdocs/. Umbiegen aller DocumentRoot - und UserDir - Direktiven bringt wieder die Fehlermeldung wie oben. Immerhin fuehrt

UserDir /usr/share/htdocs/*/public_html

dazu, dass suexec beim Aufruf von http://lxwww02.gsi.de/~troth/sgribd.cgi dann tatsaechlich nach /usr/share/htdocs/troth/public_html/sgribd.cgi sucht, was aber angeblich auch nicht im docroot liegt. Es scheint also, als wuerde suexec bei einer Frage nach ~Username die angegeben UserDir-Direktive beachten, trotz des * in der Angabe des Verzeichnisses.

Folglich sind weder das Serverlayout noch irgendwelchen unbekannten einkompilierten Parameter fuer das Problem verantwortlich.

Webserver: suExec 3. Tag

Offenbar funktioniert die Direktive Directory /www/*/public_html nicht in dem Sinne, dass die darin angegebenen Optionen Anwendung finden, wenn auf lxwww02.gsi.de/~troth zugegriffen wird.

Vom Dateisystem her ist das fragliche Verzeichnis (troth/public_html) zwar gerade identisch mit /www/troth/pulic_html, aber die Angabe UserDir /www/*/public_html greift nicht.

Setzt man UserDir auf public_html, so kann sich die Directory-Direktive natuerlich nicht fuer die Skripte im User-Homeverzeichnis zustaendig fuehlen, denn diese ist ja dann /misc/troth oder aehnliches. Da ausserdem fuer letztere Verzeichnisse keine weiteren Direktiven existieren, insbesondere die Option ExecCGI nicht gesetzt ist, kann auch kein Skript ausgefuehrt werden.

Daraus ergibt sich eine Variante, die tatsaechlich auch funktioniert: In der Konfiguration des VirtualHost wird in einem IfModule mod_userdir.c - Block das Userdir auf public_html gesetzt und die fuer die Userverzeichnisse noetigen Optionen in zwei Direktiven fuer /misc/*/public_html und /u/*/public_html:

<IfModule mod_userdir.c>
        UserDir public_html
        <Directory /misc/*/public_html>
                AllowOverride FileInfo AuthConfig Limit
                Options MultiViews Indexes FollowSymLinks +ExecCGI
        </Directory>
        <Directory /u/*/public_html>
                AllowOverride FileInfo AuthConfig Limit
                Options MultiViews Indexes FollowSymLinks +ExecCGI
        </Directory>
</IfModule>

Voraussetzung fuer dieses Verfahren ist natuerlich eine entsprechend manipulierte autofs.misc bzw. autofs.u speziell fuer die lxwww02.

Webserver: suExec Finale (?)

In einer Zuschrift einer Mailingliste steht endlich die eine Kommandozeilenoption, die das sucexec - Binary dazu veranlasst zu reagieren: /usr/lib/apache2/suexec2 -V gibt die lang gesuchten einkompilierten Parameter von suexec aus:
lxwww02:/# /usr/lib/apache2/suexec2 -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="www-data"
 -D AP_LOG_EXEC="/var/log/apache2/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"

Damit muessen also alle von suexec zu behandelnden Verzeichnisse unterhalb von /var/www/ liegen. Natuerlich sollten die cgi-bin - Verzeichnisse der verschiedenen VirtualHosts unterhalb des DocumentRoot derselben liegen. Also mounten wir einfach die bisherige /www - Partition nach /var/www (man koennte zusaetzlich einen Link /www => /var/www setzen und in den Konfigurationen stat /var/www nur /www verwenden, ist aber wohl nicht noetig).

Der User, der (statt in seinem $HOME/public_html) in einem VirtualHost ein Skript ausfuehren darf, also z.B. lxwww02.gsi.de/cgi-bin/skript.cgi, wird per SuexecUserGroup in der Konfiguration fuer den VirtualHost angegeben.

-- ThomasRoth - 9 Jan 2006 - 10 Jan 2006 - 11 Jan 2006 - 12 Jan 2006
Topic revision: r4 - 2006-03-15, ThomasRoth
 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding GSI Wiki? Send feedback
Imprint (in German)
Privacy Policy (in German)