mod_auth_mysql in Apache2 (openSuSE 11.1)
Geschrieben von: Michael Loth   
Sonntag, den 15. März 2009 um 00:00 Uhr

Für eine neues Projekt benötigte ich das Apache-Modul mod_auth_mysql. Dieses ist jedoch nicht Bestandteil des auf dem betreffenden System installierten openSUSE 11.1. Also hatte ich kurzerhand die aktuellen Quellen heruntergeladen und versucht, diese wie in dem Sourcetree enthaltenen BUILD-Datei beschrieben zu übersetzen. Das dort aufgeführte Beispiel, auch Lib- und Include-Verzeichnisse mitzugeben ist gar nicht so falsch - da unser Zielsystem jedoch ein 64bit-System installiert hat, liegt die libmysqlclient natürlich vom Beispiel abweichend in /usr/lib64/mysql. Und Da wir natürlich kein apxs sondern ein apxs2 (das openSUSE 11.1 liefert Apache2 2.2.10 mit) zur Verfügung haben, ist der korrekte und vollständige Aufruf zum übersetzen:

# apxs2 -c -L/usr/lib64/mysql -I/usr/include/mysql -lmysqlclient mod_auth_mysql.c

Daraufhin eine relativ lange Liste mit Fehlern:

mod_auth_mysql.c:591: warning: implicit declaration of function 'APR_XtOffsetOf'
mod_auth_mysql.c:591: error: expected expression before 'mysql_auth_config_rec'
mod_auth_mysql.c:591: warning: cast to pointer from integer of different size
mod_auth_mysql.c:591: error: initializer element is not constant
mod_auth_mysql.c:591: error: (near initialization for 'mysql_auth_cmds[0].cmd_data')
[...]

Da dies der einzige Fehler war und diese mit schöner Regelmäßigkeit in jedem Aufruf der Funktion APX_XtOffsetOf vorkam, habe ich gar nicht erst versucht die C-Quelle zu analysieren.

Bereits der erste Treffer bei Goggle mit dem Suchbegriff  "mod_auth_mysql APR_XtOffsetOf" lieferte die passende Lösung.

Die dort beschriebenen Änderungen hatte ich sofort übernommen - und siehe da, keine Fehler mehr. Modul erfolgreich übersetzt - Modul installiert:

# apxs2 -i mod_auth_mysql.la

Nun noch das Modul in den Apache2 integrieren. Dazu die Datei /etc/sysconfig/apache2 editieren und die Zeile APACHE_MODULES="..." durch das Modul "auth_mysql" erweitern - aber bitte VOR allen anderen Modulen, damit sichergestellt ist, das nicht evtl. eine der anderen geladenen Authentifizierungsmethoden vorher  greifen und ein Login schon vorher in's Leere läuft weil auth_mysql überhaupt nicht mehr zum Anwendung kommt. Im Anschluss dann mit  "rcapache2 restart" den Apache-Prozess neu gestartet, damit dieser das neue Modul lädt. Kaum zu glauben, aber auch im Webbrowser zeigt die URL http://www.mein-server.de/server-info?mod_auth_mysql.c das Modul ist tatsächlich erfolgreich geladen.

Wie das neue Modul zu konfigurieren ist, kann man hier nachlesen.

Hier ein einfaches Beispiel welches ich verwende, um die Location /server-info abzusichern:

                <Location /server-info>
                        SetHandler server-info

                        AuthName                "Server-Information"
                        AuthType                Basic
                        AuthMySQLHost           localhost
                        AuthMySQLDB             isp
                        AuthMySQLUser           dbuser
                        AuthMySQLPassword       XXXXXX
                        AuthMySQLUserTable      htpasswd
                        AuthMySQLEnable         On
                        AuthMySQLNameField      user_name
                        AuthMySQLPasswordField  user_passwd
                        AuthMySQLNoPasswd       Off
                        AuthMySQLPwEncryption   crypt
                        AuthMySQLGroupTable     htgroup
                        AuthMySQLGroupField     user_group
                        AuthMySQLAuthoritative  On
                        require group admin
                </Location>