Passwort-geschützte Verzeichnisse auf Apache2 mit mod_auth_mysql (Debian Squeeze)

Version 1.0

Author: Falko Timme , Christian Schmalfeld <c [dot] schmalfeld [at] projektfarm [dot] de>

Follow me on Twitter


Dieses Tutorial erklärt, wie Sie Webverzeichnisse (mit Benutzern einer MySQL Datenbank) mit mod_auth_mysql unter Apache2 auf einem Debian Squeeze Server mit einem Passwort sichern. Dies ist eine Alternative zu den plain-text Passwörtern, die Sie mit mod_auth erstellen können und erlaubt Ihnen normale SQL Syntax zu benutzen, um Benutzer zu erstellen, editieren und zu löschen. Sie können mod_auth_mysql auch dazu konfigurieren, eine existierende MySQL Benutzertabelle zur Authentifizierung zu benutzen.

Für die Inhalte dieses Tutorials übernehme ich keinerlei Garantie!

1 Vorbemerkung

Ich benutze in diesem Tutorial den vhost http://www.example.com mit der vhost Konfigurationsdatei /etc/apache2/sites-available/www.example.com.vhost und dem Dokumentpfad /var/www/www.example.com/web. Das Verzeichnis, das ich mit einem Passwort schützen möchte ist /var/www/www.example.com/web/protecteddir (wird übersetzt zu http://www.example.com/protecteddir/).

2 Installation von MySQL und mod_auth_mysql

Benutzen Sie zur Installation von MySQL und mod_auth_mysql:

apt-get install mysql-server mysql-client
libapache2-mod-auth-mysql

Sie werden darum gebeten ein Passwort für den MySQL Benutzer anzulegen:

New password for the MySQL "root" user: <-- IhrrootsqlPasswort
Repeat password for the MySQL "root" user: <-- IhrrootsqlPasswort
Aktivieren Sie dann das mod_auth_mysql Modul...

a2enmod auth_mysql

... und starten Sie Apache neu:

/etc/init.d/apache2 restart


3 Konfiguration von mod_auth_mysql

Die Dokumentation zu mod_auth_mysql finden Sie im /usr/share/doc/libapache2-mod-auth-mysql Verzeichnis. Um sie zu lesen müssen Sie zunächst die Dateien DIRECTIVES.gz und USAGE.gz dekomprimieren:

cd /usr/share/doc/libapache2-mod-auth-mysql

gunzip DIRECTIVES.gz

vi DIRECTIVES

gunzip USAGE.gz

vi USAGE

Nachdem Sie diese beiden Dateien gelesen haben, erstellen Sie eine MySQL Datenbank namens examplecomdb, und in dieser die Tabelle mysql_auth welche Ihre Benutzer und Passwörter enthalten wird. Zusätzlich erstellen Sie den MySQL Benutzer examplecom_admin - diesen wird mod_auth_mysql später dazu benutzen, 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 mit einem Passwort Ihrer Wahl.)

USE examplecomdb;

create table mysql_auth (

username char(25) not null,

passwd char(32),

groups char(25),

primary key (username)

);

(Natürlich können Sie auch bereits bestehende Tabellen benutzen, welche Ihre Benutzerdaten beherbergen, und natürlich können Sie auch weitere Felder in der Tabelle anlegen, zum Beispiel eines das festlegt, ob der Benutzer aktiv oder inaktiv ist.)

Nun fügen Sie den Benutzer test mit dem Passwort test in Ihre mysql_auth Tabelle ein (MD5 verschlüsselt); dieser Benutzer gehört zur Gruppe testgroup:

INSERT INTO `mysql_auth` (`username`, `passwd`,
`groups`) VALUES('test', MD5('test'), 'testgroup');

Verlassen Sie danach die MySQL Shell:

quit;

Ich möchte eine .htaccess Datei im /var/www/www.example.com/web/protecteddir Verzeichnis erstellen, welche die mod_auth_mysql Konfiguration enthält, und um dies zu tun muss ich erst die vhost Konfiguration so ändern, dass es der .htaccess Datei erlaubt ist Authentifikationsdirektive zu enthalten. Dies ist entweder mit der Zeile AllowOverride AuthConfig oder durch AllowOverride All möglich (welche es .htaccess erlaubt, alle Einstellungen der vhost Konfiguration zu überschreiben, nicht nur Authentifikationseinstellungen):

vi /etc/apache2/sites-available/www.example.com.vhost


