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.