Login
Newsletter
Werbung

So, 7. März 2004, 00:00

Sicherheit für den Apachen

Würde sich Sicherheit nach der Anzahl der Module und Methoden bemessen, wäre ein Webserver eine Festung mit Burggraben darum herum, in dem halb verhungerte Krokodile schwimmen. Wer als Admin Apache konfigurieren soll, das verschiedene Authentifizierungsverfahren und SSL beherrscht, hat die Qual der Wahl.

Wer darf was?

Es gibt viele Verfahren, wer sich wem gegenüber wie authentifizieren 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,Allow
Deny from all
Allow from 192.168.*
</Directory>

Das Allow from darf auch so geschrieben werden:

Allow from mydomain.de

IPv6-Adressen funktionieren ebenfalls. In der httpd.conf sind damit die typischen Webserver-Verzeichnisse /htdocs, /icons und /manual konfiguriert, denn mod_access bezieht sich oft auf ein Verzeichnis. Eine Verzeichnis-Direktive darf natürlich innerhalb eines Virtual Hosts, konfiguriert mit der Direktive vorkommen. Ein Beispiel: Um den Zugriff via Browser-Typ zu regeln (siehe auch die Direktive BrowserMatch), setzt man zunächst eine Variable:

SetEnvIf User-Agent ^Lynx.* just_lynx

und erlaubt dann den Zugriff mit

Allow from env=just_lynx

und schon können nur noch Browser, die als Typ Lynx senden, auf das Verzeichnis zugreifen. Natürlich kann man mit vielen Browsern oder mit Perls Modul LWP diese Variable selbst setzen - als Sicherheitssperre ist diese Konfiguration nicht gedacht. Dafür kann man in Abhängigkeit vom Browsertyp unterschiedliche Webseiten senden. Mit dieser Methode kann man natürlich auch andere Variablen des gesendeten HTTP-Headers auswerten.

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 Verzeichnis eigene Passwortdateien vorhalten. Will man Zugriff auf das entsprechende Verzeichnis, schickt der Webserver die Aufforderung, sich für diesen Webserverbereich (Realm) zu authentifizieren. Der Browser poppt das bekannte Fenster auf oder zeigt einen passenden Eingabedialog an. Username und Passwort werden bei dieser Authentifizierungsmethode im Klartext übertragen. Die einfachste Konfiguration sieht also z.B. in der httpd.conf so aus:

<Directory /usr/local/apache/htdocs/mystuff>
Order Deny,Allow
Deny from all
Allow from localhost #Zum Üben
AllowOverride AuthConfig
</Directory>

In das Verzeichnis /usr/local/apache/htdocs/mystuff legt man eine .htaccess-Datei mit folgenden Anweisungen:

AuthType Basic
AuthName "Persönlicher Zugriff"
AuthUserFile /usr/local/apache/authentication/passwords
Require user someuser

Natürlich kann man diese Anweisungen genauso gut in die Directory-Direktive direkt eintragen und sich die .htaccess-Datei sparen. Dann fällt die AllowOverride-Anweisung weg. Zum Schluss legt man die Passwortdatei an:

/usr/local/apache/bin/htpasswd -c /usr/local/apache/authentication/passwords someuser

Man wird auf die übliche Art zweimal nach dem Passwort gefragt und dann liegt die Passwort-Datei im einfachsten Format mit verschlüsseltem Passwort im entsprechenden Verzeichnis außerhalb des Documentroot des Apache. Nach dem Neustart des Apache mit apachectl restart - wie bei jeder Änderung der httpd.conf - kann man das Einloggen testen. Änderungen in der .htaccess-Datei erfordern keinen Neustart des Daemons, weil sie zur Laufzeit ausgewertet werden.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung