27 Apr 2010

Apache Webserver unter Debian Lenny: suexec neu kompilieren

Wenn man aus irgendeinem Grunde suexec verwenden muss, z. B. weil einem Confixx das vorschreibt, und Mailman verwenden will, ist man etwas angepisst. Die Sicherheitsmodelle von Apache und Mailman laufen auseinander, es ist basteln angesagt.

Hier die Apache-Config in /etc/apache2/sites-enabeld/001-mailman

Directory /usr/lib/cgi-bin/mailman/>
    AllowOverride None
    Options ExecCGI
    AddHandler cgi-script .cgi
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/lib/mailman/archives/public/>
    Options Indexes FollowSymlinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /usr/share/images/mailman/>
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

ScriptAlias /cgi-bin/mailman/ /usr/lib/cgi-bin/mailman/
Alias /pipermail/ /var/lib/mailman/archives/public/
Alias /images/mailman/ /usr/share/images/mailman/

<VirtualHost xx.xx.xx.xx:80>

ServerName mailverteiler.mymailservice.de

SuexecUserGroup list list

DocumentRoot /usr/lib/cgi-bin/mailman/
ErrorLog /var/log/apache2/lists-error.log
CustomLog /var/log/apache2/lists-access.log combined

<Directory /var/lib/mailman/archives/>
    Options Indexes FollowSymLinks
    AllowOverride None
</Directory>

Alias /pipermail/ /var/lib/mailman/archives/public/
Alias /images/mailman/ /usr/share/images/mailman/
ScriptAlias /admin /usr/lib/cgi-bin/mailman/admin
ScriptAlias /admindb /usr/lib/cgi-bin/mailman/admindb
ScriptAlias /confirm /usr/lib/cgi-bin/mailman/confirm
ScriptAlias /create /usr/lib/cgi-bin/mailman/create
ScriptAlias /edithtml /usr/lib/cgi-bin/mailman/edithtml
ScriptAlias /listinfo /usr/lib/cgi-bin/mailman/listinfo
ScriptAlias /options /usr/lib/cgi-bin/mailman/options
ScriptAlias /private /usr/lib/cgi-bin/mailman/private
ScriptAlias /rmlist /usr/lib/cgi-bin/mailman/rmlist
ScriptAlias /roster /usr/lib/cgi-bin/mailman/roster
ScriptAlias /subscribe /usr/lib/cgi-bin/mailman/subscribe
ScriptAlias /mailman/ /usr/lib/cgi-bin/mailman/
</VirtualHost>

Das Problem ist die notwendige Anweisung

SuexecUserGroup list list

Der Benutzer list ist auf einem Debian-System unter der UID 100 angesiedelt, und deshalb blockiert suexec die Ausführung der Skripts, wie man an /var/log/ apache2/suexec.log sehen kann. Die Lösung für mich war es, suexec neu zu kompilieren mit den von mir gewünschten Optionen. Eine andere Möglichkeit hat man fast nicht, da alles aus Sicherheitsgründen fest einkompiliert ist. Los gehts! Development-Packages holen, Source holen und vorkonfigurieren auf dem “Debian-Weg”

apt-get install debhelper dpatch lsb-release libaprutil1-dev libapr1-dev libpcre3-dev sharutils
apt-get source apache2-sueexec
cd /usr/local/src/apache2-2.2.9
./configure
cd support/

suexec.h editieren, gewünschte Veränderungen anbringen an den richtigen Stellen anbringen:

o103:# vi suexec.h

#define AP_HTTPD_USER "www-data"
#define AP_UID_MIN 10
#define AP_GID_MIN 10
#define AP_LOG_EXEC  "/var/log/apache2/suexec_log"
#define AP_DOC_ROOT "/home/www"

nun suexec.c editieren, ein Leerzeichen im Kommentar einfügen, nur um sicherzustellen, dass neu kompiliert wird. Wenn gewünscht, können hier noch die weiteren Sicherheitschecks verändert werden. suexec jetzt kompilieren:

o103:# make suexec

/usr/share/apr-1.0/build/libtool --silent --mode=compile i486-linux-gnu-gcc -pthread  
  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE    
  -I/usr/local/src/apache2-2.2.9/srclib/pcre -I. -I/usr/local/src/apache2-2.2.9/os/unix -I/usr/local/src/apache2-2.2.9/server/mpm/prefork
  -I/usr/local/src/apache2-2.2.9/modules/http -I/usr/local/src/apache2-2.2.9/modules/filters 
  -I/usr/local/src/apache2-2.2.9/modules/proxy -I/usr/local/src/apache2-2.2.9/include 
  -I/usr/local/src/apache2-2.2.9/modules/generators -I/usr/local/src/apache2-2.2.9/modules/mappers
  -I/usr/local/src/apache2-2.2.9/modules/database -I/usr/include/apr-1.0 -I/usr/include/postgresql 
  -I/usr/include/mysql -I/usr/local/src/apache2-2.2.9/modules/proxy/../generators
  -I/usr/local/src/apache2-2.2.9/modules/ssl -I/usr/local/src/apache2-2.2.9/modules/dav/main  -prefer-non-pic -static -c suexec.c && touch suexec.lo
  /usr/share/apr-1.0/build/libtool --silent --mode=link i486-linux-gnu-gcc -pthread        -o suexec suexec.lo

o103:#

suexec installieren:

o103:# cp suexec /usr/lib/apache2/

suexec testen:

o103:# /usr/lib/apache2/suexec -V
 -D AP_DOC_ROOT="/home/www"
 -D AP_GID_MIN=10
 -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=10
 -D AP_USERDIR_SUFFIX="public_html"

Jetzt noch die Berechtigungen von /usr/lib/cgi-bin/mailman rekursiv richtig setzen (Besiter:Gruppe list:list, nicht gruppen-geschreibbar, kein SUID-Bit), und schon ist man dem Erfolg etwas näher. Bei mir hat es dann endlich funktioniert. Wenn nicht, dann Log-Files /var/log/apache2/suexec_log lesen. Deshalb sollte man beim expliziten Kompilieren diesen Pfad auch zwangsweise richtig setzen, sonst kann man lange im Dunklen tappen.

Nachteil: funktioniert nur bis zum nächsten Apache-Update. Aber da man jetzt ja weiß, wie der Fehler zustande kommt, kann man sich jetzt ja einen passenden Weg auch hierfür überlegen.