[...]
<Directory /var/www/www.example.com/web/protecteddir> AllowOverride AuthConfig </Directory> [...]
(Sie können die obige Konfiguration auslassen, wenn AllowOverride AuthConfig oder AllowOverride All bereits für das Überverzeichnis /var/www/www.example.com/web gesetzt ist- /var/www/www.example.com/web/protecteddir erbt diese Einstellungen, esseidenn etwas anderes wird in einem <Directory /var/www/www.example.com/web/protecteddir>...</Directory> Container definiert.)

Laden Sie Apache neu:

/etc/init.d/apache2 reload

Erstellen Sie nun Ihre .htaccess Datei:

vi /var/www/www.example.com/web/protecteddir/.htaccess


AuthBasicAuthoritative Off
AuthUserFile /dev/null AuthMySQL On AuthName "Authentication required" AuthType Basic Auth_MySQL_Host localhost Auth_MySQL_User examplecom_admin Auth_MySQL_Password examplecom_admin_password AuthMySQL_DB examplecomdb AuthMySQL_Password_Table mysql_auth Auth_MySQL_Username_Field username Auth_MySQL_Password_Field passwd Auth_MySQL_Empty_Passwords Off Auth_MySQL_Encryption_Types PHP_MD5 Auth_MySQL_Authoritative On require valid-user
Die Einträge AuthBasicAuthoritative Off und AuthUserFile /dev/null sind dazu da um zu verhindern, dass Sie Fehler wie die folgenden in Ihrem Apache Error Log vorfinden (/var/log/apache2/error.log):

[Wed Jun 11 17:02:45 2008] [error] Internal error:
pcfg_openfile() called with NULL filename

[Wed Jun 11 17:02:45 2008] [error] [client 127.0.0.1] (9)Bad file
descriptor: Could not open password file: (null)

Haben Sie zusätzliche Felder in Ihrer MySQL Tabelle, die bestimmen, ob ein Benutzer sich anmelden darf oder nicht (z.B. ein Feld namens active), können Sie die Auth_MySQL_Password_Clause Direktive hinzufügen, z.B.:
[...]
Auth_MySQL_Password_Clause " AND active=1" [...]
(Es ist wichtig, dass die Zeichenkette innerhalb der doppelten Anführungszeichen mit einem Leerzeichen eingeleitet wird!)

Die require valid-user Direktive ist dazu da, dass sich jeder Benutzer, der in der mysql_auth Tabelle aufgelistet ist, anmelden kann, solange er das richtige Passwort eingibt. Wollen Sie, dass sich nur bestimmte Benutzer anmelden können, müssen Sie den Eintrag etwa so umformulieren:
[...]
require user jane joe [...]
Wollen Sie stattdessen, dass sich nur Mitglieder einer bestimmten Gruppe anmelden können, formulieren Sie den Eintrag etwa folgendermaßen um:
[...]
require group testgroup [...]
Das war es. Versuchen Sie nun auf http://www.example.com/protecteddir/ zuzugreifen, sollten Sie nach einem Benutzernamen und einem Passwort gefragt werden:



Anstatt eine .htaccess Datei zu benutzen, können Sie die mod_auth_mysql Konfiguration auch direkt in der vhost Konfiguration platzieren. Bevorzugen Sie diese Methode, löschen Sie die .htaccess Datei...

rm -f
/var/www/www.example.com/web/protecteddir/.htaccess

... und öffnen die vhost Konfigurationsdatei:

vi /etc/apache2/sites-available/www.example.com.vhost

Fügen Sie die folgende Sektion hinzu (oder editieren Sie Ihren bestehenden <Directory /var/www/www.example.com/web/protecteddir>...</Directory> Container) - beachten Sie bitte, dass Sie die Zeile AllowOverride AuthConfig oder AllowOverride All nicht mehr brauchen, da Sie keine .htaccess Datei mehr benutzen):
[...]
<Directory /var/www/www.example.com/web/protecteddir> AuthBasicAuthoritative Off AuthUserFile /dev/null AuthMySQL On AuthName "Authentication required" AuthType Basic Auth_MySQL_Host localhost Auth_MySQL_User examplecom_admin Auth_MySQL_Password examplecom_admin_password AuthMySQL_DB examplecomdb AuthMySQL_Password_Table mysql_auth Auth_MySQL_Username_Field username Auth_MySQL_Password_Field passwd Auth_MySQL_Empty_Passwords Off Auth_MySQL_Encryption_Types PHP_MD5 Auth_MySQL_Authoritative On require valid-user </Directory> [...]
Laden Sie Apache neu:

/etc/init.d/apache2 reload


4 Links

0 Kommentar(e)

Zum Posten von Kommentaren bitte