Apache/HTTP/Authentifizierung/tmp1
Authentifizierung und Autorisierung
Authentifizierung ist ein Prozess, mit dem Sie überprüfen, ob jemand die Person ist, für die sie sich ausgibt
- Autorisierung ist ein Prozess, mit dem jemandem erlaubt wird, sich an einem bestimmten Ort aufzuhalten oder auf bestimmte Informationen zuzugreifen
Informationen zur allgemeinen Zugriffssteuerung finden Sie in der Anleitung zur Zugriffssteuerung
Verwandte Module und Direktiven
Am Authentifizierungs- und Autorisierungsprozess sind drei Modultypen beteiligt
- In der Regel müssen Sie mindestens ein Modul aus jeder Gruppe auswählen
Authentifizierungstyp (siehe die AuthType-Direktive)
mod_auth_digest
- Authentifizierungsanbieter (siehe die AuthBasicProvider und AuthDigestProvider Direktiven)
- Autorisierung (siehe die Require Direktive)
mod_authz_groupfile mod_authz_host mod_authz_owner mod_authz_user Zusätzlich zu diesen Modulen gibt es auch mod_authn_core und mod_authz_core
- Diese Module*
Zusätzlich zu diesen Modulen gibt es auch mod_authn_core und mod_authz_core
- Diese Module implementieren Kernanweisungen, die für alle Authentifizierungsmodule von zentraler Bedeutung sind
Das Modul mod_authnz_ldap ist sowohl ein Authentifizierungs- als auch ein Autorisierungsanbieter
- Das Modul mod_authz_host bietet Autorisierung und Zugriffssteuerung basierend auf Hostname, IP-Adresse oder Merkmalen der Anfrage, ist jedoch nicht Teil des Authentifizierungsanbietersystems
- Für die Abwärtskompatibilität mit mod_access gibt es ein neues Modul mod_access_compat
Sie sollten sich auch die Anleitung zur Zugriffskontrolle ansehen, in der die verschiedenen Möglichkeiten zur Zugriffskontrolle auf Ihren Server erläutert werden
Einführung
Wenn Sie auf Ihrer Website vertrauliche Informationen oder Informationen haben, die nur für einen kleinen Personenkreis bestimmt sind, können Sie mit den in diesem Artikel beschriebenen Techniken sicherstellen, dass nur die Personen auf diese Seiten zugreifen können, für die sie bestimmt sind
In diesem Artikel wird die „Standardmethode“ zum Schutz von Teilen Ihrer Website beschrieben, die die meisten von Ihnen verwenden werden
Hinweis
Wenn Ihre Daten wirklich sicher sein müssen, sollten Sie zusätzlich zu einer Authentifizierung mod_ssl verwenden
Die Voraussetzungen
Die in diesem Artikel beschriebenen Anweisungen müssen entweder in Ihre Hauptserver-Konfigurationsdatei (normalerweise in einem <Verzeichnis>-Abschnitt) oder in Konfigurationsdateien pro Verzeichnis (.htaccess-Dateien) eingefügt werden
Wenn Sie .htaccess-Dateien verwenden möchten, benötigen Sie eine Serverkonfiguration, die das Einfügen von Authentifizierungsanweisungen in diese Dateien zulässt
- Dies wird mit der AllowOverride-Anweisung erreicht, die angibt, welche Anweisungen, falls vorhanden, in Konfigurationsdateien für einzelne Verzeichnisse eingefügt werden dürfen
Da es hier um Authentifizierung geht, benötigen Sie eine AllowOverride-Anweisung wie die folgende:
AllowOverride AuthConfig
Oder, wenn Sie die Anweisungen direkt in Ihre Hauptserver-Konfigurationsdatei eingeben möchten, benötigen Sie natürlich Schreibrechte für diese Datei
Außerdem sollten Sie sich ein wenig mit der Verzeichnisstruktur Ihres Servers auskennen, um zu wissen, wo einige Dateien gespeichert sind
- Das sollte nicht allzu schwierig sein, und ich werde versuchen, dies zu verdeutlichen, wenn wir zu diesem Punkt kommen
Sie müssen auch sicherstellen, dass die Module mod_authn_core und mod_authz_core entweder in die httpd-Binärdatei integriert oder von der Konfigurationsdatei httpd.conf geladen wurden
- Beide Module stellen Kernanweisungen und -funktionen bereit, die für die Konfiguration und Verwendung der Authentifizierung und Autorisierung im Webserver von entscheidender Bedeutung sind
Inbetriebnahme
Hier sind die Grundlagen für den Passwortschutz eines Verzeichnisses auf Ihrem Server
Zunächst müssen Sie eine Passwortdatei erstellen
- Wie Sie dabei genau vorgehen, hängt davon ab, welchen Authentifizierungsanbieter Sie gewählt haben
- Mehr dazu später
- Zunächst verwenden wir eine Text-Passwortdatei
Diese Datei sollte an einem Ort gespeichert werden, der nicht über das Internet zugänglich ist
- So können die Leute die Passwortdatei nicht herunterladen
- Wenn Ihre Dokumente beispielsweise unter /usr/local/apache/htdocs bereitgestellt werden, sollten Sie die Kennwortdatei(en) unter /usr/local/apache/passwd speichern
Verwenden Sie zum Erstellen der Datei das Dienstprogramm htpasswd, das mit Apache geliefert wurde
- Dieses befindet sich im Verzeichnis bin des Verzeichnisses, in dem Sie Apache installiert haben
- Wenn Sie Apache über ein Drittanbieterpaket installiert haben, befindet es sich möglicherweise in Ihrem Ausführungspfad
Um die Datei zu erstellen, geben Sie Folgendes ein:
htpasswd -c /usr/local/apache/passwd/passwords rbowen
htpasswd fragt Sie nach dem Passwort und bittet Sie dann, es zur Bestätigung erneut einzugeben:
# htpasswd -c /usr/local/apache/passwd/passwords rbowen Neues Passwort: mypassword Neues Passwort erneut eingeben: mypassword Passwort für Benutzer rbowen hinzufügen
Wenn htpasswd nicht in Ihrem Pfad enthalten ist, müssen Sie natürlich den vollständigen Pfad zur Datei eingeben, damit sie ausgeführt werden kann
- Bei einer Standardinstallation befindet sie sich unter /usr/local/apache2/bin/htpasswd
Als Nächstes müssen Sie den Server so konfigurieren, dass ein Kennwort angefordert wird, und dem Server mitteilen, welche Benutzer Zugriff haben dürfen
Dies können Sie entweder durch Bearbeiten der
httpd.conf
-Datei oder mithilfe einer
.htaccess
-Datei Wenn Sie beispielsweise das Verzeichnis /usr/local/apache/htdocs/secret schützen möchten, können Sie die folgenden Anweisungen verwenden, die entweder in der Datei /usr/local/apache/htdocs/secret/.htaccessoder in httpd.confinnerhalb eines <Directory „/usr/local/apache/htdocs/secret“>-Abschnitts platziert werden
AuthType Basic AuthName „Restricted Files“ # (Folgende Zeile optional) AuthBasicProvider file AuthUserFile „/usr/local/apache/passwd/passwords“ Require user rbowen
Lassen Sie uns jede dieser Anweisungen einzeln untersuchen
- Die AuthType-Anweisung wählt die Methode aus, die zur Authentifizierung des Benutzers verwendet wird
- Die gängigste Methode ist Basic, und dies ist die von mod_auth_basic implementierte Methode
- Es ist jedoch wichtig zu wissen, dass bei der Basic-Authentifizierung das Passwort unverschlüsselt vom Client an den Server gesendet wird
- Diese Methode sollte daher nicht für hochsensible Daten verwendet werden, es sei denn, sie wird von mod_ssl begleitet
- Apache unterstützt eine weitere Authentifizierungsmethode: AuthType Digest
- Diese Methode wird von mod_auth_digest implementiert und sollte sicherer sein
- Dies ist nicht mehr der Fall, und die Verbindung sollte stattdessen mit mod_ssl verschlüsselt werden
Die AuthName-Anweisung legt den bei der Authentifizierung zu verwendenden Bereich fest
- Der Bereich erfüllt zwei Hauptfunktionen
- Erstens präsentiert der Client diese Informationen dem Benutzer oft als Teil des Passwort-Dialogfelds
- Zweitens wird er vom Client verwendet, um zu bestimmen, welches Passwort für einen bestimmten authentifizierten Bereich gesendet werden soll
Wenn sich ein Client beispielsweise im Bereich „Restricted Files“ authentifiziert hat, wird er automatisch dasselbe Kennwort für jeden Bereich auf demselben Server erneut versuchen, der mit dem „Restricted Files“-Bereich gekennzeichnet ist
- Daher können Sie verhindern, dass ein Benutzer mehr als einmal zur Eingabe eines Kennworts aufgefordert wird, indem Sie mehrere eingeschränkte Bereiche denselben Bereich verwenden lassen
- Aus Sicherheitsgründen muss der Client natürlich immer wieder nach dem Passwort fragen, wenn sich der Hostname des Servers ändert
Der AuthBasicProvider ist in diesem Fall optional, da file der Standardwert für diese Anweisung ist
- Sie müssen diese Anweisung verwenden, wenn Sie eine andere Quelle für die Authentifizierung auswählen, z
- B. mod_authn_dbm oder mod_authn_dbd
Die AuthUserFile-Anweisung legt den Pfad zur Kennwortdatei fest, die wir gerade mit htpasswd erstellt haben
- Bei einer großen Anzahl von Benutzern kann es recht langsam sein, bei jeder Anfrage eine Nur-Text-Datei zu durchsuchen, um den Benutzer zu authentifizieren
- Apache bietet auch die Möglichkeit, Benutzerinformationen in schnellen Datenbankdateien zu speichern
- Das mod_authn_dbm-Modul bietet die AuthDBMUserFile-Anweisung
- Diese Dateien können mit den Programmen dbmmanage und htdbm erstellt und bearbeitet werden
- Viele weitere Authentifizierungsoptionen sind über Module von Drittanbietern verfügbar
Schließlich stellt die Require-Anweisung den Autorisierungsteil des Prozesses bereit, indem sie den Benutzer festlegt, der auf diesen Bereich des Servers zugreifen darf
- Im nächsten Abschnitt werden verschiedene Möglichkeiten zur Verwendung der Require-Anweisung erläutert
Zugang für mehrere Personen
Die oben genannten Anweisungen lassen nur eine Person (nämlich jemanden mit dem Benutzernamen rbowen) in das Verzeichnis
- In den meisten Fällen möchten Sie jedoch mehreren Personen Zugang gewähren
- Hier kommt die AuthGroupFile ins Spiel
Wenn Sie mehr als eine Person zulassen möchten, müssen Sie eine Gruppendatei erstellen, die Gruppennamen mit einer Liste von Benutzern in dieser Gruppe verknüpft
- Das Format dieser Datei ist ziemlich einfach und Sie können sie mit Ihrem bevorzugten Editor erstellen
Der Inhalt der Datei sieht wie folgt aus:
Gruppenname: rbowen dpitts sungo rshersey
Dies ist lediglich eine Liste der Mitglieder der Gruppe in einer langen Zeile, die durch Leerzeichen getrennt ist
Um einen Benutzer zu Ihrer bereits vorhandenen Passwortdatei hinzuzufügen, geben Sie Folgendes ein:
htpasswd /usr/local/apache/passwd/passwords dpitts
Sie erhalten dieselbe Antwort wie zuvor, aber sie wird an die vorhandene Datei angehängt, anstatt eine neue Datei zu erstellen. (Durch das -c wird eine neue Passwortdatei erstellt)
Jetzt müssen Sie Ihre .htaccess-Datei oder Ihren <Verzeichnis>-Block wie folgt ändern:
AuthType Basic AuthName „By Invitation Only“ # Optionale Zeile: AuthBasicProvider file AuthUserFile „/usr/local/apache/passwd/passwords“ AuthGroupFile „/usr/local/apache/passwd/groups“ Require group GroupName
Jetzt wird jeder, der in der Gruppe GroupName aufgeführt istund einen Eintrag in der Passwort-Datei hat, eingelassen, wenn er das richtige Passwort eingibt
Es gibt eine andere Möglichkeit, mehrere Benutzer einzulassen, die weniger spezifisch ist
Anstatt eine Gruppendatei zu erstellen, können Sie einfach die folgende Anweisung verwenden:
Require valid-user
Wenn Sie diese Anweisung anstelle der Require user rbowen-Zeile verwenden, können alle Benutzer, die in der Kennwortdatei aufgeführt sind und ihr Kennwort korrekt eingeben, auf die Datei zugreifen
Mögliche Probleme
Aufgrund der Art und Weise, wie die Standardauthentifizierung festgelegt ist, müssen Ihr Benutzername und Ihr Kennwort jedes Mal überprüft werden, wenn Sie ein Dokument vom Server anfordern
- Dies gilt auch, wenn Sie dieselbe Seite erneut laden, und für jedes Bild auf der Seite (wenn sie aus einem geschützten Verzeichnis stammen)
- Wie Sie sich vorstellen können, verlangsamt dies die Vorgänge ein wenig
- Das Ausmaß der Verlangsamung ist proportional zur Größe der Kennwortdatei, da diese Datei geöffnet und die Liste der Benutzer durchgegangen werden muss, bis Ihr Name gefunden wird
- Und dies muss jedes Mal geschehen, wenn eine Seite geladen wird
Daraus ergibt sich, dass es eine praktische Begrenzung dafür gibt, wie viele Benutzer in einer Kennwortdatei gespeichert werden können
- Diese Begrenzung hängt von der Leistung Ihres jeweiligen Servercomputers ab, aber Sie können davon ausgehen, dass es zu Verlangsamungen kommt, sobald Sie mehr als ein paar hundert Einträge haben, und Sie sollten zu diesem Zeitpunkt eine andere Authentifizierungsmethode in Betracht ziehen
Alternative Kennwortspeicherung
Da die Speicherung von Passwörtern in Textdateien die oben genannten Probleme mit sich bringt, sollten Sie Ihre Passwörter an einem anderen Ort speichern, z. B. in einer Datenbank
mod_authn_dbm und mod_authn_dbd sind zwei Module, die dies ermöglichen
- Anstatt die Datei AuthBasicProvider auszuwählen, können Sie stattdessen dbm oder dbd als Speicherformat auswählen
Um beispielsweise eine dbm-Datei anstelle einer Textdatei auszuwählen:
<Directory „/www/docs/private“> AuthName „Private“ AuthType Basic AuthBasicProvider dbm AuthDBMUserFile „/www/passwords/passwd.dbm“ Require valid-user </Directory>
Es stehen weitere Optionen zur Verfügung
- Weitere Informationen finden Sie in der Dokumentation zu mod_authn_dbm
Verwendung mehrerer Anbieter
Mit der Einführung der neuen Provider-basierten Authentifizierungs- und Autorisierungsarchitektur sind Sie nicht mehr an eine einzige Authentifizierungs- oder Autorisierungsmethode gebunden
- Tatsächlich können beliebig viele Provider gemischt und aufeinander abgestimmt werden, um genau das Schema zu erstellen, das Ihren Anforderungen entspricht
- Im folgenden Beispiel werden sowohl der Datei- als auch der LDAP-basierte Authentifizierungsprovider verwendet
<Directory „/www/docs/private“> AuthName „Private“ AuthType Basic AuthBasicProvider file ldap AuthUserFile „/usr/local/apache/passwd/passwords“ AuthLDAPURL ldap://ldaphost/o=yourorg Require valid-user </Directory>
In diesem Beispiel versucht der Dateianbieter zuerst, den Benutzer zu authentifizieren
- Wenn der Benutzer nicht authentifiziert werden kann, wird der LDAP-Anbieter aufgerufen
- Dadurch kann der Umfang der Authentifizierung erweitert werden, wenn Ihre Organisation mehr als einen Authentifizierungsspeichertyp implementiert
- Andere Authentifizierungs- und Autorisierungsszenarien können die Kombination eines Authentifizierungstyps mit einem anderen Autorisierungstyp beinhalten
- Beispielsweise kann die Authentifizierung anhand einer Kennwortdatei und die Autorisierung anhand eines LDAP-Verzeichnisses erfolgen
Genauso wie mehrere Authentifizierungsanbieter implementiert werden können, können auch mehrere Autorisierungsmethoden verwendet werden
In diesem Beispiel werden sowohl die Dateigruppenautorisierung als auch die LDAP-Gruppenautorisierung verwendet
<Directory „/www/docs/private“> AuthName „Private“ AuthType Basic AuthBasicProvider file AuthUserFile „/usr/local/apache/passwd/passwords“ AuthLDAPURL ldap://ldaphost/o=yourorg AuthGroupFile „/usr/local/apache/passwd/groups“ Require group GroupName Require ldap-group cn=mygroup,o=yourorg </Directory>
Um die Autorisierung noch etwas weiter zu führen, ermöglichen Autorisierungscontainer-Anweisungen wie <RequireAll> und <RequireAny> die Anwendung von Logik, sodass die Reihenfolge, in der die Autorisierung gehandhabt wird, vollständig über die Konfiguration gesteuert werden kann
- Unter Autorisierungscontainer finden Sie ein Beispiel dafür, wie sie angewendet werden können
Über die reine Autorisierung hinaus
Die Art und Weise, wie die Autorisierung angewendet werden kann, ist jetzt viel flexibler als nur eine einzelne Überprüfung gegen einen einzelnen Datenspeicher
- Die Reihenfolge, Logik und Auswahl, wie die Autorisierung durchgeführt wird, ist jetzt möglich
Anwendung von Logik und Reihenfolge
Die Steuerung, wie und in welcher Reihenfolge die Autorisierung angewendet wird, war in der Vergangenheit ein wenig rätselhaft
- In Apache 2.2 wurde ein anbieterbasierter Authentifizierungsmechanismus eingeführt, um den eigentlichen Authentifizierungsprozess von der Autorisierung und unterstützenden Funktionalität zu entkoppeln
- Einer der Nebeneffekte war, dass Authentifizierungsanbieter in einer bestimmten Reihenfolge konfiguriert und aufgerufen werden konnten, die nicht von der Ladefolge des Authentifizierungsmoduls selbst abhing
- Derselbe anbieterbasierte Mechanismus wurde auch in die Autorisierung übernommen
- Das bedeutet, dass die Require-Anweisung nicht nur angibt, welche Autorisierungsmethoden verwendet werden sollen, sondern auch die Reihenfolge, in der sie aufgerufen werden
- Mehrere Autorisierungsmethoden werden in derselben Reihenfolge aufgerufen, in der die Require-Anweisungen in der Konfiguration erscheinen
Mit der Einführung von Autorisierungscontainer-Direktiven wie <RequireAll> und <RequireAny> hat die Konfiguration auch die Kontrolle darüber, wann die Autorisierungsmethoden aufgerufen werden und welche Kriterien bestimmen, wann der Zugriff gewährt wird
- Unter Autorisierungscontainer finden Sie ein Beispiel dafür, wie sie zur Darstellung komplexer Autorisierungslogik verwendet werden können
Standardmäßig werden alle „Require“-Anweisungen so behandelt, als wären sie in einer <RequireAny>-Containeranweisung enthalten
- Mit anderen Worten: Wenn eine der angegebenen Autorisierungsmethoden erfolgreich ist, wird die Autorisierung gewährt
Verwendung von Autorisierungsanbietern für die Zugriffssteuerung
Die Authentifizierung durch Benutzername und Passwort ist nur ein Teil des Ganzen
- Häufig möchten Sie Personen aufgrund von etwas anderem als ihrer Identität einlassen
- Zum Beispiel aufgrund dessen, woher sie kommen
Die Autorisierungsanbieter all, env, host und ip ermöglichen es Ihnen, den Zugriff basierend auf anderen hostbasierten Kriterien wie dem Hostnamen oder der IP-Adresse des Computers, der ein Dokument anfordert, zuzulassen oder zu verweigern
Die Verwendung dieser Anbieter wird durch die Require-Anweisung festgelegt
- Diese Anweisung registriert die Autorisierungsanbieter, die während der Autorisierungsphase der Anfragebearbeitung aufgerufen werden
Zum Beispiel
Require ip address,
wobei address eine IP-Adresse (oder ein Teil einer IP-Adresse) ist, oder:
Require host domain_name,
wobei domain_name ein voll qualifizierter Domänenname (oder ein Teil eines Domänennamens) ist; Sie können mehrere Adressen oder Domänennamen angeben, falls gewünscht
Wenn beispielsweise jemand Ihre Pinnwand mit Spam-Nachrichten zuspammt und Sie diese Person fernhalten möchten, können Sie Folgendes tun:
<RequireAll> Require all granted Require not ip 10.252.46.165 </RequireAll>
Besucher, die von dieser Adresse kommen, können den Inhalt, der von dieser Richtlinie abgedeckt wird, nicht sehen
- Wenn Sie stattdessen einen Maschinennamen anstelle einer IP-Adresse haben, können Sie diesen verwenden
<RequireAll> Require all granted Require not host host.example.com </RequireAll>
Wenn Sie den Zugriff von einer gesamten Domain blockieren möchten, können Sie auch nur einen Teil einer Adresse oder eines Domainnamens angeben:
<RequireAll> Require all granted Require not ip 192.168.205 Require not host phishers.example.com moreidiots.example Require not host ke </RequireAll>
Bei Verwendung von <RequireAll> mit mehreren <Require>-Anweisungen, die jeweils mit not negiert werden, wird der Zugriff nur dann zugelassen, wenn alle negierten Bedingungen erfüllt sind
- Mit anderen Worten: Der Zugriff wird blockiert, wenn eine der negierten Bedingungen nicht erfüllt ist
Abwärtskompatibilität der Zugriffssteuerung
Einer der Nebeneffekte der Einführung eines anbieterbasierten Mechanismus für die Authentifizierung besteht darin, dass die vorherigen Zugriffssteuerungsanweisungen „Order“, „Allow“, „Deny“ und „Satisfy“ nicht mehr benötigt werden
- Um jedoch die Abwärtskompatibilität für ältere Konfigurationen zu gewährleisten, wurden diese Anweisungen in das „mod_access_compat“-Modul verschoben
Hinweis
Die von mod_access_compat bereitgestellten Anweisungen wurden von mod_authz_host als veraltet eingestuft
- Die Kombination alter Anweisungen wie Order, Allow oder Deny mit neuen Anweisungen wie Require ist technisch möglich, wird jedoch nicht empfohlen
- Das mod_access_compat-Modul wurde erstellt, um Konfigurationen zu unterstützen, die nur alte Anweisungen enthalten, um das Upgrade auf Version 2.4 zu erleichtern
- Weitere Informationen finden Sie im Handbuch zum Durchführen des Upgrades
Zwischenspeichern der Authentifizierung
Es kann vorkommen, dass die Authentifizierung eine inakzeptable Last für einen Provider oder Ihr Netzwerk darstellt
- Dies betrifft am ehesten Benutzer von mod_authn_dbd (oder Drittanbieter/benutzerdefinierte Provider)
- Um dieses Problem zu lösen, führt HTTPD 2.3/2.4 einen neuen Caching-Provider mod_authn_socache ein, um Anmeldeinformationen zwischenzuspeichern und die Last für den/die Ursprungsprovider zu reduzieren
Dies kann für einige Benutzer eine erhebliche Leistungssteigerung bedeuten
Weitere Informationen
Sie sollten auch die Dokumentation zu mod_auth_basic und mod_authz_host lesen, die weitere Informationen zur Funktionsweise enthalten
- Die Anweisung <AuthnProviderAlias> kann auch bei der Vereinfachung bestimmter Authentifizierungskonfigurationen helfen
Die verschiedenen von Apache unterstützten Chiffren für Authentifizierungsdaten werden unter „Password Encryption“ erläutert
Außerdem sollten Sie sich die Anleitung zur „Access Control“ ansehen, in der eine Reihe verwandter Themen behandelt werden