Wie man Verzeichnisse mit mod_authn_dbd und MySQL auf dem Apache mit einem Passwort schützt (Debian 8)

Dieser Leitfaden 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 von mod_auth und ermöglicht es Ihnen, die normale SQL-Syntax zum Erstellen/Ändern von Löschbenutzern zu verwenden. Sie können mod_authn_dbd auch so konfigurieren, dass es sich gegen eine bestehende MySQL-Benutzertabelle authentifiziert. Der Apache mod_authn_dbd ist ein Ersatz für mod_auth_mysql.

1 Vorbemerkung

Ich verwende den vhost http://www.example.com hier mit der vhost-Konfigurationsdatei /etc/apache2/sites-available/example.com.vhost und dem Dokumentenstamm /var/wwww/www.example.com/web. Ich möchte das Verzeichnis /var/www/example.com/example.com/web/protecteddir in diesem Tutorial mit einem Passwort schützen (übersetzt zu http://www.example.com/protecteddir/).

Sie können dieses Tutorial für den Basis-LAMP-Server verwenden, wenn Sie noch keinen Apache installiert haben.

2 Installation von MySQL oder MariaDB

Ich werde MariaDB verwenden, eine MySQL-Gabel hier anstelle von MySQL. Aber MySQL funktioniert auch, wenn Sie das bevorzugen. Um MariaDB zu installieren, führen wir:

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 MariaDB „root“-Benutzer: <– yourrootsqlpassword
Wiederholen Sie das Passwort für den MariaDB „root“-Benutzer: <– 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

Starten Sie den Apache neu:

service apache2 restart

3 Konfigurieren von mod_authn_dbd

Die Dokumentation zu 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 von mod_auth_mysql verwendet, um später eine Verbindung zu MySQL herzustellen:

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 bestehende Tabellen mit Ihren Benutzerdaten verwenden, und Sie können auch zusätzliche Felder in der Tabelle haben, wie z.B. ein Feld, das definiert, ob ein Benutzer aktiv ist oder nicht, zum Beispiel.)

Nun fügen wir den Benutzertest in unsere mysql_auth-Tabelle mit dem Kennwort test 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 Befehl htpasswd 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 Hash-Passwort. Wir benötigen das Hash-Passwort „{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=“ nur, um es in unsere Benutzerdatenbank einzugeben. Die MySQL-Abfrage lautet wie folgt:

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, wie sie in die vhost-Datei aufgenommen werden soll, darf nicht in eine .htaccess-Datei eingefügt werden. Deshalb bearbeiten wir die Vhost-Datei und fügen die folgende Konfiguration am Ende der Datei 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 in Ihrer MySQL-Tabelle zusätzliche Felder haben, die festlegen, ob sich ein Benutzer anmelden darf oder nicht (z.B. ein Feld namens aktiv), können Sie es so zur SQL-Benutzerabfrage hinzufügen:

[...]
AuthDBDUserPWQuery "SELECT passwd FROM mysql_auth WHERE username = %s and active = 'yes'"
[...]

Die require valid-user-Direktive bewirkt, dass sich jeder in der Tabelle mysql_auth aufgeführte Benutzer anmelden kann, solange er das richtige Passwort angibt. Wenn Sie nur möchten, dass sich bestimmte Benutzer anmelden dürfen, verwenden Sie so etwas wie

[...]
require user jane joe
[...]

stattdessen. Und wenn Sie nur möchten, dass sich Mitglieder bestimmter Gruppen anmelden dürfen, verwenden Sie so etwas wie dieses:

[...]
require group testgroup
[...]

Das ist es! Versuchen Sie nun, auf http://www.example.com/protecteddir/ zuzugreifen, und Sie sollten nach einem Benutzernamen und einem Passwort gefragt werden:

Geben Sie den Benutzernamen und das Passwort ein.

Anmeldung erfolgreich.

4 Links

Das könnte dich auch interessieren …