Wer darf was?
Es gibt viele Verfahren, wer sich wem gegenüber wie authenfizieren und autorisieren darf. Sobald Apache ins Spiel kommt, liegt viel Verantwortung in den Händen des Admins - da will das passende Modul gut gewählt sein.Zunächst gilt es, zwischen Authentifizierung und Autorisation zu unterscheiden: Autorisation regelt den Zugriff auf Bereiche und erteilt die Erlaubnis zu bestimmten Aktionen. Die Autorisation spielt unter Apache eine große Rolle: Dürfen Anwender ein eigenes cgi-bin-Verzeichnis im ihrem Home-Verzeichnis anlegen und dort CGIs ablegen? Mit welcher Programmiersprache ist das erlaubt? Wer darf auf welche Bereiche einer Website zugreifen? Die Autorisation ist oft mit der Authentifizierung kombiniert, damit der Webserver erlaubte (oder unerwünschte) Benutzer erkennen kann: Man kann eigene Passwort-Dateien mit htpasswd oder htdigest anlegen oder Benutzer über LDAP oder Radius authentifizieren. Es gibt sogar Module, die den Zugriff von SMB-Usern abhängig machen. Passwortdateien kann man unterschiedlich sicher in verschiedenen Datenbankformaten von DBM bis diverse SQL-Datenbanken oder ldap speichern. Dazu braucht es natürlich die passende Datenbank, die dem Apache Zugriff auf sich erlauben muss. In den meisten Datenbanken kann man Passworte mit dem datenbankeigenen crypt verschlüsselt ablegen; viele unterstützen auch verschiedene Algorithmen zur Verschlüsselung.
Manche dieser Verfahren übertragen das Passwort vom Client (Browser) zum Webserver in Klartext - also benötigt man möglicherweise noch SSL-Support, um via https Daten zu senden oder muss darauf bauen, dass der Browser bereits mit Digest umgehen kann. Zu guter Letzt dient die Authentifizierung natürlich auch dazu, den Webserver selbst als denjenigen zu authentifizieren, der er vorgibt zu sein.
Einfache Autorisation
Verschiedene Module für den Apache haben dabei verschiedene Aufgaben. Ein ganz einfaches Modul, um Zugriffe über die Autorisation zu regeln, ist mod_access. mod_access gehört zu den Base-Modulen - es ist also sowieso vorhanden, es sei dann, man hat es beim Kompilieren des Apache ausgeschaltet. mod_access regelt auf verschiedene Arten den Zugriff auf verschiedene Bereiche: Man kann damit per Host, Domain und TLD Zugriffe regeln, per IP und per IP-Range, und das sowohl via Netzmaske als auch mit CIDR-Notation (/24) oder über die Variable, die der Browser als User-Agent setzt. Typische Konfigurationen könnten so aussehen:<Directory /intranet>Order Deny,AllowDeny from allAllow from 192.168.*</Directory>
Allow from mydomain.de.
SetEnvIf User-Agent ^Lynx.* just_lynx
Allow from env=just_lynx
htaccess-Dateien
mod_access reagiert außerdem auf Anweisungen, die in einer .htaccess-Datei im jeweiligen Verzeichnis stehen. In der .htaccess-Datei steht, welche Direktiven mod_access überschreiben soll. In der httpd.conf wiederum steht für das jeweilige Verzeichnis die Erlaubnis zum Überschreiben der entsprechenden Direktive mit dem Schlüsselwort AllowOverride. Der Unterschied zwischen den Anweisungen liegt darin, dass die Direktiven der .htaccess-Datei nur ausgewertet werden, wenn eine Anfrage für das betreffende Verzeichnis eintrifft. Das Apache-Manual weist ausdrücklich darauf hin, dass viele .htaccess-Dateien aus Performancegründen keine gute Idee sind, weil der Apache die Verzeichnisse nach der .htaccess durchforstet und das Regelwerk anwenden muss. Die Direktiven der httpd.conf dagegen lädt der Apache direkt beim Start des Webservers. Zur Kontrolle: httpd -L zeigt die aktuell aktiven Direktiven an. Mit der Variable AccessFileName kann man die .htaccess-Datei umbenennen, wie man möchte.Basis-Authentifizierung
Eine absolut minimale Basis-Authentifizierung leistet das Base-Modul mod_auth. Man legt mit htpasswd eine Passwortdatei an und weist einem User ein Passwort zu. Der User muss nicht innerhalb des Systems selbst existieren - die User der /etc/passwd und der Apache-Passwortdatei brauchen nichts miteinander zu tun zu haben. In der httpd.conf oder via .htaccess wird einem Verzeichnis die entsprechende Passwortdatei mit den enthaltenen Benutzern oder Gruppen zugewiesen. Man kann also z.B. pro<Directory /usr/local/apache/htdocs/mystuff>Order Deny,AllowDeny from allAllow from localhost #Zum ÜbenAllowOverride AuthConfig</Directory>
AuthType BasicAuthName "Persönlicher Zugriff"AuthUserFile /usr/local/apache/authentication/passwordsRequire user someuser
/usr/local/apache/bin/htpasswd -c /usr/local/apache/authentication/passwords someuser
Mehr Sicherheit bei Passworten
Mehre Wege existieren, um die Authentifizierung sicherer, effizienter und skalierbarer zu gestalten. Einige Module erlauben, die Passwort- und Userinformationen in Datenbanken zu speichern - andere sorgen für sicherere Übertragung. Egal, in welchem Format man seine Benutzer verwaltet - zunächst kann man konfigurieren, mit welcher Methode der Browser Benutzername und Passwort an den Webserver übertragen soll. AuthType Basic überträgt diese Daten im Klartext; deswegen kann man alternativ AuthType Digest setzen - allerdings muss der Browser dieses Verfahren (ausführlich in RFC 2617) unterstützen. Mod_auth_digest muss man entweder gleich beim Kompilieren des Apache aktivieren oder aber nachträglich mit/usr/local/apache/bin/apxs -i -c /apachesourcen/mod_auth_digest.c
LoadModule auth_digest_module modules/mod_auth_digest.so
<Directory /usr/local/apache/htdocs/mystuff/>AuthType DigestAuthName "Privater Zugriff"AuthDigestFile /usr/local/apache/authentication/digestsRequire user someuser</Directory>
/usr/local/apache/bin/htdigest -c /usr/local/apache/authentication/digests"Privater Zugriff" someuser
Anonymer Zugriff auf gesicherte Bereiche
Wer eine gewisse Kontrolle über Zugriffe auf bestimmte Bereiche behalten möchte, kann einen FTP-ähnlichen Zugriff für den Apache konfigurieren. Der Webserver erwartet ein Login und ein Passwort - beide sind allerdings öffentlich, damit sich jedermann einloggen kann. Als Passwort kann die eMail-Adresse gefordert sein, die man wiederum mitschreiben kann. Der anonyme Zugriff funktioniert mit jedem Browser und erfordert keine Cookies oder merkwürdige Anhängsel an die URL. Der Zugriff heißt anonym, weil er keine registrierten Anwender erfordert - nicht etwa, weil er wirklich anonym ist. Die Konfiguration erfolgt ähnlich wie mit echter Authentifizierung und für die Installation genügt das obligatorische apxs -c -i mod_auth_anon.c. Eine Basiskonfiguration kann etwa so aussehen, um das Modul zu laden:LoadModule auth_anon_module modules/mod_auth_anon.so
<Location /somewhere>Order deny,allowAllow from allRequire valid-userAnonymous_Authoritative OnAnonymous_NoUserId offAnonymous_MustGiveEmail onAnonymous_VerifyEmail onAnonymous_LogEmail offAnonymous anonymous guest www testAuthName "Use 'guest' or 'anonymous' and email adress as password to login"AuthType basic</Location>
Viele Nutzer mit Backends verwalten
Wer mit mehr Usern hantiert, als ein einfaches Textfile verarbeitet, kann auf Alternativen wie mod_authdbm ausweichen. Apache kann verschiedene File-Formate oder Berkeley-DB ansprechen und von dort seine Informationen beziehen. Für sehr viele Benutzer bieten sich externe Module wie mod_auth_mysql oder mod_authldap an. Natürlich muss man dazu eine MySQL-DB bzw. Openldap und Verwandte installieren und dem Apache den Zugriff auf die DBs erlauben.Die Basiskonfiguration, um die Benutzerinformationen aus anderen Quellen zu beziehen, ersetzt die Direktiven AuthUserFile oder AuthGroupFile durch die entsprechende Direktiven für andere Dateiformate, Datenbanken oder LDAP. Der Apache selbst kann zum Beispiel Informationen aus DBM-Dateien beziehen, die man mit AuthDBMType und AuthDBMUserFile konfiguriert. Benutzername und Passwort empfängt der Apache weiterhin für den Bereich via Basic unverschlüsselt oder mit Digest.
Wer viele Anwender verwalten will, kann mehrere Backends für seine Benutzerverwaltung verwenden: LDAP, Radius oder auch SQL-Datenbanken kann der Apache über externe Module ansprechen. Bei diesen Methoden gilt es allerdings, zwei Authentifizierungsschritte zu unterscheiden: Zunächst muss man den Zugriff vom Apache zum Backend konfigurieren - dazu braucht der User natürlich kein Passwort eingeben, denn dafür muss der Apache auf das Backend zugreifen dürfen. Die Übergabe von Username und Passwort, um im Backend verwaltete Anwender zu authentifizieren, erfordert dann die Eingabe von Username und Passwort entweder über AuthType oder über ein selbstgeschriebenes Script. Beide Daten reicht der Apache dann an die Datenbank weiter und dort existiert dann (hoffentlich) der passende User.
Userverwaltungen via LDAP und Radius konfiguriert man bequem über den Apache - man muss oft nur Host und Port für den Zugriff angeben. Bei LDAP kommt noch der dn (Distinguished Name) hinzu. Wer diese Module verwendet, erhält also neue Direktiven für den Apache wie LDAP_Server, LDAP_Port oder Base_DN. Bei Gebrauch des Radius-Moduls kommen Direktiven wie AddRadiusAuth und AuthRadiusBindAdress dazu. Beide Module erhalten zur User-Authentifizierung Passwort und Username vom Webserver für den Bereich mit AuthType Basic oder Digest durchgereicht
Liebhaber von SQL-Datenbanken können auf Benutzerdaten via Oracle, MySQL oder auch Postgres zurückgreifen. Das Postgres-Modul wird ähnlich wie das LDAP- und Radiusmodul konfiguriert, indem man innerhalb der Directory-Direktive Host, Post usw. für den Zugriff auf die DB setzt. Für mySQL gibt es mehrere Module: Eines arbeitet mit einem zwischengeschalteten CGI-Script, dass Username und Passwort via Perl-Script von MySQL abfragt; das zweite ist ein neueres Modul: mod_authn_dbi ist ein Interface für verschiedene Datenbanken als Backends. Wer mit Perls DBI-Modul vertraut ist, ahnt schon, wie dieses Modul auf Basis der Bibliothek libdbi arbeitet. Egal, welche Datenbank dahinter liegt, das Modul erhält vom Apache Username und Passwort. Man kann mit diesem Modul außerdem den Digest Handler von Apache für AuthType Digest gegen den Digest Handler des Moduls austauschen.
Apache mit SSL
Viele Apaches sind unvollständig, ohne die Möglichkeit, den Webserver via HTTPS ansprechen zu können. Der Apache beherrscht schon lange SSL, das bei den meisten Distributoren bereits vorinstalliert ist. Auch OpenSSL, um Keys und Zertifikate zu generieren, liegt den meisten Distributionen bei. Wer einen neuen Apache baut, muss ein, zwei Handgriffe selbst erledigen: mod_ssl kompilieren und das Modul aktivieren, die passenden Keys und Zertifikate mit OpenSSL generieren und SSL korrekt in der ssl.conf (optional) des Apache (Direktive: Include /pfad/apache/conf/ssl.conf) konfigurieren. Wer das erste Mal mit SSL und Zertifikaten hantiert, sollte sich gründlich in die Materie einlesen - die Webseite von Ralf Engelschall, dem Entwickler von mod_ssl bietet umfangreiche und verständliche Dokumentation. Zum Schluss muss das eigene Zertifikat (im Grunde der Public Key) entweder an eine übergeordnete Zertifizierungsinstanz zum Signieren weitergereicht werden oder das Zertifikat muss selbst signiert werden (Self Signed) - wem es bloß darum geht, eine verschlüsselte Webstrecke via HTTPS zu erstellen, braucht vielleicht keine Certificate Authority wie VeriSign, die das Zertifikat bestätigt, sondern fungiert als seine eigene CA. Für Anwender bedeutet dies, dass ein Bestätigungsdialog für das Zertifikat aufpoppt - das ist bei vielen Websites nicht der Fall, wenn deren Zertifikate von einer der CAs signiert wurden, die Browser wie Mozilla oder IE bereits kennen - zum Beispiel VeriSign, AOL, Thawte, RSA oder Visa. Anwender müssen selbst konfigurieren, ob sie bei jedem Zertifikat bestätigen oder ob die vorhandenen Zertifikate automatisch erkannt werden sollen.Um den eigenen Apache SSL-tauglich zu konfigurieren, geht man als Minimalkonfiguration folgendermaßen vor: Schritt 1: Den Private Key für den Host generieren. Der Key kann verschlüsselt sein - dann muss bei jedem Apache-Start die entsprechende Passphrase eingegeben werden. Das Kommando
openssl genrsa -des3 -out server.key 1024
openssl req -new -key /pfad/keys/server.key -out server.csr
openssl genrsa -des3 -out ca.key 1024
openssl req -new -x509 -days 365 -key ssl.key/ca.key -out ca.crt
SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crtSSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key
Schritt 7: Den Apache mit SSL starten: Statt apachectl start ruft man apachectl startssl auf und gibt die Passphrase ein. Erst, wenn man sich der Unangreifbarkeit des Hosts absolut sicher ist, kann man die Verschlüsselung vom server.crt wegnehmen und die Datei unverschlüsselt im Zertifikatsverzeichnis ablegen. Dann braucht es natürlich keine Passphrase beim Starten des Apache mehr. Wenn alles durchkonfiguriert ist, liefert openssl einen Parameter mit, mit dem man eine HTTPS-Verbindung per Hand simulieren kann.
openssl s_client -connect yourhost:443 -state -debug
Links:
- Kerberos: modauthkerb.sourceforge.net/
- Radius: www.freeradius.org/mod_auth_radius/
- LDAP: www.muquit.com/muquit/software/mod_auth_ldap/mod_auth_ldap_apache2.html
- Datenbanken mit libdbi: open.cyanworlds.com/mod_authn_dbi/
- MySQL mit Apache: www.heuer.org/mod_auth_mysql/mySQL/
- postgres: authpg.sourceforge.net/README.html
- RFC für Digest: www.faqs.org/rfcs/rfc2617.html
- Dokumentation und Modul mod_ssl: www.modssl.org/




