Problem:
Z.B. bei einem Update von Apache wurde die suexec
(suexec2
) durch die von Apache mitgelieferte suexec
(suexec2
) ersetzt.
Danach funktioniert kein CGI-Script mehr, weil die neue suexec eine anderen Document-Root eingestellt hat.
(Betrifft vorallem Confixx- und Plesk-Anwender.)
Erklärung:
suexec
(suexec2
) wird zur Kompilierzeit mit dem Document-Root gefüttert und kann danach nicht mehr verändert werden. Dies ist ein wesentlicher Sicherheitsfaktor.
Lösung:
Wir kompilieren uns die suexec
(suexec2
) selber:
Dazu brauchen wir die installierte Apache Version und das passende Source-Packet.
(Letzteres entweder per apt oder rpm aus der entsprechenden Distribution installieren oder von apache.org ziehen.)
# Verzeichnis wechsel:
cd /usr/local/src/
# Download und auspacken:
wget http://archive.apache.org/dist/httpd/httpd-2.0.52.tar.gz
tar xzf httpd-2.0.52.tar.gz
cd httpd-2.0.52
# Konfiguration:
./configure
cd support
# Editor (Deiner Wahl) aufrufen:
edit suexec.h
#-> Diese Zeile suchen und DEFAULT_EXP_HTDOCSDIR mit dem gewünschten DocumentRoot ersetzen:
#define AP_DOC_ROOT DEFAULT_EXP_HTDOCSDIR
#-> Evtl. auch den std. User ändern:
#define AP_HTTPD_USER "www"
#-> Evtl. auch den Logfile-Pfad anpassen:
#define AP_LOG_EXEC "/var/log/apache2/suexec.log"
#-> In manchen hartnäckigen Fällen muß auch das USer-Dir angepasst werden:
#define AP_USERDIR_SUFFIX "html"
Wer Probleme mit Benutzerrechten hat (z.B. wenn man PHP5 unter Plesk als CGI installieren will), kommt anscheinend an folgenden Änderungen in der suexec.c
nicht vorbei:
/* * Error out if the target name/group is different from * the name/group of the cwd or the program. */ /* suexec ist doof if ((uid != dir_info.st_uid) || (gid != dir_info.st_gid) || (uid != prg_info.st_uid) || (gid != prg_info.st_gid)) { log_err("target uid/gid (%ld/%ld) mismatch " "with directory (%ld/%ld) or program (%ld/%ld)\n", uid, gid, dir_info.st_uid, dir_info.st_gid, prg_info.st_uid, prg_info.st_gid); exit(120); } */
# Compilieren: make suexec # Testen: suexec -V # Installieren: cp suexec /usr/sbin/suexec2 chmod 4755 /usr/sbin/suexec2
Ein Restart des Apache ist nicht nötig, da suexec
(suexec2
) bei jedem Request eines Scriptes neu gestartet wird.