Skript/Apache/Webserver
Skript/Apache/Webserver
Inhalt
Nr | Option | Beschreibung |
---|---|---|
1 | Apache HTTP Server | |
2 | Installation | |
3 | Konfiguration | |
4 | Module | |
5 | Logging | |
6 | Zugriffsrechte | |
7 | Virtuelle Server | |
8 | Verschlüsselung | |
9 | PHP | |
10 | Proxy-Server | |
11 | Sicherheit |
1 - Grundlagen
Apache HTTP Server - Webserver des Apache/Projekts
Beschreibung
- Einer der meistbenutzten Webserver
- Häufig als LAMP-System
- Quelloffenes und freies Produkt der Apache Software Foundation
- Eigenschaften
Hohe Verbreitung | |
Leistungsfähig | |
Erweiterbar | |
Sicherheit | |
Frei Software | |
Support durch große Community | |
Langjährige Verfügbarkeit | |
Unterschiedlichste Betriebssysteme |
- Entstehung
Gründungsprojekt | Apache Software Foundation |
Entwicklungsgrundlage 1994 | HTTPd Webserver des NCSA |
Erste Version 1995 | Apache HTTP Server |
- Name
- Der Name wurde aus Respekt vor dem nordamerikanischen Indianerstamm der Apachen gewählt
- "A patchy server"
Apache/HTTP/Grundlagen - Apache Webserver Grundlagen
Client-Server
Instanz | Beispiel |
---|---|
Webserver | Apache-Webserver |
Webbrowser | Firefox |
Protokolle
Instanz | Beschreibung |
---|---|
HTTP | Hypertext Transfer Protocol |
HTTPS | Verschlüsseltes HTTP |
WebDAV | HTTP-Ordner-Freigabe |
Adressierung
DoD-Schicht | Adresse | Beispiel |
---|---|---|
4 | URL | https://wiki.foxtom.de/index.php?title=DoD-Schichtenmodell&veaction=edit |
3 | Port |
|
2 | IP-Adresse |
|
1 | Mac-Adresse | 80:fa:5b:70:cf:a2 |
Eigenschaften und Funktionen
- Betriebssysteme
- Multiprocessing-Module
Hinzu kommen verschiedene Multiprocessing-Module (MPM), die je nach Plattform unterschiedliche Lösungen für die gleichzeitige Bedienung mehrerer Client-Anfragen anbieten:
- Beispielsweise setzt das MPM prefork für klassische Unix-Systeme auf Forking von Prozessen, während mpm_winnt für die unter Windows empfehlenswerteren Threads optimiert ist
- Modularer Aufbau
Durch entsprechende Module kann er beispielsweise die Kommunikation zwischen Browser und Webserver verschlüsseln (mod_ssl), als Proxyserver eingesetzt werden (mod_proxy) oder komplexe Manipulationen von HTTP-Kopfdaten (mod headers) und URLs (mod rewrite) durchführen
- Serverseitige Skriptsprachen
Der Apache bietet die Möglichkeit, mittels serverseitiger Skriptsprachen Webseiten dynamisch zu erstellen
- Häufig verwendete Skriptsprachen sind PHP, Perl oder Ruby
- Weitere Sprachen sind Python, JavaScript (z. B. V8CGI), Lua, Tcl und .NET (mit ASP.NET oder Mono)
- Diese sind kein Bestandteil des Webservers, sondern müssen ebenfalls entweder als Module eingebunden werden oder über das CGI angesprochen werden, da Apache im Gegensatz zu beispielsweise nginx modulbasiert ist
- Die Module können jederzeit aktiviert oder deaktiviert werden. Über das bei der Apache-Installation enthaltene mod_include kann Server Side Includes (SSI) ausgeführt werden
- Damit ist es möglich, einfache dynamische Webseiten zu erstellen und den Verwaltungsaufwand von statischen Webseiten zu minimieren
- Lizenz
Der Apache HTTP Server ist, wie alle Programme der Apache Software Foundation, eine freie Software
- Derzeit wird noch die stabile Version 2.4.x unterstützt und somit beispielsweise mit Sicherheitsupdates versorgt
- Die Apache-Entwickler empfehlen die Version 2.4.x für den Produktiveinsatz
Distributionen
- Der Apache HTTP Server ist in fast allen Linux-Distributionen und in macOS standardmäßig enthalten
- Eine beliebte Entwicklungs-Distribution für Windows, Linux und Mac OS X ist XAMPP
Versionen
Version | Beschreibung |
---|---|
Apache 1.x | Diese Version wurde erstmals im Jahre 1995 veröffentlicht
|
Apache 2.0 | Diese Version wurde erstmals im März 2000 veröffentlicht
|
Apache 2.4 | In Apache 2.4 wurde der Support für ältere, lange schon nicht mehr weiter entwickelte Betriebssysteme wie BeOS, TPF und A/UX beendet |
Dokumentation
Installation
sudo apt install apache2 apache2-doc
- Aufruf
Das Handbuch wird je nach Sprachkonfiguration des Webbrowsers, die er im Feld Accept-Language des HTTP übermittelt, in der passenden Sprache ausgeliefert, sofern diese verfügbar ist
2 - Installation
Apache/HTTP/Installation - Installation eines Apache-Webservers
Betriebssystem | Beschreibung |
---|---|
Linux | |
Windows |
3 - Konfiguration
Apache/HTTP/Konfiguration - Apache Webserver Konfiguration
Beschreibung
Apache2 Debian Standard Seite

