Die Fragen der Zugriffskontrolle – und überhaupt alle Fragen der Konfiguration des Hauptservers – waren früher in der Datei access.conf abgelegt. Heute werden sie auch in der zentralen Konfigurationsdatei abgelegt, die wir auf der letzten Seite schon beschrieben haben.

Die wesentlichen Einstellungen bezüglich der Zugriffskontrolle werden in den schon beschriebenen Klammerungen

  • <Directory Pfad> … </Directory>
  • <Location URL> … </Location>
  • <Files Dateinamensmuster> … </Files>

vorgenommen. Damit ist es möglich, jedem Verzeichnis, jeder (dateisystempositionsunabhängigen) URL und jeder Datei bestimmte Einstellungen mitzugeben, die sich auf die Fragen beziehen, was darin alles geschehen darf oder nicht. Zusätzlich sind verschiedene Angaben möglich, wer Zugriff auf das entsprechende Element (Verzeichnis, URL oder Datei) haben soll und wer nicht.

Optionen

Jedes der genannten Klammernpaare kann einen Befehl Options enthalten, der bestimmte Optionen setzt, die dann für das entsprechende Element gültig ist. Dem Options-Befehl folgen die entsprechenden Optionen, entweder einfach, oder mit vorgestelltem Plus oder Minuszeichen. Ein Pluszeichen hängt die entsprechende Option an, ein Minuszeichen zieht sie ab (deaktiviert sie). Die folgenden Optionen werden erkannt:AllAlle Optione außer MultiViews werden gesetzt. Das ist die Grundeinstellung.ExecCGIIn diesem Verzeichnis dürfen CGI-Scripts ausgeführt werden.FollowSymLinksSymbolischen Links wird gefolgt. Mit dieser Technik lassen sich auch Verzeichnisse außerhalb des DocumentRoot in den Server integrieren.IncludesServerSideIncludes sind in dem Verzeichnis erlaubt.IncludesNOEXECServerSideIncludes sind in dem Verzeichnis erlaubt, die Ausführung von #exec und ein Einbinden von CGI-Scripts mittels #include sind verboten.IndexesWenn eine URL auf ein Verzeichnis stößt und dieses Verzeichnis keine Index-Datei besitzt (siehe DirectoryIndex), dann wird ein Inhaltsverzeichnis des Verzeichnisses ausgegeben.MultiViewsEnthält eine URL einen Dateinamen ohne Erweiterung, das Verzeichnis enthält aber keine Datei dieses Namens, so wird – sofern eine Datei dieses Namens mit Erweiterung existiert, diese Datei angezeigt.SymLinksIfOwnerMatchSymbolische Links werden nur verfolgt, wenn der Eigentümer des Links der selbe User ist, wie der, dem das Ziel des Links gehört.

Ein Beispiel mag die Anwendung der Optionen verdeutlichen:

  <Directory /usr/local/httpd/htdocs/test>
    Options -Indexes -FollowSymLinks -ExecCGI +MultiViews
  </Directory>
  • Das Verzeichnis /usr/local/httpd/htdocs/test wird – falls die Datei index.html nicht existiert – nicht angezeigt, wenn keine Datei sondern nur das Verzeichnis in der URL angegeben wurde.
  • Symbolischen Links wird nicht gefolgt, auch wenn sie im Verzeichnis existieren.
  • Die Ausführung von CGI-Scripts in diesem Verzeichnis ist verboten.
  • Falls eine Datei ohne Endung gesucht wird, aber nur eine Datei mit selben Namen aber mit Endung existiert, so wird diese angezeigt.

Zugriffsrechte für Domains und Rechner

Manche Verzeichnisse (oder URLs oder Dateien) sollen nur von bestimmten Rechnern oder Domains aus zu sehen sein. Um das zu erreichen, gibt es eine Handvoll Befehle, die auch immer innerhalb der verschiedenen Klammerungen stehen.

Der erste Befehl definiert die Reihenfolge der Abarbeitung der Regeln von Zugriff erlaubt und Zugriff verweigert. Gültig sind entweder:

  order allow,deny

oder

  Order deny,allow

Die einzelnen Regeln werden festgelegt mit den Befehlen

  Deny from Rechnername oder IP-Adresse oder Muster
  Allow from Rechnername oder IP-Adresse oder Muster

Angegeben werden die folgenden Möglichkeiten:Der Begriff allEinfach alleEin Namen einer Domain wie mydomain.deAlle Rechner der genannten DomainEine vollständige IP-Adresse wie 123.45.67.89Genau dieser RechnerEin Teil einer IP-Adresse wie 10.230Alle Rechner des Netzes 10.230.x.xEine IP-Adresse/Netzmaske entweder in der Form 10.230.0.0/255.255.0.0 oder 10.230.0.0/16Die Rechner des angegebenen Subnetzes.

Auch das soll wieder durch ein Beispiel erhellt werden:

  <Directory /usr/local/httpd/htdocs/test>
    Order allow,deny
    Allow from all
  </Directory>

Das Verzeichnis /usr/local/httpd/htdocs/test darf von aller Welt angesehen werden.

  <Directory /usr/local/httpd/htdocs/test>
    Order deny,allow
    Deny from all
    Allow from 10.230
  </Directory>

Das Verzeichnis darf jetzt nur von Rechnern angesehen werden, die aus dem Netz 10.230.x.y stammen.

Zugriffsrechte über Userauthentifizierung

Jedes der geklammerten Elemente kann auch über eine Art Userauthentifizierung geschützt werden. Dazu müssen zunächst einmal User- bzw. Gruppendateien angelegt werden. In der Klammerung kann also stehen:

  AuthUserFile /etc/httpd/passwd
  AuthGroupFile /etc/httpd/group

