Diese Anleitung erklärt, wie man Webverzeichnisse (mit Benutzern aus einer MySQL-Datenbank) mit mod_authn_dbd auf Apache2 auf einem Debian 8 (Jessie)-Server mit einem Passwort schützt. Es ist eine Alternative zu den Klartext-Passwortdateien, die von mod_auth bereitgestellt werden, und ermöglicht Ihnen die Verwendung der normalen SQL-Syntax zum Erstellen/Ändern von Löschbenutzern. Sie können mod_authn_dbd auch konfigurieren, um sich bei einer vorhandenen MySQL-Benutzertabelle zu authentifizieren. Der Apache mod_authn_dbd ist ein Ersatz für mod_auth_mysql.
1 Vorbemerkung
Ich verwende hier den vhost http://www.example.com mit der vhost-Konfigurationsdatei /etc/apache2/sites-available/example.com.vhost und dem Document Root /var/www/www.example.com/web. Ich möchte das Verzeichnis /var/www/example.com/web/protecteddir in diesem Tutorial mit einem Passwort schützen (übersetzt zu http://www.example.com/protecteddir/).
Sie können diese Anleitung für den einfachen LAMP-Server verwenden, wenn Sie Apache noch nicht installiert haben.
2 Installation von MySQL oder MariaDB
Ich werde MariaDB, einen MySQL-Fork, hier anstelle von MySQL verwenden. Aber MySQL funktioniert auch, wenn Sie das bevorzugen. Um MariaDB zu installieren, führen wir Folgendes aus:
apt-get -y install mariadb-server mariadb-client
Sie werden aufgefordert, ein Passwort für den MySQL-Root-Benutzer anzugeben:
Neues Passwort für den „root“-Benutzer von MariaDB:<-- yourrootsqlpassword
Wiederholen Sie das Passwort für den „root“-Benutzer von MariaDB:<-- yourrootsqlpassword
Installieren Sie das DBD-MySQL-Modul:
apt-get install libaprutil1-dbd-mysql
Aktivieren Sie anschließend das Modul mod_authn_dbd :
a2enmod dbd
a2enmod authn_dbd
authn_socache
Apache neu starten:
service apache2 restart
3 Mod_authn_dbd konfigurieren
Die Dokumentation für mod_authn_dbd finden Sie in der Apache-Dokumentation hier http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html.
Nachdem wir diese beiden Dateien gelesen haben, erstellen wir eine MySQL-Datenbank namens examplecomdb, in der wir die Tabelle mysql_auth erstellen, die unsere Benutzer und Passwörter enthält. Zusätzlich erstellen wir den MySQL-Benutzer examplecom_admin - dieser Benutzer wird später von mod_auth_mysql verwendet, um sich mit MySQL zu verbinden:
mysqladmin -u root -p create examplecomdb
mysql -u root -p
GRANT SELECT, INSERT, UPDATE, DELETE ON examplecomdb.* TO 'examplecom_admin'@'localhost' IDENTIFIED BY 'examplecom_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON examplecomdb.* TO 'examplecom_admin'@'localhost.localdomain' IDENTIFIED BY 'examplecom_admin_password';
FLUSH PRIVILEGES;
(Ersetzen Sie examplecom_admin_password durch ein Passwort Ihrer Wahl.)
USE examplecomdb;
create table mysql_auth (
username varchar(255) not null,
passwd varchar(255),
groups varchar(255),
primary key (username)
);
(Natürlich können Sie auch vorhandene Tabellen verwenden, die Ihre Benutzerdaten enthalten, und Sie können auch zusätzliche Felder in der Tabelle haben, wie zum Beispiel ein Feld, das definiert, ob ein Benutzer aktiv ist oder nicht.)
Jetzt fügen wir den Benutzertest mit dem Passworttest in unsere mysql_auth-Tabelle ein; dieser Benutzer gehört zur Gruppe testgroup.
Das Passwort muss gehasht werden, ich werde hier einen SHA1-Hash verwenden, der Hash kann mit dem htpasswd-Befehl auf der Linux-Shell erstellt werden:
htpasswd -bns test test
Das Ergebnis ist folgendes:
test:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
Der erste Teil ist der Benutzername "test", getrennt durch ":" und dann kommt das gehashte Passwort. Wir benötigen das gehashte Passwort "{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=" nur, um es in unsere Benutzerdatenbank einzufügen. Die MySQL-Abfrage lautet:
INSERT INTO `mysql_auth` (`username`, `passwd`, `groups`) VALUES('test', '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=', 'testgroup');
Dann verlassen wir die MySQL-Shell:
quit
Die Konfiguration für mod_authn_dbd muss in die vhost-Datei aufgenommen werden, sie darf nicht in einer .htaccess-Datei hinzugefügt werden. Daher bearbeiten wir die vhost-Datei und fügen am Ende der Datei die folgende Konfiguration hinzu:
nano /etc/apache2/sites-available/example.com.vhost
[...] # mod_dbd configuration
DBDriver mysql
DBDParams "dbname=examplecomdb user=examplecom_admin pass=examplecom_admin_password"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
<Directory "/var/www/example.com/web/protecteddir">
# mod_authn_core and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName "My Server"
# To cache credentials, put socache ahead of dbd here
AuthBasicProvider socache dbd
# Also required for caching: tell the cache to cache dbd lookups!
AuthnCacheProvideFor dbd
AuthnCacheContext my-server
# mod_authz_core configuration
Require valid-user
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s"
</Directory>
Apache neu laden:
service apache2 reload
Wenn Sie zusätzliche Felder in Ihrer MySQL-Tabelle haben, die definieren, ob sich ein Benutzer anmelden darf oder nicht (z. B. ein Feld namens aktiv), können Sie es wie folgt zur SQL-Benutzerabfrage hinzufügen:
[...] AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s and active = 'yes'" [...]
Die Richtlinie require valid-user sorgt dafür, dass sich jeder in der mysql_auth-Tabelle aufgeführte Benutzer anmelden kann, solange er/sie das richtige Passwort angibt. Wenn Sie möchten, dass sich nur bestimmte Benutzer anmelden dürfen, verwenden Sie so etwas wie
[...] require user jane joe [...]
stattdessen. Und wenn Sie möchten, dass sich nur Mitglieder bestimmter Gruppen anmelden dürfen, verwenden Sie so etwas:
[...] require group testgroup [...]
Das ist es! Versuchen Sie nun, auf http://www.example.com/protecteddir/ zuzugreifen, und Sie sollten nach einem Benutzernamen und Passwort gefragt werden:
4 Links
- Apache:http://httpd.apache.org/
- Debian:http://www.debian.org/
- mod_authn_dbd: http://httpd.apache.org/docs/current/mod/mod_authn_dbd.html