Apache2 Debian Standard-Seite
Es funktioniert!
Dies ist die Standardbegrüßungsseite, die verwendet wird, um den korrekten Betrieb des Apache2-Servers nach der Installation auf Debian-Systemen zu testen.
* Wenn Sie diese Seite lesen können, bedeutet dies, dass der auf dieser Website installierte Apache-HTTP-Server ordnungsgemäß funktioniert.
* Sie sollten diese Datei (zu finden unter /var/www/html/index.html
) ersetzen, bevor Sie Ihren HTTP-Server weiter betreiben.
Konfigurationsübersicht
- Debians Apache2-Standardkonfiguration
Unterscheidet sich von der Standardkonfiguration
- ist in mehrere Dateien aufgeteilt
- die für die Interaktion mit Debian-Werkzeugen optimiert sind
- Konfigurationslayout
Das Konfigurationslayout für eine Apache2-Webserver-Installation auf Debian-Systemen sieht wie folgt aus:
/etc/apache2/ |-- apache2.conf | `-- ports.conf |-- mods-enabled | |-- *.load | `-- *.conf |-- conf-enabled | `-- *.conf |-- sites-enabled | `-- *.conf
Option | Beschreibung |
---|---|
apache2.conf | Hauptkonfigurationsdatei
|
ports.conf | ist immer in der Hauptkonfigurationsdatei enthalten
|
mods-enabled/ conf-enabled/ sites-enabled/ |
Die Konfigurationsdateien in den Verzeichnissen mods-enabled/ , conf-enabled/ und sites-enabled/ enthalten bestimmte Konfigurationsausschnitte, die Module, globale Konfigurationsfragmente bzw. virtuelle Hostkonfigurationen verwalten
Sie werden aktiviert, indem verfügbare Konfigurationsdateien von ihren jeweiligen *-available/-Gegenstücken per Symlink verknüpft werden.
|
Aufgrund der Verwendung von Umgebungsvariablen muss apache2 in der Standardkonfiguration mit /etc/init.d/apache2
oder apache2ctl
gestartet/gestoppt werden.
- Ein direkte Aufruf von
/usr/bin/apache2
funktioniert nicht in der Standardkonfiguration.
Dokument-Wurzeln
Standardmäßig erlaubt Debian keinen Zugriff durch den Webbrowser auf jede Datei
- Außer denen, die sich in den Verzeichnissen
/var/www
, public_html (wenn aktiviert) und/usr/share
(für Webanwendungen) befinden
Wenn Ihre Website ein Web-Dokumentenstammverzeichnis verwendet, das sich an einem anderen Ort befindet (z. B. in /srv
), müssen Sie Ihr Dokumentenstammverzeichnis in /etc/apache2/apache2.conf
auf die Whitelist setzen
Das standardmäßige Debian-Dokumentenverzeichnis ist /var/www/html
- Sie können Ihre eigenen virtuellen Hosts unter /var/www erstellen
- Dies unterscheidet sich von früheren Veröffentlichungen, die von Haus aus eine bessere Sicherheit bieten
4 - Module
Apache/HTTP/Module - Überblick
Beschreinung
Apache-HTTP-Server ist modular aufgebaut
Kernfunktionen
Modul | Beschreibung |
---|---|
core | Kernfunktionen, die immer verfügbar sind |
Multi-Processing-Module
Modul | Beschreibung |
---|---|
mpm_common | Eine Sammlung von Direktiven, die von mehr als einem Multi-Processing-Modul (MPM) implementiert werden |
event | Eine Variante des Worker-MPM mit dem Ziel, nur für Verbindungen mit aktiver Verarbeitung Threads zu verbrauchen
|
mpm_netware | Multi-Processing-Modul zur Implementierung eines für Novell NetWare optimierten Webservers mit ausschließlichem Threading |
mpmt_os2 | Hybrides Multiprozess- und Multithreading-MPM für OS/2 |
prefork | Implementiert einen Pre-Forking-Webserver ohne Threads |
mpm_winnt | Multi-Processing-Modul optimiert für Windows . |
worker | Multi-Processing-Modul zur Implementierung eines hybriden Multithreading-Multiprozess-Web-Servers |
Wichtige Anwendungen
Anwendung | Module |
---|---|
Verschlüsselung | mod_ssl, mod_gnutls |
Skriptsprachen | mod_php, mod_perl, mod_python |
WebDAV | mod_dav, mod_dav_fs, mod_dav_lock, mod_dav_repos |
Authentifizierung | mod_auth* |
Weiterleitung | mod_proxy* |
Umschreiben von Anfragen | mod rewrite |
Änderungen an Headerzeilen | mod_headers |
Informationen zu Dateitypen | mod_mime, mod_mime_magic |
Statusbericht | mod_status |
Weitere Module
Modul | Bereich | Funktion |
---|---|---|
mod_access_compat | Access | Gruppenzugriffsberechtigung basierend auf dem Hostnamen |
mod_actions | Skriptsprachen | Führt CGI-Skript abhängig vom MIME-Typ des angefragten Inhalts aus |
mod_alias | URL-Umleitung | |
mod_allowmethods | Verbietet einzelne HTTP-Methoden (GET, HEAD, POST, PUT, DELETE, TRACE) | |
mod_asis | Sendet Datei ohne neue HTTP-Header zu setzen | |
mod_auth_basic | Authentifizierung | HTTP-Authentifizierung |
mod_auth_digest | Authentifizierung | Authentifizierung mit MD5-Hash |
mod_auth_form | Authentifizierung | Formular-Authentifizierung |
mod_authn_anon | Authentifizierung | Erlaubt anonymen Zugriff in authentifizierten Bereichen |
mod_authn_core | Authentifizierung | Kernmodul für die Authentifizierung |
mod_authn_dbd | Authentifizierung | Benutzer-Authentifizierung über eine SQL-Datenbank |
mod_authn_dbm | Authentifizierung | Benutzer-Authentifizierung über eine DBM-Datei |
mod_authn_file | Authentifizierung | Benutzer-Authentifizierung über Textdateien |
mod_authn_socache | Authentifizierung | Verwaltet einen Cache aus Zugangsberechtigungen |
mod_authnz_fcgi | Authentifizierung | Allows a FastCGI authorizer application to handle Apache httpd authentication and authorization |
mod_authnz_ldap | Authentifizierung | Benutzer-Authentifizierung über LDAP |
mod_authz_core | Authentifizierung | Kernmodul für Authentifizierungsmechanismen |
mod_authz_dbd | Authentifizierung | Gruppen-Authentifizierung über SQL |
mod_authz_dbm | Authentifizierung | Gruppen-Authentifizierung über DBM |
mod_authz_groupfile | Authentifizierung | Gruppen-Authentifizierung über Textdateien |
mod_authz_host | Authentifizierung | Gruppen-Authentifizierung basierend auf dem Hostnamen |
mod_authz_owner | Authentifizierung | Authentifizierung über Besitzerzugehörigkeit von Dateien |
mod_authz_user | Authentifizierung | Benutzer-Authentifizierung |
mod_autoindex | Access | Automatische Verzeichnisanzeige |
mod_buffer | Caching | Anfragen-Pufferung |
mod_cache | Caching | HTTP-Caching-Filter nach RFC 2616 |
mod_cache_disk | Caching | Festplattenspeicherung für HTTP Caching-Filter |
mod_cache_socache | Caching | Shared object cache (socache)-basierte Speicherung für den HTTP Caching-Filter |
mod_cern_meta | CERN Metadaten-Semantik | |
mod_cgi | Skriptsprachen | Ausführung von CGI-Skripten |
mod_cgid | Skriptsprachen | Ausführung von CGI-Skripten über externen daemon |
mod_charset_lite | Legt andere Zeichenkodierung fest | |
mod_data | Data-URL nach RFC 2397 | |
mod_dav | WebDAV | WebDAV |
mod_dav_fs | WebDAV | Dateisystem-Modul für WebDAV |
mod_dav_lock | WebDAV | Locking-Modul für WebDAV |
mod_dbd | Verwaltet SQL-Verbindungen | |
mod deflate | Komprimiert Inhalt vor der Auslieferung mit Deflate | |
mod_dialup | Dialup | |
mod_dir | Ordner-Verzeichnisanzeige | |
mod_dumpio | Dumps all I/O to error log as desired | |
mod_echo | Test | Echo-Server für Testzwecke |
mod_env | Ändert die Umgebung | |
mod_example_hooks | Beispielmodul | |
mod_expires | Caching | Erzeugt die Expires und Cache-Control HTTP-Header |
mod_ext_filter | Filter | Gibt die Server-Antwort vor dem Ausliefern an externes Programm weiter |
mod_file_cache | Caching | Puffert Dateien im Arbeitsspeicher |
mod_filter | Filter | Kontextsensitive Filter |
mod_headerss | Filter | Anpassung der HTTP-Header |
mod_heartbeat | Sendet Serverstatus an Proxyserver | |
mod_heartmonitor | Monitor für mod_heartbeat Server | |
mod_ident | RFC 1413 ident lookups | |
mod_imagemap | Imagemaps | |
mod_include | Serverseitiges Einbinden von HTMl-Dokumenten (Server Side Includes) | |
mod_info | Serverinformationen | |
mod_isapi | ISAPI (Apache for Windows) | |
mod_lbmethod_bybusyness | Für mod_proxy_balancer | |
mod_lbmethod_byrequests | Für mod_proxy_balancer | |
mod_lbmethod_bytraffic | Für mod_proxy_balancer | |
mod_lbmethod_heartbeat | Für mod_proxy_balancer | |
mod_ldap | LDAP | |
mod_log_config | Logging | Logging der Anfragen |
mod_log_debug | Logging | Debug Log |
mod_log_forensic | Logging | Forensisches Logging |
mod_logio | Logging | Logging der input/output bytes |
mod_lua | Lua-Hooks | |
mod_macro | Makro-Unterstützung für die Konfigurationsdateien | |
mod_mime | MIME | |
mod_mime_magic | Feststellung der MIME per Magic Byte | |
mod_negotiation | Content Negotiation | |
mod_nw_ssl | SSL-Kryptografie für NetWare | |
mod_php | Skriptsprachen | Ausführung von PHP-Skripten |
mod_privileges | Solaris Privileges | |
mod proxy | Proxy | Proxy |
mod_proxy_ajp | Proxy | AJP für mod_proxy |
mod_proxy_balancer | Proxy | Lastverteilung für mod_proxy |
mod_proxy_connect | Proxy | Unterstützung von CONNECT-Anfragen für mod_proxy |
mod_proxy_express | Proxy | Dynamische Reverse-Proxy-Unterstützung für mod_proxy |
mod_proxy_fcgi | Proxy | FastCGI-Unterstützung für mod_proxy |
mod_proxy_fdpass | Proxy | fdpass-Unterstützung für mod_proxy |
mod_proxy_ftp | Proxy | FTP-Unterstützung für mod_proxy |
mod_proxy_html | Proxy | Rewrite HTML links in to ensure they are addressable from Clients’ networks in a proxy context |
mod_proxy_http | Proxy | HTTP-Unterstützung für mod_proxy |
mod_proxy_scgi | Proxy | SCGI-Gateway-Unterstützung für mod_proxy |
mod_proxy_wstunnel | Proxy | WebSocket-Unterstützung für mod_proxy |
mod_ratelimit | Bandbreitenbegrenzung | |
mod_reflector | Kann einen Ausgabefilter in einen HTTP-Dienst verwandeln | |
mod_remoteip | Ersetzt die Client-IP mit einer Useragent-IP | |
mod_reqtimeout | Legt Timeout fest | |
mod_request | Unterstützung für HTTP-Anfragen (Requests) | |
mod rewrite | Rewrite-Engine | |
mod_security | Sicherheit | Sicherheitsmodul (Web Application Firewall) |
mod_sed | Filter | Filtern mit sed |
mod_session | Session | Unterstützung für Sitzungen |
mod_session_cookie | Session | Sitzungen mit Cookies |
mod_session_crypto | Session | Sitzungsverschlüsselung |
mod_session_dbd | Session | DBD/SQL-basierte Sitzungen |
mod_setenvif | Erlaubt das Setzen von Umgebungsvariablen je nach Anfrage | |
mod_slotmem_plain | Slot-based shared memory provider | |
mod_slotmem_shm | Slot-based shared memory provider | |
mod_so | Unterstützung für das Laden von Programmbibliotheken | |
mod_socache_dbm | Caching | DBM-basierter socache |
mod_socache_dc | Caching | Distcache-basierter socache |
mod_socache_memcache | Caching | Memcache-basierter socache |
mod_socache_shmcb | Caching | shmcb-basierter socache |
mod_speling | Modul zum Korrigieren von Rechtschreibfehlern bei der Eingabe | |
mod ssl | Kryptografie mittels SSL bzw. TLS | |
mod_status | Informationen über Serveraktivität und -leistung | |
mod_substitute | Filter | Ermöglicht Suchen & Ersetzen in der Serverantwort |
mod_suexec | CGI-Skripte als anderer Benutzer ausführen (SuEXEC) | |
mod_unique_id | Provides an environment variable with a unique identifier for each request | |
mod_unixd | Sicherheit | Basic (required) security for Unix-family platforms |
mod_userdir | Benutzer-spezifische Verzeichnisse | |
mod_usertrack | Clickstream-Logging | |
mod_version | Versionsabhängie Konfiguration | |
mod_vhost_alias | Dynamische Konfiguration für Virtual Hosting | |
mod_watchdog | Periodisches Ausführen von Aufgaben | |
mod_xml2enc | Filter | Fremde Zeichensätze für libxml2-Filtermodule |
5 - Logging
Apache/HTTP/Logging
Beschreibung
Um einen Webserver effektiv verwalten zu können, ist es notwendig, Feedback über die Aktivität und Leistung des Servers sowie über eventuell auftretende Probleme zu erhalten
- Der Apache HTTP Server bietet sehr umfassende und flexible Protokollierungsfunktionen
- In diesem Dokument wird beschrieben, wie Sie die Protokollierungsfunktionen konfigurieren und die Inhalte der Protokolle verstehen können
Überblick
Verwandte Module | Verwandte Anweisungen |
---|---|
Der Apache HTTP-Server bietet eine Vielzahl verschiedener Mechanismen zur Protokollierung aller Vorgänge auf Ihrem Server, von der ersten Anfrage über den URL-Zuordnungsprozess bis hin zur endgültigen Auflösung der Verbindung, einschließlich aller Fehler, die während des Prozesses aufgetreten sind
- Darüber hinaus können Module von Drittanbietern Protokollierungsfunktionen bereitstellen oder Einträge in die vorhandenen Protokolldateien einfügen, und Anwendungen wie CGI-Programme, PHP-Skripte oder andere Handler können Nachrichten an das Fehlerprotokoll des Servers senden
In diesem Dokument werden die Protokollmodule behandelt, die standardmäßig zum HTTP-Server gehören
Sicherheitswarnung
Jeder, der in das Verzeichnis schreiben kann, in das Apache httpd eine Protokolldatei schreibt, kann mit ziemlicher Sicherheit auf die Benutzerkennung zugreifen, unter der der Server gestartet wurde, normalerweise root. Gewähren Sie Personen KEINEN Schreibzugriff auf das Verzeichnis, in dem die Protokolle gespeichert sind, ohne sich der Konsequenzen bewusst zu sein
- Weitere Informationen finden Sie im Dokument "Security Tips"
Außerdem können Protokolldateien Informationen enthalten, die direkt vom Client ohne Escape-Sequenz bereitgestellt werden
- Daher ist es für böswillige Clients möglich, Steuerzeichen in die Protokolldateien einzufügen
- Daher ist beim Umgang mit Rohprotokollen Vorsicht geboten
Fehlerprotokoll
Verwandte Module | Verwandte Anweisungen |
---|---|
Das Server-Fehlerprotokoll, dessen Name und Speicherort durch die ErrorLog-Direktive festgelegt wird, ist die wichtigste Protokolldatei
- An diese Stelle sendet Apache httpd Diagnoseinformationen und zeichnet alle Fehler auf, die bei der Verarbeitung von Anfragen auftreten
- Es ist die erste Anlaufstelle, wenn beim Starten des Servers oder beim Betrieb des Servers ein Problem auftritt, da es oft Einzelheiten darüber enthält, was schiefgelaufen ist und wie es behoben werden kann
Das Fehlerprotokoll wird normalerweise in eine Datei geschrieben (normalerweise error_log auf Unix-Systemen und error.log auf Windows und OS/2)
- Auf Unix-Systemen ist es auch möglich, dass der Server Fehler an syslog sendet oder sie an ein Programm weiterleitet
Das Format des Fehlerprotokolls wird durch die ErrorLogFormat-Direktive definiert, mit der Sie anpassen können, welche Werte protokolliert werden
- Wenn Sie keine angeben, wird ein Standardformat definiert
Eine typische Protokollmeldung lautet wie folgt:
[Fri Sep 09 10:42:29.902022 2011] [core:error] [pid 35708:tid 4328636416] [client 72.15.99.187] File does not exist: /usr/local/apache2/htdocs/favicon.ico
Der erste Eintrag im Logeintrag ist das Datum und die Uhrzeit der Meldung
- Der nächste Eintrag ist das Modul, das die Meldung erzeugt hat (in diesem Fall "core"), und der Schweregrad dieser Meldung
- Darauf folgt die Prozess-ID und gegebenenfalls die Thread-ID des Prozesses, bei dem der Zustand aufgetreten ist
- Als Nächstes folgt die Client-Adresse, die die Anfrage gestellt hat
- Und schließlich folgt die detaillierte Fehlermeldung, die in diesem Fall auf eine Anfrage nach einer Datei hinweist, die nicht vorhanden war
Im Fehlerprotokoll können die unterschiedlichsten Meldungen erscheinen
- Die meisten sehen ähnlich aus wie das Beispiel oben
- Das Fehlerprotokoll enthält auch Debugging-Ausgaben von CGI-Skripten
- Alle Informationen, die von einem CGI-Skript in stderr geschrieben werden, werden direkt in das Fehlerprotokoll kopiert
Wenn Sie ein %L-Token sowohl in das Fehlerprotokoll als auch in das Zugriffsprotokoll einfügen, wird eine Protokolleintrags-ID erstellt, mit der Sie den Eintrag im Fehlerprotokoll mit dem Eintrag im Zugriffsprotokoll korrelieren können
- Wenn mod_unique_id geladen ist, wird auch dessen eindeutige Anforderungs-ID als Logeintrags-ID verwendet
Beim Testen ist es oft nützlich, das Fehlerprotokoll kontinuierlich auf Probleme zu überwachen
Auf Unix-Systemen können Sie dies mit folgendem Befehl erreichen:
tail -f error_log
Protokollierung pro Modul
Die LogLevel-Anweisung ermöglicht es Ihnen, einen Protokollschweregrad auf Modulbasis festzulegen
- Auf diese Weise können Sie bei der Fehlerbehebung eines Problems mit nur einem bestimmten Modul dessen Protokollierungsvolumen erhöhen, ohne auch die Details anderer Module zu erhalten, die Sie nicht interessieren
- Dies ist besonders nützlich für Module wie mod_proxy oder mod_rewrite, bei denen Sie Details darüber wissen möchten, was sie zu tun versuchen
Geben Sie dazu den Namen des Moduls in Ihrer LogLevel-Anweisung an:
LogLevel info rewrite:trace5
Dies setzt den Haupt-LogLevel auf info, erhöht ihn jedoch auf trace5 für mod_rewrite
Dies ersetzt die modulbezogenen Logging-Anweisungen wie RewriteLog, die in früheren Versionen des Servers vorhanden waren
Access Log
Verwandte Module | Verwandte Anweisungen |
---|---|
Das Server-Zugriffsprotokoll zeichnet alle vom Server verarbeiteten Anfragen auf
- Der Speicherort und der Inhalt des Zugriffsprotokolls werden durch die CustomLog-Anweisung gesteuert
- Die LogFormat-Anweisung kann verwendet werden, um die Auswahl der Protokollinhalte zu vereinfachen
- In diesem Abschnitt wird beschrieben, wie der Server für die Aufzeichnung von Informationen im Zugriffsprotokoll konfiguriert wird
Die Speicherung der Informationen im Zugriffsprotokoll ist nur der erste Schritt der Protokollverwaltung
- Der nächste Schritt besteht darin, diese Informationen zu analysieren, um nützliche Statistiken zu erstellen
- Die Protokollanalyse im Allgemeinen geht über den Rahmen dieses Dokuments hinaus und ist nicht wirklich Teil der Aufgabe des Webservers selbst
Verschiedene Versionen von Apache httpd haben andere Module und Anweisungen zur Steuerung der Zugriffsprotokollierung verwendet, darunter mod_log_referer, mod_log_agent und die TransferLog-Anweisung
- Die CustomLog-Direktive umfasst nun die Funktionalität aller älteren Direktiven
Das Format des Zugriffsprotokolls ist in hohem Maße konfigurierbar
- Das Format wird mithilfe einer Formatzeichenfolge angegeben, die einer C-artigen printf(1)-Formatzeichenfolge ähnelt
- In den nächsten Abschnitten werden einige Beispiele vorgestellt
- Eine vollständige Liste der möglichen Inhalte der Formatzeichenfolge finden Sie in den mod_log_config Formatzeichenfolgen
Common Log Format
Eine typische Konfiguration für das Zugriffsprotokoll könnte wie folgt aussehen
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
Hierdurch wird der Spitzname common definiert und mit einer bestimmten Protokollformatzeichenfolge verknüpft
- Die Formatzeichenfolge besteht aus Prozentanweisungen, die den Server jeweils anweisen, eine bestimmte Information zu protokollieren
- In die Formatzeichenfolge können auch Literalzeichen eingefügt werden, die direkt in die Protokollausgabe kopiert werden
- Das Anführungszeichen (") muss durch einen vorangestellten Backslash maskiert werden, damit es nicht als Ende der Formatzeichenfolge interpretiert wird
- Die Formatzeichenfolge kann auch die speziellen Steuerzeichen ‚\n‘ für Zeilenumbruch und ‚\t‘ für Tabulator enthalten
Die CustomLog-Anweisung erstellt eine neue Protokolldatei unter Verwendung des definierten Spitznamens
- Der Dateiname für das Zugriffsprotokoll ist relativ zum ServerRoot, es sei denn, er beginnt mit einem Schrägstrich
Die obige Konfiguration schreibt Protokolleinträge in einem Format, das als Common Log Format (CLF) bekannt ist
- Dieses Standardformat kann von vielen verschiedenen Webservern erstellt und von vielen Protokollanalyseprogrammen gelesen werden
Die in CLF erstellten Protokolldateieinträge sehen in etwa so aus:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
Jeder Teil dieses Logeintrags wird im Folgenden beschrieben
- 127.0.0.1 (%h)
Dies ist die IP-Adresse des Clients (Remote-Host), der die Anfrage an den Server gestellt hat
- Wenn HostnameLookupsauf On gesetzt ist, versucht der Server, den Hostnamen zu ermitteln und anstelle der IP-Adresse zu protokollieren
- Diese Konfiguration wird jedoch nicht empfohlen, da sie den Server erheblich verlangsamen kann
- Stattdessen empfiehlt es sich, einen Protokoll-Postprozessor wie logresolve zu verwenden, um die Hostnamen zu ermitteln
- Die hier gemeldete IP-Adresse ist nicht unbedingt die Adresse des Computers, an dem der Benutzer sitzt
- Wenn sich zwischen dem Benutzer und dem Server ein Proxyserver befindet, ist diese Adresse die Adresse des Proxys und nicht die des Ursprungscomputers
- - (%l)
Der "Bindestrich" in der Ausgabe zeigt an, dass die angeforderte Information nicht verfügbar ist
- In diesem Fall ist die nicht verfügbare Information die RFC 1413-Identität des Clients, die von identd auf dem Client-Rechner ermittelt wurde
- Diese Information ist höchst unzuverlässig und sollte fast nie verwendet werden, außer in streng kontrollierten internen Netzwerken
- Apache httpd versucht nicht einmal, diese Informationen zu ermitteln, es sei denn, IdentityCheckist auf On gesetzt
- frank (%u)
Dies ist die Benutzerkennung der Person, die das Dokument anfordert, wie durch die HTTP-Authentifizierung bestimmt
- Der gleiche Wert wird normalerweise CGI-Skripten in der REMOTE_USER-Umgebungsvariable bereitgestellt
- Wenn der Statuscode für die Anfrage (siehe unten) 401 ist, sollte dieser Wert nicht als vertrauenswürdig eingestuft werden, da der Benutzer noch nicht authentifiziert ist
- Wenn das Dokument nicht kennwortgeschützt ist, lautet dieser Teil "-", genau wie der vorherige
- [10/Oct/2000:13:55:36 -0700] (%t)
Die Uhrzeit, zu der die Anfrage empfangen wurde
Das Format ist
[Tag/Monat/Jahr:Stunde:Minute:Sekunde Zone] Tag = 2*Ziffer Monat = 3*Buchstabe Jahr = 4*Ziffer Stunde = 2*Ziffer Minute = 2*Ziffer Sekunde = 2*Ziffer Zone = (`+' | `-') 4*Ziffer
Es ist möglich, die Zeit in einem anderen Format anzuzeigen, indem %{format}t in der Logformatzeichenkette angegeben wird, wobei format entweder wie in strftime(3) aus der C-Standardbibliothek oder eines der unterstützten speziellen Token ist
- Weitere Informationen finden Sie in den mod_log_configFormatzeichenketten
- "GET /apache_pb.gif HTTP/1.0"("%r")
Die Anforderungszeile des Clients wird in doppelten Anführungszeichen angegeben
- Die Anforderungszeile enthält eine Vielzahl nützlicher Informationen
- Erstens ist die vom Client verwendete Methode GET
- Zweitens hat der Client die Ressource /apache_pb.gif angefordertund drittens hat der Client das Protokoll HTTP/1.0 verwendet
- Es ist auch möglich, einen oder mehrere Teile der Anforderungszeile unabhängig voneinander zu protokollieren
- Beispielsweise protokolliert der Formatierungsstring "%m %U%q %H" die Methode, den Pfad, die Abfragezeichenfolge und das Protokoll, was genau zur gleichen Ausgabe führt wie "%r"
- 200 (%>s)
Dies ist der Statuscode, den der Server an den Client zurücksendet
- Diese Information ist sehr wertvoll, da sie anzeigt, ob die Anfrage zu einer erfolgreichen Antwort (Codes beginnen mit 2), einer Umleitung (Codes beginnen mit 3), einem vom Client verursachten Fehler (Codes beginnen mit 4) oder einem Fehler im Server (Codes beginnen mit 5) geführt hat
Die vollständige Liste der möglichen Statuscodes finden Sie in der HTTP-Spezifikation (RFC2616 Abschnitt 10)
- 2326 (%b)
Der letzte Teil gibt die Größe des an den Client zurückgegebenen Objekts an, ohne die Antwort-Header
- Wenn kein Inhalt an den Client zurückgegeben wurde, lautet dieser Wert "-" um "0" für keinen Inhalt zu protokollieren, verwenden Sie stattdessen "%B"
Combined Log Format
Ein weiteres häufig verwendetes Format ist das Combined Log Format
Es kann wie folgt verwendet werden
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/access_log combined
Dieses Format entspricht genau dem Common Log Format, mit dem Zusatz von zwei weiteren Feldern
- Jedes der zusätzlichen Felder verwendet die Prozent-Direktive %{header}i, wobei header ein beliebiger HTTP-Request-Header sein kann
- Das Zugriffsprotokoll in diesem Format sieht wie folgt aus:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
Zusätzlichen Felder:
- "http://www.example.com/start.html"("%{Referer}i")
Der "Referer" (sic) HTTP-Anforderungsheader
- Dieser gibt die Website an, von der der Client angibt, weitergeleitet worden zu sein. (Dies sollte die Seite sein, die auf /apache_pb.gif verlinkt oder diese einbindet)
- "Mozilla/4.08 [en] (Win98; I ;Nav)"("%{User-agent}i\")
Der User-Agent-HTTP-Request-Header
- Dies sind die identifizierenden Informationen, die der Client-Browser über sich selbst meldet
Mehrere Zugriffsprotokolle
Mehrere Zugriffsprotokolle können einfach durch Angabe mehrerer CustomLog-Anweisungen in der Konfigurationsdatei erstellt werden
- Die folgenden Anweisungen erstellen beispielsweise drei Zugriffsprotokolle
- Das erste enthält die grundlegenden CLF-Informationen, während das zweite und dritte Referer- und Browserinformationen enthalten
- Die letzten beiden CustomLog-Zeilen zeigen, wie die Auswirkungen der ReferLog- und AgentLog-Anweisungen nachgeahmt werden können
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog-Protokolle/access_log common
CustomLog-Protokolle/referer_log "%{Referer}i -> %U"
CustomLog-Protokolle/agent_log "%{User-agent}i"
Dieses Beispiel zeigt auch, dass es nicht notwendig ist, mit der LogFormat-Direktive einen Spitznamen zu definieren
- Stattdessen kann das Protokollformat direkt in der CustomLog-Direktive angegeben werden
Bedingte Protokolle
Manchmal ist es sinnvoll, bestimmte Einträge aus den Zugriffsprotokollen auszuschließen, die auf den Merkmalen der Client-Anfrage basieren
- Dies lässt sich mithilfe von Umgebungsvariablen leicht bewerkstelligen
- Zunächst muss eine Umgebungsvariable festgelegt werden, die angibt, dass die Anfrage bestimmte Bedingungen erfüllt
- Dies wird in der Regel mit SetEnvIf erreicht
- Anschließend wird die env= Klausel der CustomLog-Direktive verwendet, um Anfragen einzuschließen oder auszuschließen, bei denen die Umgebungsvariable festgelegt ist
- Einige Beispiele
# Mark requests from the loop-back interface
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# Mark requests for the robots.txt file
SetEnvIf Request_URI "^/robots\.txt$" dontlog
# Log what remains
CustomLog logs/access_log common env=!dontlog
Als weiteres Beispiel können Sie Anfragen von englischsprachigen Personen in einer Logdatei und Anfragen von nicht englischsprachigen Personen in einer anderen Logdatei protokollieren
SetEnvIf Accept-Language "en" english
CustomLog logs/english_log common env=english
CustomLog logs/non_english_log common env=!english
In einem Caching-Szenario möchte man die Effizienz des Caches kennen
Eine sehr einfache Methode, dies herauszufinden, wäre:
SetEnv CACHE_MISS 1
LogFormat "%h %l %u %t ‚%r ‘ %>s %b %{CACHE_MISS}e" common-cache
CustomLog logs/access_log common-cache
mod_cache wird vor mod_env ausgeführt und liefert bei Erfolg den Inhalt ohne diese
- In diesem Fall wird ein Cache-Treffer protokolliert –während ein Cache-Fehler 1 protokolliert
Zusätzlich zur env=-Syntax unterstützt LogFormat Protokollierungswerte, die vom HTTP-Antwortcode abhängig sind:
LogFormat "%400,501{User-agent}i" browserlog
LogFormat "%!200,304,302{Referer}i" refererlog
Im ersten Beispiel wird der User-Agent protokolliert, wenn der HTTP-Statuscode 400 oder 501 lautet
- In anderen Fällen wird stattdessen ein "-" protokolliert
- Ebenso wird im zweiten Beispiel der Referer protokolliert, wenn der HTTP-Statuscode nicht 200, 304 oder 302 lautet. (Beachten Sie das "!" vor den Statuscodes
Obwohl wir gerade gezeigt haben, dass die bedingte Protokollierung sehr leistungsstark und flexibel ist, ist sie nicht die einzige Möglichkeit, den Inhalt der Protokolle zu steuern
- Protokolldateien sind nützlicher, wenn sie eine vollständige Aufzeichnung der Serveraktivität enthalten
- Oft ist es einfacher, die Protokolldateien einfach nachzubearbeiten, um Anfragen zu entfernen, die Sie nicht berücksichtigen möchten
Protokollrotation
Selbst auf einem mäßig ausgelasteten Server ist die Menge der in den Protokolldateien gespeicherten Informationen sehr groß
- Die Zugriffsprotokolldatei wächst in der Regel um 1 MB oder mehr pro 10.000 Anfragen
- Daher ist es notwendig, die Protokolldateien regelmäßig zu rotieren, indem die vorhandenen Protokolle verschoben oder gelöscht werden
- Dies kann nicht durchgeführt werden, während der Server läuft, da Apache httpd weiterhin in die alte Protokolldatei schreibt, solange die Datei geöffnet ist
- Stattdessen muss der Server neu gestartet werden, nachdem die Protokolldateien verschoben oder gelöscht wurden, damit neue Protokolldateien geöffnet werden
Durch einen sanften Neustart kann der Server angewiesen werden, neue Protokolldateien zu öffnen, ohne dass bestehende oder ausstehende Verbindungen von Clients verloren gehen
- Um dies zu erreichen, muss der Server jedoch weiterhin in die alten Protokolldateien schreiben, während er alte Anfragen bearbeitet
- Daher muss nach dem Neustart eine gewisse Zeit gewartet werden, bevor die Protokolldateien verarbeitet werden
- Ein typisches Szenario, bei dem die Protokolle einfach rotiert und die alten Protokolle komprimiert werden, um Speicherplatz zu sparen, sieht wie folgt aus:
mv access_log access_log.old
mv error_log error_log.old
apachectl graceful
sleep 600
gzip access_log.old error_log.old
Eine weitere Möglichkeit, die Protokollrotation durchzuführen, ist die Verwendung von verketteten Protokollen, wie im nächsten Abschnitt beschrieben
Verkettete Protokolle
Apache httpd kann Fehler- und Zugriffsprotokolldateien über eine Pipe an einen anderen Prozess schreiben, anstatt sie direkt in eine Datei zu schreiben
- Diese Funktion erhöht die Flexibilität der Protokollierung erheblich, ohne dass Code zum Hauptserver hinzugefügt werden muss
- Um Protokolle in eine Pipe zu schreiben, ersetzen Sie einfach den Dateinamen durch das Pipe-Zeichen "|", gefolgt vom Namen der ausführbaren Datei, die Protokolleinträge über ihre Standardeingabe akzeptieren soll
- Der Server startet den Piped-Log-Prozess, wenn der Server startet, und startet ihn neu, wenn er abstürzt, während der Server läuft
- Diese letzte Funktion ist der Grund, warum wir diese Technik als "zuverlässige Piped-Protokollierung" bezeichnen können
Piped-Log-Prozesse werden vom übergeordneten Apache-httpd-Prozess erzeugt und erben die Benutzerkennung dieses Prozesses
- Das bedeutet, dass Piped-Log-Programme normalerweise als root ausgeführt werden
- Es ist daher wichtig, die Programme einfach und sicher zu halten
Eine wichtige Funktion von verketteten Protokollen besteht darin, eine Protokollrotation zu ermöglichen, ohne den Server neu starten zu müssen
- Der Apache HTTP-Server enthält zu diesem Zweck ein einfaches Programm namens rotatelogs
- Um etwa die Protokolle alle 24 Stunden zu rotieren, können Sie Folgendes verwenden:
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
Beachten Sie, dass der gesamte Befehl, der für die Pipe aufgerufen wird, in Anführungszeichen gesetzt wird
- Obwohl diese Beispiele für das Zugriffsprotokoll gelten, kann dieselbe Technik für das Fehlerprotokoll verwendet werden
Wie bei der bedingten Protokollierung sind über die Pipe verbundene Protokolle ein sehr leistungsstarkes Tool, sollten jedoch nicht verwendet werden, wenn eine einfachere Lösung wie die Offline-Nachbearbeitung verfügbar ist
Standardmäßig wird der Piped-Log-Prozess ohne Aufruf einer Shell gestartet
- Verwenden Sie "|$" anstelle von "|", um eine Shell zu verwenden (normalerweise mit /bin/sh -c):
# "rotatelogs" über eine Shell aufrufen
CustomLog "|$/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
Dies war das Standardverhalten für Apache 2.2
- Je nach den Besonderheiten der Shell kann dies zu einem zusätzlichen Shell-Prozess für die Lebensdauer des Protokollierungs-Pipe-Programms und zu Problemen bei der Signalverarbeitung während des Neustarts führen
- Aus Gründen der Kompatibilität mit Apache 2.2 wird die Notation "||" ebenfalls unterstützt und ist gleichbedeutend mit der Verwendung von "|"
Windows-Hinweis
Beachten Sie, dass es unter Windows zu Problemen kommen kann, wenn viele Piped-Logger-Prozesse ausgeführt werden, insbesondere wenn HTTPD als Dienst ausgeführt wird
- Dies wird durch einen zu geringen Desktop-Heap-Speicherplatz verursacht
- Der Desktop-Heap-Speicherplatz, der jedem Dienst zugewiesen wird, wird durch das dritte Argument des SharedSection-Parameters im Registrierungswert
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\SubSystems\Windows
angegeben.
- Ändern Sie diesen Wert mit Vorsicht
Es gelten die üblichen Vorsichtsmaßnahmen für Änderungen an der Windows-Registrierung, aber Sie könnten auch den Desktop-Heap-Pool erschöpfen, wenn die Zahl zu hoch eingestellt wird.
Virtuelle Hosts
Beim Betrieb eines Servers mit vielen virtuellen Hosts gibt es mehrere Möglichkeiten, mit Protokolldateien umzugehen
- Zunächst ist es möglich, Protokolle genau wie bei einem Server mit einem Host zu verwenden
- Durch einfaches Platzieren der Protokollierungsanweisungen außerhalb der <VirtualHost>-Abschnitte im Hauptserverkontext ist es möglich, alle Anfragen im selben Zugriffs- und Fehlerprotokoll zu protokollieren
- Diese Technik ermöglicht keine einfache Erfassung von Statistiken zu einzelnen virtuellen Hosts
Wenn CustomLog- oder ErrorLog-Anweisungen innerhalb eines <VirtualHost>-Abschnitts platziert werden, werden alle Anfragen oder Fehler für diesen virtuellen Host nur in der angegebenen Datei protokolliert
- Bei jedem virtuellen Host, der keine Protokollierungsanweisungen hat, werden die Anfragen weiterhin an die Hauptserverprotokolle gesendet
- Diese Technik ist für eine kleine Anzahl virtueller Hosts sehr nützlich, aber wenn die Anzahl der Hosts sehr groß ist, kann sie kompliziert zu verwalten sein
- Darüber hinaus kann sie häufig Probleme mit unzureichenden Dateideskriptoren verursachen
Für das Zugriffsprotokoll gibt es einen sehr guten Kompromiss
- Durch Hinzufügen von Informationen über den virtuellen Host zur Protokollformatzeichenfolge ist es möglich, alle Hosts im selben Protokoll zu protokollieren und das Protokoll später in einzelne Dateien aufzuteilen
Betrachten Sie beispielsweise die folgenden Anweisungen
LogFormat "%v %l %u %t \"%r\" %>s %b" comonvhost
CustomLog logs/access_log comonvhost
Das %v wird verwendet, um den Namen des virtuellen Hosts zu protokollieren, der die Anfrage bearbeitet
- Anschließend kann ein Programm wie "split-logfile" verwendet werden, um das Zugriffsprotokoll nachzubearbeiten und es in eine Datei pro virtuellem Host aufzuteilen
Weitere Protokolldateien
Verwandte Module | Verwandte Anweisungen |
---|---|
Übertragene Byte
mod_logio fügt zwei zusätzliche LogFormat-Felder hinzu (%I und %O), die die tatsächliche Anzahl der im Netzwerk empfangenen und gesendeten Bytes protokollieren
Forensische Protokollierung
mod_log_forensic ermöglicht die forensische Protokollierung von Client-Anfragen
- Die Protokollierung erfolgt vor und nach der Verarbeitung einer Anfrage, sodass das forensische Protokoll zwei Protokollzeilen für jede Anfrage enthält
- Der forensische Logger ist sehr strikt und lässt keine Anpassungen zu
- Er kann ein unschätzbares Debugging- und Sicherheitswerkzeug sein
PID-Datei
Beim Start speichert Apache httpd die Prozess-ID des übergeordneten httpd-Prozesses in der Datei logs/httpd.pid
- Dieser Dateiname kann mit der PidFile-Anweisung geändert werden
- Die Prozess-ID wird vom Administrator zum Neustarten und Beenden des Daemons verwendet, indem Signale an den übergeordneten Prozess gesendet werden
- Unter Windows verwenden Sie stattdessen die Befehlszeilenoption -k
- Weitere Informationen finden Sie auf der Seite Stoppen und Neustarten
Skriptprotokoll
Um die Fehlersuche zu erleichtern, ermöglicht die ScriptLog-Direktive die Aufzeichnung der Eingabe und Ausgabe von CGI-Skripten
- Dies sollte nur zu Testzwecken verwendet werden – nicht für Live-Server
- Weitere Informationen finden Sie in der mod_cgi-Dokumentation
6 - Zugriffsrechte
Beschreibung
Die Art und Weise, wie die Autorisierung angewendet werden kann, ist jetzt viel flexibler als nur eine einzelne Prüfung gegen einen einzelnen Datenspeicher
- Ordnung, Logik und die Wahl, wie die Autorisierung durchgeführt werden soll, sind jetzt möglich
Anwenden von Logik und Reihenfolge
Die Kontrolle darüber, wie und in welcher Reihenfolge die Autorisierung durchgeführt wird, war in der Vergangenheit ein ziemliches Rätsel
- In Apache 2.2 wurde ein anbieterbasierter Authentifizierungsmechanismus eingeführt, um den eigentlichen Authentifizierungsprozess von der Autorisierung und den unterstützenden Funktionen zu entkoppeln
- Einer der Nebeneffekte war, dass die Authentifizierungsanbieter konfiguriert und in einer bestimmten Reihenfolge aufgerufen werden konnten, die nicht von der Ladereihenfolge des Auth-Moduls selbst abhing
- Derselbe Provider-basierte Mechanismus wurde auch für die Autorisierung übernommen
- Das bedeutet, dass die
Require
-Direktive nicht nur angibt, welche Autorisierungsmethoden verwendet werden sollen, sondern auch die Reihenfolge, in der sie aufgerufen werden - Mehrere Autorisierungsmethoden werden in der gleichen Reihenfolge aufgerufen, in der die
Require
-Direktiven in der Konfiguration erscheinen
Mit der Einführung von Autorisierungs-Container-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
- Siehe Authorization Containers für ein Beispiel, wie sie verwendet werden können, um komplexe Autorisierungslogik auszudrücken
Standardmäßig werden alle Require
-Direktiven so behandelt, als wären sie in einer <RequireAny>
-Container-Direktive enthalten
- Mit anderen Worten: Wenn eine der angegebenen Autorisierungsmethoden erfolgreich ist, wird die Autorisierung erteilt
Autorisierungsanbieter
- Verwendung von Autorisierungsanbietern für die Zugriffskontrolle
Die Authentifizierung mit Benutzername und Passwort ist nur ein Teil der Geschichte
- Häufig möchte man Personen auf der Grundlage anderer Kriterien als ihrer Identität Zugang gewähren
- Zum Beispiel, woher sie kommen
Mit den Berechtigungsanbietern all
, env
, host
und ip
können Sie den Zugriff auf der Grundlage anderer hostbasierter Kriterien wie dem Hostnamen oder der IP-Adresse des Rechners, der ein Dokument anfordert, erlauben oder verweigern
Die Verwendung dieser Provider wird durch die Direktive Require
festgelegt
- Diese Direktive registriert die Autorisierungsanbieter, die während der Autorisierungsphase der Anfrageverarbeitung aufgerufen werden
- Beispiel
Require ip <var>address</var>
wobei Adresse eine IP-Adresse (oder eine Teil-IP-Adresse) oder ist:
Require host <var>domain_name</var>
wobei domain_name ein voll qualifizierter Domänenname (oder ein teilweiser Domänenname) ist; Sie können mehrere Adressen oder Domänennamen angeben, falls gewünscht
Wenn Sie zum Beispiel jemanden haben, der Ihr Forum spammt, und Sie ihn davon abhalten wollen, könnten Sie Folgendes tun:
<RequireAll>
Require all granted
Require not ip 10.252.46.165
</RequireAll>
Besucher, die von dieser Adresse kommen, können den von dieser Richtlinie abgedeckten Inhalt nicht sehen
- Wenn Sie stattdessen einen Rechnernamen statt einer IP-Adresse haben, können Sie diesen verwenden
<RequireAll>
Require all granted
Require not host host.example.com
</RequireAll>
Und wenn Sie den Zugriff von einer ganzen Domäne aus blockieren möchten, können Sie auch nur einen Teil einer Adresse oder eines Domänennamens angeben:
<RequireAll>
Require all granted
Require not ip 192.168.205
Require not host phishers.example.com moreidiots.example
Require not host ke
</RequireAll>
Die Verwendung von <RequireAll>
mit mehreren <Require>
-Direktiven, die jeweils mit not
negiert werden, erlaubt den Zugriff nur, wenn alle negierten Bedingungen wahr sind
- Mit anderen Worten, der Zugriff wird blockiert, wenn eine der verneinten Bedingungen nicht erfüllt ist
Zugriffskontrolle Rückwärtskompatibilität
Einer der Nebeneffekte der Einführung eines providerbasierten Mechanismus für die Authentifizierung ist, dass die früheren Zugriffskontrolldirektiven Order
, Allow
, Deny
und Satisfy
nicht mehr benötigt werden
- Um jedoch Abwärtskompatibilität für ältere Konfigurationen zu gewährleisten, wurden diese Direktiven in das Modul
mod_access_compat
verschoben
- Hinweis
Die Direktiven von mod_access_compat
sind durch mod_authz_host
veraltet
- Das Mischen von alten Direktiven wie
Order
,Allow
oderDeny
mit neuen wieRequire
ist technisch möglich, aber nicht empfehlenswert - Das Modul
mod_access_compat
wurde erstellt, um Konfigurationen zu unterstützen, die nur alte Direktiven enthalten, um das 2.4 Upgrade zu erleichtern - Für weitere Informationen lesen Sie bitte die Upgrade-Anleitung
Authentifizierungs-Caching
Es kann vorkommen, dass die Authentifizierung eine inakzeptable Belastung für einen Anbieter oder Ihr Netzwerk darstellt
- Dies betrifft am ehesten Benutzer von
mod_authn_dbd
(oder von Drittanbietern/angepassten Providern) - Um dieses Problem zu lösen, führt HTTPD 2.3/2.4 einen neuen Caching-Provider
mod_authn_socache
ein, der die Anmeldedaten zwischenspeichert und die Belastung des/der Ursprungsprovider(s) reduziert
Dies kann für einige Benutzer eine erhebliche Leistungssteigerung bedeuten
Weitere Informationen
Sie sollten auch die Dokumentation für mod_auth_basic
und mod_authz_host
lesen, die weitere Informationen darüber enthalten, wie das Ganze funktioniert
- Die Direktive
<AuthnProviderAlias>
kann auch helfen, bestimmte Authentifizierungskonfigurationen zu vereinfachen
Die verschiedenen Chiffren, die der Apache für Authentifizierungsdaten unterstützt, werden in Passwortverschlüsselungen erläutert
Sie können auch einen Blick in die Anleitung zur Zugriffskontrolle werfen, in der eine Reihe verwandter Themen behandelt wird
Links
7 - Virtuelle Server
Apache/HTTP/Vhost - Mehrere Domains verwenden
Beschreibung
- Hauptserver
Definitionen außerhalb von <VirtualHost>-Abschnitte
- Virtuelle Server
- sogenannte vhosts
- Werden durch
<VirtualHost>-Abschnitte
definiert werden
Jede VirtualHost-Richtlinie
enthält eine oder mehrere Adressen und optionale Ports
- Hostnamen
- Hostnamen können anstelle von IP-Adressen in einer virtuellen Hostdefinition verwendet werden, aber sie werden beim Start aufgelöst, und wenn eine Namensauflösung fehlschlägt, werden diese virtuellen Hostdefinitionen ignoriert
- Dies wird daher nicht empfohlen
- Die Adresse kann als
*
angegeben werden, was einer Anfrage entspricht, wenn kein anderer vhost die explizite Adresse hat, unter der die Anfrage empfangen wurde
Die Adresse, die in der VirtualHost-Direktive
erscheint, kann einen optionalen Port haben
- Wenn der Port nicht angegeben ist, wird er als Platzhalter-Port behandelt, der auch explizit mit
*
angegeben werden kann - Der Platzhalter-Port passt auf jeden Port
- Die in der
VirtualHost-Direktive
angegebenen Portnummern haben keinen Einfluss darauf, an welchen Portnummern der Apache lauscht, sie steuern nur, welcherVirtualHost
für die Bearbeitung einer Anfrage ausgewählt wird - Verwenden Sie die
Listen-Direktive
, um die Adressen und Ports zu steuern, an denen der Server lauscht
Die Gesamtheit der Adressen (einschließlich mehrerer Ergebnisse von DNS-Abfragen) wird als Adressensatz des vhost bezeichnet
Der Apache unterscheidet automatisch auf der Grundlage des vom Client übermittelten HTTP-Host-Headers
, wenn die spezifischste Übereinstimmung für eine IP-Adresse und eine Port-Kombination in mehreren virtuellen Hosts aufgeführt ist
Die Richtlinie ServerName
kann an jeder beliebigen Stelle innerhalb der Definition eines Servers erscheinen
- Jedes Vorkommen überschreibt jedoch das vorherige Vorkommen (innerhalb dieses Servers)
- Wenn kein
Servername
angegeben ist, versucht der Server, ihn aus der IP-Adresse des Servers abzuleiten
Der erste namensbasierte vhost in der Konfigurationsdatei für ein bestimmtes IP:Port-Paar ist von Bedeutung, da er für alle Anfragen verwendet wird, die an dieser Adresse und diesem Port eingehen und für die kein anderer vhost für dieses IP:Port-Paar einen passenden ServerName oder ServerAlias hat
- Er wird auch für alle SSL-Verbindungen verwendet, wenn der Server die Server Name Indication nicht unterstützt
Die vollständige Liste der Namen in der VirtualHost-Direktive
wird wie ein (nicht wildcard) ServerAlias
behandelt (wird aber nicht durch eine ServerAlias-Anweisung
überschrieben)
Für jeden vhost werden verschiedene Standardwerte festgelegt
Insbesondere:
- Wenn ein vhost keine
ServerAdmin-
,Timeout-
,KeepAliveTimeout-
,KeepAlive-
,MaxKeepAliveRequests-
,ReceiveBufferSize-
oderSendBufferSize-Direktive
hat, wird der entsprechende Wert vom Hauptserver geerbt. (Das heißt, er wird von der endgültigen Einstellung dieses Wertes auf dem Hauptserver geerbt) - Die "lookup defaults", die die Standardverzeichnisberechtigungen für einen vhost festlegen, werden mit denen des Hauptservers zusammengeführt
- Dies gilt auch für alle verzeichnisbezogenen Konfigurationsinformationen für jedes Modul
- Die Serverkonfigurationen für jedes Modul des Hauptservers werden auf dem vhost-Server zusammengeführt
Im Wesentlichen wird der Hauptserver als "Standard" oder "Basis" behandelt, auf der jeder vhost aufgebaut wird
- Die Positionierung dieser Hauptserver-Definitionen in der Konfigurationsdatei ist jedoch weitgehend irrelevant - die gesamte Konfiguration des Hauptservers wurde geparst, als diese endgültige Zusammenführung stattfand
- Selbst wenn eine Hauptserver-Definition nach einer Vhost-Definition erscheint, kann sie also die Vhost-Definition beeinflussen
Wenn der Hauptserver zu diesem Zeitpunkt keinen Servernamen
hat, wird stattdessen der Hostname des Rechners, auf dem httpd
läuft, verwendet
- Als Hauptserver-Adressensatz werden die IP-Adressen bezeichnet, die durch eine DNS-Suche nach dem
ServerName
des Hauptservers zurückgegeben werden
Bei undefinierten ServerName-Feldern
wird bei einem namensbasierten vhost standardmäßig die Adresse verwendet, die in der VirtualHost-Anweisung
, die den vhost definiert, an erster Stelle steht
Jeder vhost, der den magischen Platzhalter _default_
enthält, erhält denselben Servernamen
wie der Hauptserver
Aufruf
Aufruf virtuelle Hosts
- Abgleich von virtuellen Hosts
Der Server bestimmt wie folgt, welcher vhost für eine Anfrage zu verwenden ist:
IP-Adressen-Suche
Wenn die Verbindung zum ersten Mal über eine bestimmte Adresse und einen bestimmten Port empfangen wird, sucht der Server nach allen VirtualHost-Definitionen
, die dieselbe IP-Adresse und denselben Port haben
Wenn es keine exakten Übereinstimmungen für die Adresse und den Anschluss gibt, werden Wildcard-Übereinstimmungen (*
) berücksichtigt
Wird keine Übereinstimmung gefunden, wird die Anfrage vom Hauptserver bearbeitet
Wenn es VirtualHost-Definitionen
für die IP-Adresse gibt, ist der nächste Schritt die Entscheidung, ob es sich um einen IP-basierten oder einen namensbasierten vhost handelt
IP-basierter vhost
Wenn es genau eine VirtualHost-Direktive
gibt, die die Kombination aus IP-Adresse und Port auflistet, die als beste Übereinstimmung ermittelt wurde, werden keine weiteren Aktionen durchgeführt und die Anfrage wird von dem passenden vhost bedient
Namensbasierter vhost
Wenn es mehrere VirtualHost-Direktiven
gibt, in denen die IP-Adress- und Port-Kombination aufgeführt ist, die als beste Übereinstimmung ermittelt wurde, bezieht sich die "Liste" in den verbleibenden Schritten auf die Liste der übereinstimmenden vhosts in der Reihenfolge, in der sie in der Konfigurationsdatei stehen
Wenn die Verbindung SSL verwendet, der Server die Server Name Indication unterstützt und der Handshake des SSL-Clients die TLS-Erweiterung mit dem angeforderten Hostnamen enthält, wird dieser Hostname weiter unten verwendet, genauso wie der Host:
Header bei einer Nicht-SSL-Verbindung verwendet werden würde
- Andernfalls wird der erste namensbasierte vhost, dessen Adresse übereinstimmt, für SSL-Verbindungen verwendet
- Dies ist wichtig, weil der vhost bestimmt, welches Zertifikat der Server für die Verbindung verwendet
Wenn die Anfrage ein Host:
-Headerfeld enthält, wird die Liste nach dem ersten vhost mit einem übereinstimmenden ServerName
oder ServerAlias
durchsucht, und die Anfrage wird von diesem vhost bedient
- Ein
Host:
Header-Feld kann eine Portnummer enthalten, aber der Apache ignoriert sie immer und gleicht sie mit dem echten Port ab, an den der Client die Anfrage gesendet hat
Der erste vhost in der Konfigurationsdatei mit der angegebenen IP-Adresse hat die höchste Priorität und fängt jede Anfrage an einen unbekannten Servernamen oder eine Anfrage ohne Host:
Header-Feld (wie eine HTTP/1.0-Anfrage) ab
Dauerhafte Verbindungen
Die oben beschriebene IP-Abfrage wird nur einmal für eine bestimmte TCP/IP-Sitzung durchgeführt, während die Namensabfrage bei jeder Anfrage während einer KeepAlive/Persistent-Verbindung erfolgt
- Mit anderen Worten ein Client kann während einer einzigen dauerhaften Verbindung Seiten von verschiedenen namensbasierten vhosts anfordern
Absoluter URI
Wenn der URI aus der Anfrage ein absoluter URI ist und sein Hostname und Port mit dem Hauptserver oder einem der konfigurierten virtuellen Hosts übereinstimmen und mit der Adresse und dem Port übereinstimmen, an die der Client die Anfrage gesendet hat, dann wird das Schema/Hostname/Port-Präfix entfernt und der verbleibende relative URI wird von dem entsprechenden Hauptserver oder virtuellen Host bedient
- Stimmt er nicht überein, bleibt der URI unberührt und die Anfrage wird als Proxy-Anfrage gewertet
Beobachtungen
- Das namensbasierte virtuelle Hosting ist ein Verfahren, das angewendet wird, nachdem der Server den am besten passenden IP-basierten virtuellen Host ausgewählt hat
- Wenn es Ihnen egal ist, mit welcher IP-Adresse sich der Client verbunden hat, verwenden Sie ein "*" als Adresse jedes virtuellen Hosts, und das namensbasierte virtuelle Hosting wird auf alle konfigurierten virtuellen Hosts angewendet
ServerName-
undServerAlias-Prüfungen
werden nie für einen IP-basierten vhost durchgeführt- Nur die Reihenfolge der namensbasierten vhosts für einen bestimmten Adressensatz ist von Bedeutung
- Derjenige namensbasierte vhosts, der in der Konfigurationsdatei an erster Stelle steht, hat die höchste Priorität für seinen entsprechenden Adressensatz
- Ein Port im
Host:
Header-Feld wird beim Abgleich niemals verwendet- Der Apache verwendet immer den echten Port, an den der Client die Anfrage gesendet hat
- Wenn zwei vhosts eine gemeinsame Adresse haben, fungieren diese gemeinsamen Adressen implizit als namensbasierte virtuelle Hosts
- Dies ist ein neues Verhalten ab 2.3.11
- Der Hauptserver wird nur dann für eine Anfrage verwendet, wenn die IP-Adresse und die Portnummer, mit der sich der Client verbunden hat, mit keinem vhost übereinstimmen (auch nicht mit einem
*
vhost)- Mit anderen Worten, der Hauptserver fängt nur eine Anfrage für eine nicht spezifizierte Adresse/Port-Kombination ab (es sei denn, es gibt einen
_Standard_
vhost, der zu diesem Port passt)
- Mit anderen Worten, der Hauptserver fängt nur eine Anfrage für eine nicht spezifizierte Adresse/Port-Kombination ab (es sei denn, es gibt einen
- Sie sollten niemals DNS-Namen in
VirtualHost-Direktiven
angeben, da dies Ihren Server dazu zwingt, sich beim Booten auf DNS zu verlassen- Außerdem stellt es ein Sicherheitsrisiko dar, wenn Sie nicht die DNS für alle aufgeführten Domänen kontrollieren
- Zu diesem und den nächsten beiden Themen gibt es weitere Informationen
ServerName
sollte immer für jeden vhost festgelegt werden- Andernfalls ist ein DNS-Lookup für jeden vhost erforderlich
- Tipp
- Zusätzlich zu den Tipps auf der Seite über DNS-Probleme finden Sie hier einige weitere Tipps:
- Platzieren Sie alle Hauptserver-Definitionen vor allen
VirtualHost-Definitionen
. (Dies dient der besseren Lesbarkeit der Konfiguration - der Post-Config-Merging-Prozess macht es nicht offensichtlich, dass Definitionen, die um virtuelle Hosts herum gemischt sind, alle virtuellen Hosts betreffen könnten)
IP-basierte virtuelle Server
Namensbasierte virtuelle Server
Namensbasierte virtuelle Server
8 - Verschlüsselung
Apache/HTTP/SSL - Beschreibung
Beschreibung
Was ist SSL/TLS
Funktionsweise von SSL/TLS
Digitale Zertifikate
SSL/TLS installieren
9 - PHP
- mod_php
- mod_php
Beschreibung
10 - Proxy-Server
11 - Sicherheit
Apache/HTTP/Sicherheit - Beschreibung