Die Namen und Pfade der Dateien sind frei wählbar. Beginnen sie nicht mit einem Slash (sind also keine absolute Pfade), so werden sie vom ServerRoot aus gesucht. Die Passwortdatei enthält pro User eine Zeile im Format

  Username : verschl.Passwort

die Gruppendatei hingegen hat das Format:

  Gruppenname : User1 User2 User3

Mit dem Unixbefehl htpasswd können beliebige Passwortdateien angelegt und verwaltet werden, die Gruppendateien können mit jedem beliebigen Editor angelegt werden. Die Syntax für htpasswd ist – falls die Passwortdatei noch nicht existiert:

  htpasswd -c Passwortdatei Username

Falls die Datei schon existiert sollte das -c weggelassen werden.

Zu den Angaben der Dateien brauchen wir noch zwei weitere, einmal den Typ der Authentifizierung und zum Anderen eine Textzeile, die im Passwortdialog dargestellt wird. Beide sind notwendig, damit es funktioniert.

  AuthType Basic
  AuthName "Zugriff für große Geheimnisse"

Mit dem Befehl Require können jetzt Bedingungen formuliert werden, wer auf das Verzeichnis zugreifen darf. Dabei erwartet Require eine der folgenden Formen:Require user UsernameNur der genannte User – oder die genannten User (mit Leerzeichen voneinander getrennt) dürfen auf das Verzeichnis (oder die URL oder die Datei) zugreifen.Require group GruppennameNur Mitglieder der genannten Gruppe – oder der Gruppen dürfen zugreifen.Require valid-userJeder dem System bekannte User (der also einen Eintrag in der angegebenen Passwortdatei hat) darf zugreifen.

Das folgende Beispiel zeigt ein solchermaßen geschütztes Verzeichnis:

  <Directory /usr/local/httpd/htdocs/test>
  AuthType Basic
  AuthName "Zugriff für große Geheimnisse"
  AuthUserFile /etc/httpd/passwd
  Require user efka
  </Directory>

Durch die Angabe beliebiger Passwortdateien können verschiedene Verzeichnisse so für verschiedene User zugänglich gemacht werden, ohne dass die verschiedenen Usereinträge sich stören würden. Es ist theoretisch sogar denkbar, die Passwortdatei in das zu schützende Verzeichnis zu legen, allerdings ist das kein guter Stil.

.htaccess Dateien

Die gesamten Einstellungen, die oben beschrieben wurden, sind in der zentralen Konfigurationsdatei natürlich nur dem User zugänglich, der Zugriff auf diese Datei hat und den Webserver nach einer Änderung neu starten kann.

Um auch anderen Usern die Möglichkeit zu geben, derartige Einstellungen vorzunehmen, gibt es eine sehr elegante Möglichkeit mit den sogenannten .htaccess-Dateien.

Dabei handelt es sich um Dateien, die direkt in ein zu schützendes Verzeichnis abgelegt werden und die genau die selben Einstellungen ermöglichen, wie oben besprochen. Diese Dateien werden jedesmal vom Webserver automatisch eingelesen, sobald eine Anfrage in ein Verzeichnis wechseln will. Der Webserver muß also nicht neu gestartet werden und jeder User kann in sein Verzeichnis solche Dateien ablegen.

Der Name dieser Dateien ist normalerweise .htaccess, das muß aber nicht zwangsläufig so sein, es ist einstellbar in der zentralen Konfigurationsdatei. Mit der Direktive

  AccessFileName .htaccess

wird hier der Name der Zugriffsdatei festgelegt. Zusätzlich muß aber – auch in der zentralen Datei – jedem Verzeichnis noch erlaubt werden, solche Zugriffsdateien zu verwenden. Dazu gibt es die Direktive AllowOverride. Sie legt fest, ob die zentral verwalteten Einstellungen durch Zugriffsdateien in einem Verzeichnis verändert werden dürfen. Diese Anweisung hat innerhalb von <Directory> Blöcken gültigkeit. Die wichtigsten Formen sind:AllowOverride NoneZugriffsdateien im Verzeichnis werden nicht ausgewertet.AllowOverride AllZugriffsdateien im Verzeichnis werden ausgewertet und alle Features sind erlaubt.

Außerdem existieren noch die – seltener gebrauchten Einschränkungen:AllowOverride AuthConfigZugriffsdateien im Verzeichnis werden ausgewertet. Nur Direktiven für die User/Gruppenauthentifizierung sind erlaubt.AllowOverride LimitZugriffsdateien im Verzeichnis werden ausgewertet. Nur Direktiven für die Domain/Rechner-Zugriffssteuerung sind erlaubt.AllowOverride OptionsZugriffsdateien im Verzeichnis werden ausgewertet. Nur Direktiven für Optionen sind erlaubt.

Die letztgenannten Angaben sind auch kombinierbar, etwa in der Form

  AllowOverride AuthConfig Limit

Wenn diese Voraussetzungen erfüllt sind, dann kann ein User eine solche Zugriffsdatei in ein Verzeichnis legen und damit individuell bestimmen, welche Eigenschaften dieses Verzeichnis hat. Eine exemplarische Zugriffsdatei könnte also z.B. folgendermaßen aussehen:

  # .htaccess für das Verzeichnis foo
  
  # Zuerstmal die Zugriffsdaten
  AuthType Basic
  AuthName "Zugriff auf FOO"
  AuthUserFile /etc/httpd/passwd
  Require valid-user

  # In diesem Verzeichnis sind CGI-Scripts erlaubt
  Options +ExecCGI 
  
  # Nur Rechner aus dem Netz 10.230.0.0 dürfen zugreifen
  Order deny,allow
  Deny from all
  Allow from 10.230