[[Vorlage(Getestet, focal)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Paketinstallation_DEB: Ein einzelnes Paket installieren] [:Editor: Einen Editor öffnen] [:mit_Root-Rechten_arbeiten: Root-Rechte] }}} [[Inhaltsverzeichnis()]] [[Bild(./hiawathalogo.png, 48, align=left)]] [https://www.hiawatha-webserver.org// Hiawatha] {en} ist ein schlanker [wikipedia:Webserver:], der sich durch einfache Konfiguration, hohe Performance, interessante Sicherheitsfunktionen und plattformübergreifende Unterstützung (Linux, BSD, Mac OS X und Windows) auszeichnet. Das Programm unterstützt verschiedene Interpreter-Sprachen (PHP, Perl, Python und Ruby), die Anbindung von Datenbanken wie [:MySQL:] oder [:MariaDB:] und die Internet-Protokolle IPv4 und [:IPv6:]. Bei HTTPS-Verbindungen kommt [wikipedia:mbed TLS:] zum Einsatz, so dass Hiawatha vom [wikipedia:Heartbleed:Heartbleed-Bug] Anfang 2014 nicht betroffen war. Das bereits seit 2002 bestehende, aber relativ unbekannte Open-Source-Projekt reiht sich wie [:lighttpd:] und [:nginx:] in die Liste der Apache-Alternativen ein. = Sicherheitsfunktionen = Wie eingangs erwähnt, bietet Hiawatha standardmäßig diverse Sicherheitsfunktionen gegen die wichtigsten Angriffsvektoren wie: * [wikipedia:Denial_of_Service:Denial of Service] (DoS) und DDoS * [wikipedia:SQL-Injection:] * [wikipedia:Cross-Site-Scripting:Cross-Site-Scripting] (XSS) an. Dabei können Angriffe nicht nur präventiv identifiziert, sondern auch aktiv abgewehrt werden. Während Apache für diesen Zweck nachladbare Module verwendet (siehe [:Apache/Sicherheit:]), sind diese Funktionen bei Hiawatha integriert. = Installation = [[Bild(Wiki/Icons/synaptic.png, 48, align=right)]] Hiawatha ist kein Bestandteil der offiziellen Paketquellen. Man muss zur Installation daher entweder ein Fremdpaket benutzen oder das Programm selbst aus dem Quelltext kompilieren. Entscheidet man sich für letztere Variante, helfen die Anleitung [https://www.hiawatha-webserver.org/howto/compilation_and_installation Compilation and Installation] {en} und die am Ende des Artikels genannten [#Links Links] weiter. == Fremdpaket == Einfach zu installierende Fremdpakete für 32- und 64-bit-Systeme können [https://files.tuxhelp.org/hiawatha/ heruntergeladen] {dl} {en} und manuell installiert werden [1]. [[Vorlage(Fremd, Paket, "Empfehlenswert ist eine Überprüfung der Datei-Integrität anhand der auf der Downloadseite hinterlegten Prüfsummen (siehe [:Hashfunktionen:]).")]] ##aasche: ungetestet ##== Fremdquelle == ##Alternativ steht eine Fremdquelle für Debian zur Verfügung--(, die auch mit Ubuntu genutzt werden kann)--. ## ##deb http://apt.sparkz.no/debian/ wheezy main ## ##[[Vorlage(Fremdquelle-auth, key DC242980)]] == Update == Bei beiden Installationsvarianten müssen (Sicherheits-)Updates von Hand eingespielt werden. Wurde ein Fremdpaket verwendet, besteht der Update-Vorgang aus folgenden Schritten: 1. Beenden des Webservers: {{{#!vorlage Befehl sudo /etc/init.d/hiawatha stop }}} 1. Sichern der Konfiguration: {{{#!vorlage Befehl sudo cp /etc/hiawatha/hiawatha.conf /root/hiawatha_hiawatha.conf }}} 1. Deinstallation (inkl. Konfiguration): {{{#!vorlage Befehl sudo dpkg -P hiawatha }}} 1. Herunterladen und Installieren eines neueren Fremdpakets (siehe oben) 1. Zurückspielen der Konfiguration: {{{#!vorlage Befehl sudo cp /root/hiawatha_hiawatha.conf /etc/hiawatha/hiawatha.conf }}} 1. Anschließend prüft man, ob die bestehende Konfiguration mit der neuen Programmversion kompatibel ist: {{{#!vorlage Befehl sudo hiawatha -k }}} {{{ Using /etc/hiawatha/hiawatha.conf Reading hiawatha.conf Configuration OK }}} 1. Neustart des Webservers: {{{#!vorlage Befehl sudo /etc/init.d/hiawatha restart }}} = Konfiguration = Die Konfiguration erfolgt ausschließlich über eine einzige Datei: '''/etc/hiawatha/hiawatha.conf''' [2][3]. Die Syntax folgt dem Schema `Variablenname = Variablenwert`, wobei zusammengehörende Werte in einer Sektion, umschlossen von geschweiften Klammern, stehen. Im Anschluss eine Auswahl der essentiellen Variablen – eine komplette Liste enthält die [https://www.hiawatha-webserver.org/manpages Manpage] {en}. == Binding == Zuerst wird festgelegt, auf welchem Port der Webserver lauschen soll. Das folgende Beispiel nutzt Port `80` als Standard-Port für HTTP. Möchte man Hiawatha ohne Root-Rechte starten können, muss man einen Port größer als `1024` wählen. Oft wird z.B. auf Port `8080` ausgewichen. {{{ Binding { Port = 80 } }}} Hierbei antwortet der Webserver auf Anfragen von allen Netzwerkkarten. Mit dem Schlüsselwort ''"Interface"'' kann man dies auf eine bestimmte Netzwerkschnittstelle begrenzen, etwa zum Testen, um den Webserver nur vom eigenen PC oder lokalen Netzwerk zu erreichen. Der eigene PC lauscht dabei immer auf `127.0.0.1`, siehe [wikipedia:localhost:]. {{{ Binding { Port = 80 Interface = 127.0.0.1 # Zugriff nur über eigenen PC } Binding { Port = 80 Interface = 192.168.0.10 # Zugriffe aus dem lokalen Netzwerk 192.168.0.x } }}} Möchte man mehrere Ports/Interfaces angeben, so erstellt man je eine neue Binding-Sektion. === TLS === Verschlüsselte HTTPS-Verbindungen gehen über den Standard-Port `443` und benötigen ein X509-Zertifikat, dessen Pfad mit '''TLScertFile''' angegeben wird. {{{ Binding { Port = 443 TLScertFile = Zertifikat.pem } }}} [wikipedia:Transport_Layer_Security:SSL]-Zertifikate können bei einer "Certificate Authority" ([:CA:]) kommerziell erworben werden und dienen dazu, die Identität des Webseitenbetreibers zu bestätigen. Ein solches Zertifikat kann man sich mit [:ssl-cert:] auch selbst generieren, wobei die meisten Browser einem selbstsigniertem Zertifikat per se nicht vertrauen und einen Warnhinweis anzeigen. Hiwatha erlaubt auch [wikipedia:Server_Name_Indication:Server Name Indication], die Auslieferung mehrerer SSL-Websites über eine IP-Adresse (siehe Abschnitt [#SNI SNI] weiter unten). == Virtual Hosts == Wer Virtual Hosts nutzen möchte, kann dies auch zwei Arten umsetzen. Zum einen im entsprechenden Abschnitt: {{{ VirtualHost { Hostname = www.meine-domain.de WebsiteRoot = /var/www/meine-domain/public StartFile = index.php AccessLogfile = /var/www/meine-domain/log/access.log ErrorLogfile = /var/www/meine-domain/log/error.log TimeForCGI = 5 UseFastCGI = PHP5 } }}} oder mit externen Dateien in den Ordnern '''/etc/hiawatha/enable-sites/''' bzw. '''/etc/hiawatha/disable-sites'''. Bevorzugt man die zweite Möglichkeit, benötigt es allerdings noch eine entsprechende Anweisung: {{{ # DEFAULT WEBSITE ... Include /etc/hiawatha/enable-sites/ }}} Auf diesem Weg ist es möglich, einen bestimmten Host zeitweilig zu deaktivieren: {{{#!vorlage Befehl sudo mv /etc/hiawatha/enable-sites/meine-domain.de /etc/hiawatha/disable-sites/ sudo /etc/init.d/hiawatha restart }}} == SNI == Ein Beispiel für Server Name Indication: {{{ Binding { Port = 443 TLScertFile = Zertifikat.pem } VirtualHost { Hostname = www.meine-domain.de ... TLScertFile = Website_A.pem } VirtualHost { Hostname = www.meine-andere-domain.de ... TLScertFile = Website_B.pem } }}} == Prävention und Abwehr von Angriffen == Da immer mehr Webserver dem Cyber-Vandalismus oder anderen Angriffen zum Opfer fallen, zählen die integrierten Sicherheitsfunktionen zu den interessanten Argumenten pro Hiawatha. Ein kurzes Beispiel (weitere Optionen sind den nachfolgenden Tabellen zu entnehmen): {{{ # BANNING SETTINGS # Deny service to clients who misbehave. # BanOnGarbage = 300 BanOnInvalidURL = 60 BanOnMaxPerIP = 5 BanOnMaxReqSize = 300 BanOnWrongPassword = 6:900 BanOnSQLi = 900 KickOnBan = yes RebanDuringBan = yes BanlistMask = deny LOCALHOST, deny LAN, deny WLAN }}} {{{#!vorlage Tabelle <-2 rowclass="titel"> Prävention von Angriffen +++ Option Beschreibung +++ `MaxServerLoad = N` Wenn der Server eine höhere Last als `N` hat, verwirft Hiawatha alle eingehenden Verbindungen (drop). +++ `MaxUrlLength = N` Die maximale Pfadlänge innerhalb einer URL, die als noch akzeptabel definiert ist. Ansonsten erfolgt eine Antwort mit dem Fehlercode [wikipedia:HTTP-Statuscode#4xx_.E2.80.93_Client-Fehler:414 Request-URL Too Long] +++ `MaxRequestSize = N` Die maximale Größe einer Anfrage (request) in KiB, die Hiawatha akzeptieren soll (PUT-Anfragen nicht eingeschlossen) +++ `ConnectionsPerIP = N` Begrenzen der maximalen Anzahl gleichzeitiger Verbindungen pro IP-Adresse +++ `PreventXSS = yes/no` Cross-Site-Scripting vorbeugen, in dem die Zeichen `<=`, `>=`, `''` und `""` in der URL durch einen Unterstrich `_` ersetzt werden +++ `PreventCSRF = yes/no` Cross-Site-Request-Forgery vorbeugen, in dem alle durch den Browser gesendeten Cookies beim Verweis von externen Webseiten ignoriert werden +++ `PreventSQLi = yes/no` Einer SQL-Injection durch Detektierung vorbeugen und Abweisen (deny) der Anfrage mit dem Fehlercode [wikipedia:HTTP-Statuscode#4xx_.E2.80.93_Client-Fehler:409 Conflict] +++ `DenyBody = regular expression` Wenn im body der Anfrage eine Zeichenkette enthalten ist, die sich mit `regular expression` deckt, den Fehlercode [wikipedia:HTTP-Statuscode#4xx_.E2.80.93_Client-Fehler:403 Forbidden] senden. Beispiel: `DenyBody = ^.*%3Cscript.*%3C%2Fscript%3E.*$ ` }}} {{{#!vorlage Tabelle <-2 rowclass="titel"> Abwehr von Angriffen +++ Option Beschreibung +++ `BanOnDeniedBody = N` Anzahl Sekunden, die eine IP-Adresse gebannt werden soll, wenn aufgrund der im body der Anfrage enthaltenen Informationen diese verweigert (denied) wird. +++ `BanOnFlooding = X/Y:Z` Wenn ein Client mehr als `X` Anfragen in `Y` Sekunden sendet, wird die IP-Adresse für `Z` Sekunden gebannt. Beispiel: `BanOnFlooding = 10/1:15 ` +++ `BanOnGarbage = N` Anzahl Sekunden, die eine IP-Adresse gebannt werden soll, wenn der Fehlercode [wikipedia:HTTP-Statuscode#4xx_.E2.80.93_Client-Fehler:400 Bad Request] bei einer Abfrage auftritt +++ `BanOnInvalidURL = N` Anzahl Sekunden, die eine IP-Adresse gebannt werden soll, wenn eine invalide URL vom Client übermittelt wurde? +++ `BanOnMaxPerIP = N` Wie viele Sekunden soll ein Client gebannt werden, wenn die maximale Anzahl gleichzeitiger Verbindungen überschritten wurde +++ `BanOnMaxReqSize = N` Anzahl Sekunden, die eine IP-Adresse gebannt werden soll, wenn der Fehlercode [wikipedia:HTTP-Statuscode#4xx_.E2.80.93_Client-Fehler:413 Request Entity Too Large] auftritt +++ `BanOnWrongPassword = N:X` Anzahl Sekunden, die eine IP-Adresse gebannt werden soll, wenn bei der HTTP-Authentifizierung nach X Versuchen ein Fehler auftritt +++ `BanOnSQLi = N` Anzahl Sekunden, die eine IP-Adresse gebannt werden soll, wenn eine SQL-Injection erkannt wurde +++ `BanOnTimeout = N` Anzahl Sekunden, die eine IP-Adresse gebannt werden soll, wenn ein Timeout auftritt, bevor die erste Anfrage gesendet wird +++ `KickOnBan = yes/no` Wenn eine bestimmte IP-Adresse gebannt wurde, alle bestehenden Verbindungen zu dieser IP schließen +++ `RebanDuringBan = yes/no` Bannzeit zurücksetzen, wenn ein Client während eines Banns versucht, eine neue Verbindung herzustellen }}} Unter Linux besteht darüber hinaus die Möglichkeit, [:AppArmor:] oder [https://grsecurity.net/ Grsecurity] {en} als zusätzliche Sicherungsmaßnahmen einzusetzen (Quelle: [https://www.hiawatha-webserver.org/howto/linux_security_patches Linux security patches] {en}). = Nutzung = [[Bild(./hiawatha-monitor.png, 200, alt="Hiawatha Monitor" align=right)]] Hiawatha läuft als [:Dienste:Dienst] im Hintergrund. Um die verschiedenen Optionen zur Dienststeuerung zu ermitteln, verwendet man folgenden Befehl: {{{#!vorlage Befehl sudo /etc/init.d/hiawatha }}} Protokolldateien sind im Ordner '''/var/log/hiawatha/''' zu finden. Wer eine grafische Kontrolle bevorzugt, sollte sich näher mit dem [https://www.hiawatha-webserver.org/monitor Hiawatha Monitor] {en} beschäftigen. == Anonymisierung der Logfiles == Datenschutzrechtlich ist es in Deutschland nicht erlaubt, ohne triftigen Grund (monetäre Abrechnungen, Server-Attacken, usw.) eine personenbezogene Protokollierung des Nutzungsverhaltens vorzunehmen. Das bedeutet, dass die Speicherung der vollständigen IP-Adressen nicht erlaubt ist. Deshalb sollte man in der Konfigurationsdatei '''/etc/hiawatha/hiawatha.conf''' folgende Zeile hinzufügen, um die IP-Adressen zu anonymisieren: {{{ AnonymizeIP = yes }}} Anschließend muss man den Webserver neu starten, um die Änderung wirksam zu machen. = Links = * [https://hiawatha-webserver.org/ Projektseite] {en} * [https://hiawatha-webserver.org/howto/ offizielle Dokumentation] {en} * [https://www.hiawatha-webserver.org/forum Forum] {en} * [https://www.hiawatha-webserver.org/weblog Blog der Entwickler] {en} * [https://gitlab.com/hsleisink/hiawatha Quellcode] {en} * [wikipedia:Hiawatha_Webserver:Hiawatha] * [https://secure-ubuntu-server.blogspot.de/2014/12/howto-highest-secured-hiawatha-web.html Highest secured Hiawatha Web Server 9.9 on Ubuntu 14.04 LTS Server] {en} - Blogbeitrag, 12/2014 * [iawm::][https://web.archive.org/web/20171214180242/http://idroot.net:80/linux/install-hiawatha-web-server-ubuntu-16-04/ How To Install Hiawatha Web Server on Ubuntu 16.04] {en} - Blogbeitrag, 09/2016 (archiviert 09/2017) * [https://dotbalm.org/why-i-use-hiawatha-webserver/ Why I use Hiawatha Webserver] {en} - Blogbeitrag, 09/2014 * [https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2012/08/Schlanker-sicherer-Webserver-Hiawatha Wachsamer Häuptling – Schlanker, sicherer Webserver Hiawatha] {de} - LinuxUser, 08/2012 * [https://www.admin-magazin.de/Das-Heft/2009/01/Der-sichere-Webserver-Hiawatha Der sichere Webserver Hiawatha] {de} - ADMIN Magazin, 01/2009 * [https://gist.github.com/ZEROF/10743343 hiawatha.sh] {en} {dl} - Skript zur Installation, Aktualisierung und Konfiguration unter Debian (Hiawatha, PHP-FPM, MariaDB) * [:Serverdienste#Webserver:Webserver] {Übersicht} Programmübersicht #tag: Netzwerk, Sicherheit, Server