====== Web-Server ======
===== Apache =====
Download: [[http://httpd.apache.org/download.cgi]]
Dokumentation zum Apache HTTP Server Version 2.4: [[http://httpd.apache.org/docs/2.4/]] (in deutsch)\\
Apache-Konfiguration: [[https://httpd.apache.org/docs/2.4/de/mod/core.html]]
Die verwendete Version von Apache:
juergen@ubuntu:~/src/apache$ /opt/install24/bin/httpd -v
Server version: Apache/2.4.33 (Unix)
Server built: May 29 2018 17:30:50
juergen@ubuntu:~/src/apache$
Oder:
juergen@ubuntu:~/src/apache$ /opt/install24/bin/httpd -V
Server version: Apache/2.4.33 (Unix)
Server built: May 29 2018 17:30:50
Server's Module Magic Number: 20120211:76
Server loaded: APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/opt/servers"
-D SUEXEC_BIN="/opt/servers/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
juergen@ubuntu:~/src/apache$
:!: Die Verwendung des Steuerskripts **[[https://httpd.apache.org/docs/2.4/de/programs/apachectl.html|apachectl]]** ist die empfohlene Methode, das [[https://httpd.apache.org/docs/2.4/de/programs/httpd.html|httpd]]-Programm zu starten. Dieses Skript setzt verschiedene **Umgebungsvariablen**, die für die korrekte Funktion von httpd unter einigen Betriebssystemen notwendig sind, und startet dann das httpd-Programm. apachectl reicht alle **Kommandozeilenargumente** durch, so dass alle httpd-Optionen auch mit apachectl verwendet werden können.
Apache starten:
# apachectl start
Beenden (sofort beenden):
# apachectl stop
Neustarten (sofort neustarten):
# apachectl restart
Neustarten ohne bestehende Verbindungen hart abzubrechen:
# apachectl graceful
Beenden ohne bestehende Verbindungen hart abzubrechen:
# apachectl graceful-stop
Aktuelle Konfigurationsdatei auf syntaktische Richtigkeit testen:
# apachectl configtest
:!: Um Apache im **Debug-Modus** zu starten, gibt man bei Start den Parameter **-X**. In diesem Modus ist nur ein einziger Worker-Prozess bzw. -Thread verfügbar und die Verbindung zum startenden Terminal wird nicht gelöst, sodass eventuelle Fehlermeldungen und Warnungen auf der Konsole erscheinen.
Nur einige kleine Beispiele hier.
==== httpd.conf ====
Die zentrale Konfigurationsdatei von Apache heißt **httpd.conf** und liegt defaultmäßig im Unterverzeichnis "conf".\\ Durch den Parameter **-f** kann eine andere Konfigurationsdatei (aus dem gleichen Unterverzeichnis) erzwungen werden.
httpd -k start -f AlternativesConfigFile
Für die Entwicklungs- und Testzwecke kann es hilfreich sein (:!: **Vorsicht** - das öffnet eine Sicherheitslücke!), zwei Handler **server-info** und **server-status** (mittels **SetHandler** in der "httpd.conf") zu aktivieren.
SetHandler server-info
Order deny,allow
Deny from all
Allow from 10.20.30.40
SetHandler server-status
Order deny,allow
Deny from all
Allow from 10.20.30.40
Wobei mit den Zahlen "10.20.30.40" die IP-Adresse gemeint ist, von der die Requests erlaubt sind. (:!: Diese Zugriffseinschränkung soll unbedingt ernst genommen werden!)
Für die o.g. Handler zuständige Module sollen vorher geladen sein (ebenfalls in "httpd.conf"):
LoadModule info_module modules/mod_info.so
LoadModule status_module modules/mod_status.so
:!: **ACHTUNG:**\\ Diese beiden Handler haben in den aus dem Internet erreichbaren produktiven Umgebungen aus Sicherheitsgründen nichts zu suchen!
Danach führt ein Aufruf wie etwa [[http://www.meine-webseite.tld/_info]] zur Anzeige der internen Server-Informationen.
Der Aufruf a la [[http://www.meine-webseite.tld/_status]] zeigt den aktuellen Status des WebServers.\\ Durch einen zusätzlichen Parameter nach dem Muster "refresh=AnzahlSekunden" läßt sich die Anzeige automatisch alle "AnzahlSekunden" aktualisieren.\\ Hier beispielsweise alle 60 Sekunden:\\ [[http://www.meine-webseite.tld/_status?refresh=60]]
:!: **Sicherheitshinweis wegen CGI:**\\ Wenn der WebServer außerhalb der speziellen (in "httpd.conf" definierten) "cgi-bin"-Verzeichnisse weitere CGI-Skripte enthält, deren Endungen nicht mittels "AddHandler" als ausführbar markiert sind, werden diese vom Server im Quelltext ausgeliefert.
Um z.B. Dateien mit den Endungen ".cgi", ".pl" und ".sh" als ausführbare CGI-Skripte zu konfigurieren, muss folgende Anweisung verwendet werden:
AddHandler cgi-script .cgi .pl .sh
Unterschiede zwischen **AddHandler** und **SetHandler**:
* AddHandler: [[http://httpd.apache.org/docs/2.4/mod/mod_mime.html#addhandler]]
* SetHandler: [[http://httpd.apache.org/docs/2.4/mod/core.html#sethandler]]
==== .htaccess ====
Zugriffsschutz bzw. Zugriffssteuerung mittels **.htaccess** - Server-Konfigurationsdateien für Web-Verzeichnisse.
:!: Hier ist nur eine __sehr kurze__ Zusammenfassung von einigen Parameter. Für eine vollständige Beschreibung siehe Links unten.
Der Webserver überprüft bei jedem einzelnen Seitenzugriff (ohne zu cachen) vom angeforderten Dokument aus rekursiv sämtliche Verzeichnisse, ob ein ".htaccess" vorhanden ist. ".htaccess" gilt somit für das Verzeichnis, in dem es selbst liegt und für alle Unterverzeichnisse, und deren Unterverzeichnisse u.s.w., bis evtl. ein anderes ".htaccess" vorkommt. Ab dort und weiter nach unten gelten die Einstellungen aus dem neuen ".htaccess".
=== Passwortschutz ===
Hier ein Beispiel für ein **.htaccess**-File:
# .htaccess - Beispiel für Verzeichnisschutz durch Passwort
#
# "AuthType Basic" - ist unverschlüsselt und daher unsichen
# "AuthType Digest" - verschlüsselte Form
AuthType Digest
#
# Text der Aufforderung:
AuthName "Authentifizierung erforderlich"
#
# File (mit absolutem Pfad), in dem Namen der autorisierten User samt ihrer Passwörter gespeichert sind:
AuthUserFile /usr/lib/apache/.htusers
#
# Das gleiche, nur für Gruppen:
AuthGroupFile /usr/lib/apache/.htgroups
#
# Je nachdem, ob der Zugriff auf User- oder Gruppenebene:
# Require user
# Require group
# Hier ist der Zugriff nur den Usern "juergen" und "hans" erlaubt:
Require user juergen hans
#
# EOF
Ein Beispiel für das **.htusers**-File (Passwörter sind nach den Methoden **Crypt** oder **MD5** verschlüsselt):
# User:Passwort
#
juergen:6P8j1UCXLcKRk
hans:e9pUNh16clXUY
albert:qxj6oH5LqWfTw
user1:1WetnNRmB6xRI
user2:xTLC77u/vOMBc
userN:1Kp9H1stUJibs
#
# EOF
Ein kleines Programm namens **htpasswd** (wird zusammen mit dem Apache geliefert) hilft bei der Erstellung des Passwort-Files.
Durch...
htpasswd -c .htusers juergen
...wird ein neues Passwort-File namens ".htusers" angelegt und nach der Eingabe des Passworts der User "juergen" samt verschlüsseltem Passwort dort eingetragen.
Ein Beispiel für das **.htgroups**-File:
# GruppenName: User1 User2 User3
#
WebEntwicklerTeam: max andreas karmen
#
# EOF
=== Zugriffsbegrenzung auf konkrete IP-Adressen, IP-Bereiche oder DNS-Adressen ===
Hier ein Beispiel für ein **.htaccess**-File:
# Erst die Reihenfolge:
Order deny,allow
#
# Zugriff von der Domain "aol.com" verbieten:
Deny from .aol.com
#
# Zugriff aus dem IP-Bereich 192.168.*.* verbieten:
Deny from 192.168
#
# Zugriff von der IP-Adresse 10.1.2.3 erlauben:
Allow from 10.1.2.3
#
# EOF
Wobei **Deny from all** oder **Allow from all** würde ein generelles Verbot oder Erlaubnis bedeuten.
=== Verzeichnis-Browsing ===
FIXME
----
Externe Links:
* SELFHTML: [[http://de.selfhtml.org/servercgi/server/htaccess.htm|.htaccess]] - Server-Reaktionen kontrollieren
* DrupalCenter.de: [[http://www.drupalcenter.de/faq/1932|.htaccess - Wofür brauche ich diese Datei und was bedeuten die ganzen Optionen?]]
==== Content Negotiation ====
Webserver kann unterschiedliche Fassungen einer Ressource liefern.
Beispiel:\\ Wenn Dateien in einer Website mit einer zusätzlichen Endung abgespeichert sind, die jeweils einem ISO-Sprachcode entsprechen, wertet Apache den Header "Accept-Language" der Anfrage aus und liefert eine der Dateien **index.html.de** (Deutsch), **index.html.en** (Englisch) oder **index.html.fr** aus, obwohl der entsprechende Hyperlink nur auf **index.html** lautete.
=== Files mit "Multiple Extensions" ===
Files können mehr als eine Erweiterung haben. Die Rehenfolge dieser Erweiterungen ist normalerweise irrelevant. Zum Beispiel, wenn das File "welcome**.html.fr**" verweist auf den Content-Typ "text/html" und die Sprache "French", dann das File "welcome**.fr.html**" verweist auf exakt die gleiche Information.\\ Falls das Mapping mehrdeutig interpretiert werden kann, überwiegt die Erweiterung, die am rechtesten im Namen steht. Zum Beispiel, wenn ".gif" auf Media-Typ "image/gif" und ".html" auf "text/html" verweisen, dann das File "welcome.gif.html" wird mit dem Media-Typ "text/html" assoziiert.
Falls man erreichen möchte, dass ausschliesslich die **letzte** Erweiterung ausgewertet wird, dann sollte die Direktive **%%Add*%%** nicht benutzt werden. Zum Beispiel, falls das File "foo.html.cgi" als CGI-Skript behandelt werden soll, jedoch nicht das File "bar.cgi.html", dann sollte man anstelle "**AddHandler cgi-script .cgi**" in "httpd.conf" folgendes Konstrukt verwenden:
# Configure handler based on final extension only
SetHandler cgi-script
Quelle: [[http://httpd.apache.org/docs/2.4/mod/mod_mime.html#multipleext]]
===== robots.txt =====
:!: **robots.txt** hat zwar nichts mit dem WebServer zu tun, gehört aber i.d.R. zur Austattung eines Web-Auftritts.
Die Datei enthält Anweisungen für Robots von Suchmaschinen, welcher Such-Robot welche Verzeichnisse auslesen darf und welche nicht. "robots.txt" (alles klein geschrieben) muss im root-Verzeichnis der Domain liegen (als Beispiel: %%http://www.domainname.tld/robots.txt%%).
So könnte die "robots.txt" aussehen (es wird hier keinem Suchmaschinen-Robot erlaubt, irgendetwas auszulesen):
# robots.txt zu http://www.domainname.tld/
User-agent: *
Disallow: /
# EOF
----
Externe Links:
* SELFHTML: [[http://de.selfhtml.org/diverses/robots.htm|robots.txt]] - Robots kontrollieren
===== Schutz gegen DoS =====
Hier sind einige Module erwähnt, die es helfen, bei einem DoS den Schaden zu begrenzen:
* mod_evasive - Begrenzt Traffik pro Client-IP.
* mod_cband - Steuert die Bandbreite und Anzahl von Connections.
* mod_load_average - Generiert HTTP-Response 503 (Server is too busy), falls der Server zu stark ausgelastet ist.
* mod_robots - Versucht Robots fern zu halten.
===== sonstiges =====
Programme für [[EDV:PRG:Apache]] schreiben: z.B. als CGI (Plugins) oder Apache-Module.
**Makros** vereinfachen Apache-Konfiguration: [[https://www.admin-magazin.de/News/Tipps/Makros-vereinfachen-Apache-Konfiguration]] (Mit dem Modul namens "mod_macro".)
===== Weitere WebServer =====
* lighttpd - Leichtgewichtiger HTTP-Server. Arbeitet nicht mit Forking oder Threading, sondern rein eventbasiert bzw. asynchron.
* nginx\\ Nginx-Konfiguration: [[http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens]]
* Zeus - Ein kommerzieller WebServer für UNIX-Systeme.
* Tomcat - AppServer inklusive WebServer.
----
Stand: 11.09.2021
EOF