MySQL Authentifizierung Anstelle von .htaccess


skasdorf // 24.03.2009 17:09

Kategorie: Web-Server



Da ich mir dachte die .htaccess Dateien sind immer eine Qual, habe ich folgendes Konzept verwirklicht:
Zugriff auf ein Verzeichnis welches in der Apache Konfiguration enthalten ist, mit einem Passwort und Bentuzernamen zu schützen welches in einer MySQL Datenbank steht. Folgende Voraussetzungen sind dafür zu treffen:
 
Benötigte debian packete
apt-get install gcc apache2-threaded-dev apache2-dev libmysqlclient-dev patch
 
Nachdem die Module installiert sind können wir auch schon loslegen, die Packete können von folgenden Server mittels wget herunter geladen werden:
 
wget http://www.alllinux.de/apache2_mysql_auth/mod_auth_mysql-3.0.0.tar.gz
 
Dann noch die Patch Datei:
 
wget http://www.alllinux.de/apache2_mysql_auth/apache22.diff
 
als nächsten Schritt entpacken wir die mod_auth_mysql-3.0.0.tar.gz im Download Verzeichnis
 
tar xzf mod_auth_mysql-3.0.0.tar.gz
 
Die Datei apache22.diff wird dann noch in das neue Verzeichnis verschoben
 
mv apache22.diff mod_auth_mysql-3.0.0/
 
nun müssen wir das Modul in die Apache Shared librarys implementieren das geht folgendermaßen:
 
cd mod_auth_mysql-3.0.0
patch -p1 < apache22.diff
apxs2 -c -L/usr/lib/mysql -I/usr/include/mysql -lmysqlclient -lm -lz mod_auth_mysql.c
apxs2 -i mod_auth_mysql.la
 
Sollten die oben angeführten Schritte nicht korrekt abgehandelt werden, einfach nochmal überprüfen ob auch wirklich die development Packete für Apache2 und den MySQL-Client installiert sind, sollte dies nicht der Fall sein so muß es Nachgeholt werden und die oben angeführten commands neu ausgeführt werden.
 
Nun erstellen wir uns eine load Datei im /etc/apache2/modules/ Verzeichnis
 
echo "LoadModule mysql_auth_module  /usr/lib/apache2/modules/mod_auth_mysql.so" > /etc/apache2/mods-available/mod_auth_mysql.load
 
Diese muß nun noch verlinkt werden:
 
ln -s /etc/apache2/mods-available/mod_auth_mysql.load /etc/apache2/mods-enabled/mod_auth_mysql.load
 
Es wird eine MySQL Datenbank benötigt, ich habe dies wie folgt gemacht:
In die MySQl Console einloggen:
 
MySQL Vorbereitungen
mysql -uroot -p*****
 
Datenbank und Tabelle anlegen:
 
create database admin_users;
use admin_users;
CREATE TABLE `users` (
  `users_id` int(8) NOT NULL auto_increment,
  `users_login` varchar(255) NOT NULL,
  `users_password` varchar(255) NOT NULL,
  `users_active` int(11) NOT NULL default '1',
  PRIMARY KEY  (`users_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=0;
 
Diese kann nun mit Useren gefüllt werden die Zugriff auf ein bestimmtes Verzeichnis bekommen sollen.
z.b.
 
insert into users (users_login, users_password, users_active) values ("mein_user", MD5('mein_passwort'), 1);
 
Sollte man jetzt den Zugriff für einen bestimmten Benutzer vorübergehend deaktivieren wollen kann man das Feld users_active auf 0 setzten und schon kann dieser sich nicht mehr einloggen.
 
Als letzten Schritt benötigen wir noch die korrekten Einträge für den Apache2 Server diese können entweder in der Location  oder Directory Direktive angegeben werden. Eine Beispiel Konfiguration könnte etwa so aussehen:
 
 
     AuthName "Mein Authfenstername"   
     AuthType Basic 
     AuthBasicAuthoritative Off 
     AuthGroupFile /dev/null 
     AuthUserFile /dev/null 
     AuthMySQLEnable On 
     AuthMySQLHost localhost 
     AuthMySQLUser datenbanknutzer
     AuthMySQLPassword geheim
     AuthMySQLDB admin_users
     AuthMySQLUserTable users
     AuthMySQLNameField users_login 
     AuthMySQLPasswordField users_password 
     AuthMySQLPwEncryption md5 
     AuthMySQLUserCondition "users_active = 1" 
     AuthMySQLAuthoritative On 
     require valid-user 
 
 
Nun einfach den Apache2 reloaden und schon können nur noch in die Datenbank eingetragene Benutzer auf dieses Verzeichnis zugreifen:
 
/etc/init.d/apache2 reload
 
Viel Spaß beim Administrieren,
Stephan Kasdorf