Dieser Artikel ist entstanden, weil ich für die Family und für Bekannte einen WebDav Server betreibe. Ausserdem kommen viele Besucher dieses Blogs über Suchmaschinen sehr häufig wenn sie nach WebDav, Auth, Passwd, htaccess usw. suchen. Die Beispiel Scripte sind nicht vollständig. Die Code Stücke für E-Mailvalidierung, HTTP Post und Get und weitere sind nicht vorhanden um den Code nicht unübersichtlich zu machen.
Wer einer Benutzergruppe den Zugriff auf eine Webressource oder WebDav vergeben möchte hat ab einem bestimmten Punkt viel Arbeit. Um sich die Arbeit zu erleichtern kann man sich mit dem Perl Modul Apache::Htpasswd ein Konsolentool oder auch ein Webinterface bauen, mit dem das Verwalten der Benutzer, Passwörter und Gruppen leichter wird.
Vorweg ein wenig aus der Kategorie “Optimierungswahn”
Die Dateien: .htpasswd .htaccess und .htgroups verwende ich eigentlich nie. Eigentlich, weil ich sie nur nutze, um erst einmal zu testen. Anschliessend kommen die in den .ht* genutzen Einstellungen in die Apache Config. Jeder Zugriff auf Dateien kostet Zeit, jedesmal müssen Dateien geöffnet und gelesen werden. Änderungen in der Apache Config werden auch bei einem apache reload neu eingelesen, ein apache restart ist hierbei nicht nötig.
Damit jetzt aber trotzdem wieder einmal alle verwirrt sind werden in diesem Artikel genau diese Dateien benutzt. Denn die Daten für die Zugriffskontrolle werden genau in diesen Dateien gespeichert. Der unterschied ist, sie werden per Include in die Apache Config eingetragen und nicht beim Aufruf eines Verzeichnis gelesen. Das einzige was aus den Files direkt ausgelesen wird ist der Benutzer und das Passwort bei der Authentifizierung.
Alias /user2 /srv/webdav/user2
<Directory /srv/webdav/user2>
DAV On
DAVDepthInfinity Off
Options FollowSymLinks Indexes
Allow from all
Order allow,deny
AuthType Basic
AuthName "WebDAV (User2) Restricted"
AuthUserFile /srv/webdav/.htpasswd_user2
AuthGroupFile /srv/webdav/.htgroups_user2
Require Group admins
# Require valid-user user2
</Directory>
Damit in Require valid-user nicht alle Benutzer einzeln aufgelistet werden müssen wird ein Benutzer einer Gruppe hinzugefügt. Die Gruppe heisst hier admins. Die .htgroups_user2 sieht wie folgt aus:
admins: user1 user2 user3
developer: user1 alice bob
texter: user2 alice
Die Datei .htpasswd enthält nachher alle Benutzer und deren Passwörter. Und genau um die geht es, wenn es über Verwaltungsaufwand geht. Jeder kennt die Mails oder Chatfenster in denen jemand nach seinem Passwort fragt oder darum bittet das Passwort zurück zusetzen. Man muss sich auf dem Server einloggen und es neu setzen.
Um sich die Arbeit zu erleichtern bastelt man sich ein nettes Webinterface mit dem die Benutzer verwaltet werden können. Zusätzlich gibt man den Benutzern selbst ein Webinterface über das sie ein neues Passwort anfordern können. Nach dem sich ein Benutzer ein neues Passwort setzen lässt schickt man ihm erst einmal eine E-Mail mit einem Bestätigungslink. Bestätigt er mit Hilfe des Keys im Link wird das neue Passwort gesetzt. Weiss ein Benutzer das alte Passwort noch und möchte sein Passwort einfach nur regelmässig neu setzen kann er es auch angeben und zusätzlich sein neues.
Die E-Mailvalidierung und weitere Sachen sind in den Beispielen nicht mit eingefügt.
Apache::Htpasswd für das Zurücksetzen per E-Mail-Validierungslink.
use Apache::Htpasswd;
# Hier den Code für die E-Mailvalidierung..
# ...
# Neues Passwort generieren und in $newpasswd packen und den User in $username.
# Pfad zum Passwort File, $Usergroup ist in diesem Fall user2:
$foo = new Apache::Htpasswd("/srv/webdav/.htpasswd_" . $usergroup);
# Change a password without checking against old password
$foo->htpasswd($username, $newpasswd, {'overwrite' => 1})
Wenn ein Benutzer sein altes Passwort angibt um sein Passwort neu zu setzen kann z.B. folgender Code benutzten werden:
use Apache::Htpasswd;
# Username, altes Passwort und neues Passwort aus dem Web Formular auslesen und in
# den Variabeln: $username, $oldpasswd und $newpasswd speichern.
# ...
# Pfad zum Passwort File:
$foo = new Apache::Htpasswd("/srv/webdav/.htpasswd_" . $usergroup);
# Check that a password is correct
if ( $foo->htCheckPassword($username, $oldpasswd) eq 1 ) {
printf ("Passwort ok<br />\n");
} else {
printf ("Passwort falsche<br />\n");
exit;
}
# Change a password
$foo->htpasswd("zog", "new-password", "old-password");
Einen neuen Benutzer hinzufügen:
use Apache::Htpasswd;
# Username, altes Passwort und neues Passwort aus dem Web Formular auslesen und in
# den Variabeln: $username, $newpasswd und $newpasswd2 speichern.
# $newpasswd2 ist für die Passwortbestätigung um die Eingabe zu vergleichen. Müssen zusammen passen.
# Wenn $newpasswd und $newpasswd2 nicht gleich sind muss abgebrochen werden.
# Pfad zum Passwort File:
$foo = new Apache::Htpasswd("/srv/webdav/.htpasswd_" . $usergroup);
# Add an entry
$foo->htpasswd($username, $newpasswd);
# Ausgabe für die Bestätigung ....
Um die Benutzerdaten zu speichern kann jeder seine eigene Lösung benutzen. Eine Datenbank wie SQLite, MySQL oder Postgres können hierzu benutzt werden. Dann müsste man auch nicht die Groupfiles auslesen, parsen und Werte in den ausgelesenen Daten hinzufügen, sondern könnte mit einem leichten Select aus der Datenbank alle Benutzer einer Gruppe auslesen und hintereinander in die Groupfiles schreiben.
Da es auch zu der Situation kommen kann, das man Benutzer auch in verschiedenen WebDav Bereichen benutzen will könnte auch die Möglichkeit mit temporären Dateien von nutzen sein. Benutzer und deren Passwörter werden in temporären Dateien gespeichert und diese ausgelesen. Das Passwort ist dann verschlüsselt und kann so verschlüsselt abgespeichert werden. Anschliessend kann man in den verschiedenen Konfigurationen der WebDav Verzeichnisse die Benutzer aus der Datenbank generieren lassen.
Wer die verschlüsselten Passwörter aber eh in einer Datenbank speichern möchte kann sich die Installation von Apache::Htpasswd aber auch gleich sparen und sollte dann lieber direkt “crypt” benutzen.
Letzte Kommentare