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.

Kategorien:

Stichwörter:

Apache · suexec · suexec2 · kompilieren · compilieren ·