Schlanker, sicherer Webserver Hiawatha

Aus LinuxUser 08/2012

Schlanker, sicherer Webserver Hiawatha

© Francisco Javier Quintana Galvàn, 123 RF

Wachsamer Häuptling

Der freie Webserver Hiawatha legt den Fokus auf Sicherheit und geringen Ressourcenverbrauch. Damit eignet er sich besonders für kleinere Web-Projekte, für die Apache zu schwerfällig und komplex erscheint.

Der Entwickler von Hiawatha [1], Hugo Leising, begann 2002 mit der Programmierung eines eigenen Webservers, weil es seinerzeit keinen Vertreter dieser Gattung gab, der seinen Vorstellungen von Sicherheit, Einfachheit und im Umgang mit Ressourcen gerecht wurde. Leisings Bonmot, Apache sei eine fette Kuh mit einer ziemlich hässlichen Konfigurationsdatei, trifft im Jahr 2012 zwar nicht mehr in allen Punkten zu. Dennoch gibt es nach wie vor einen Bedarf an kompakten, einfach zu konfigurierenden Webservern – unter anderem deshalb, viele Web-Anwendungen dann damit punkten können, “out-of-the-box” zu funktionieren, indem Sie den Webserver einfach vorkonfiguriert mitliefern. Auch Hiawatha eignet sich mit seiner kompakten Größe von 620 KByte hervorragend als “Beipack-Lösung”.

Der komplett monolithisch aufgebaute Hiawatha sieht ein Laden von Modulen beim Programmstart nicht vor. Seine hohe Geschwindigkeit verdankt Hiawatha der Tatsache, dass der Server ausschließlich Threads verwendet. Hiawatha enthält zudem eine Reihe von Funktionen im Standardumfang, die Sie bei anderen Webservern nachrüsten oder aufwändig konfigurieren müssen, wie etwa Support für IPv6, CGI und FastCGI, XSLT, VirtualHosts oder Basic/Digest-HTTP-Authentifizierung.

Herausragend sind aber vor allem die Sicherheitsfunktionen von Hiawatha, wie der Schutz vor Cross-Site-Scripting (CSS), Cross-Site Request Forgery (CSRF), SQL-Injection-Angriffen und Denial-of-Service-Attacken. Ferner kann der Webserver Clients auf IP-Ebene anhand ihrer Adresse blockieren (“Banning”) und lässt sich über einen separaten Port kontrollieren (“Command Channel”). Hiawatha unterstützt außerdem auch URL-Rewriting anhand regulärer Ausdrücke. Allerdings heißt die Funktion bei Hiawatha UrlToolkit. Eine komplette Feature-Liste steht unter [2] zur Verfügung.

Hiawatha in Betrieb nehmen

Hiawatha installieren Sie am besten aus den Quellen. Dazu benötigen Sie an Voraussetzungen neben einem C-Compiler und den Entwicklerversionen der Libc5, Glib2 und Libxslt noch eine aktuelle Cmake-Version. Daneben sollten Sie auch darauf achten, dass OpenSSL installiert ist. Nach dem Herunterladen des Hiawatha-Quellcode-Archivs entpacken sie es mit tar -xfzv hiawatha-8.4.tar.gz, wechseln in das neu entstandene Verzeichnis und starten die Installation mit den Befehlen aus Listing 1.

Listing 1

$ mkdir build
$ cd build
$ sudo cmake ..
$ sudo make install/strip

Bei dieser Minimalversion erhalten Sie zwar elementare Dinge wie SSL-Unterstützung, das UrlToolkit und XSLT-Support, verzichten aber auf ein paar ausgefeiltere Features, wie etwa den Chroot-Support, den Command-Channel oder den Hiawatha-Monitor. Diese binden Sie bei Bedarf beim Aufruf von Cmake über entsprechende Optionen ein (siehe Tabelle “Cmake-Optionen”). Um Hiawatha mit Chroot-Support zu übersetzen, verwenden Sie statt cmake .. beispielsweise cmake -DENABLE_CHROOT=on ... Vergessen Sie aber beim Cmake-Aufruf auf keinen Fall die beiden Punkte, die das Tool anweisen, im darüber liegenden Verzeichnis zu arbeiten.

Cmake-Optionen

Option Vorgabe Funktion
-DENABLE_CACHE=on|off on Cache-Unterstützung
-DENABLE_CHROOT=on|off on Chroot-Support
-DENABLE_COMMAND=on|off off Command-Channel aktivieren
-DENABLE_DEBUG=on|off off Debug-Information ausgeben
-DENABLE_IPV6=on|off on Unterstützung für IPv6
-DENABLE_MONITOR=on|off off Hiawatha-Monitor aktivieren
-DENABLE_RPROXY=on|off on Reverse-Proxy-Support
-DENABLE_SSL=on|off on SSL ermöglichen
-DENABLE_TOOLKIT=on|off on UrlToolkit nutzen
-DENABLE_XSLT=on|off on XSLT-Support

TIPP

Möchten Sie Hiawatha speziell für Debian, Mac OS X oder Windows (via Cygwin) übersetzen, finden Sie im Unterverzeichnis extras spezielle Build-Skripte für die genannten Plattformen, wie etwa make_debian_package.

Hiawatha konfigurieren

Der Hauptvorteil von Hiawatha besteht in seiner einfachen und übersichtlichen Konfiguration. Diese erfolgt in einer einzigen, kompakten Konfigurationsdatei namens hiawatha.conf, die per Default im Verzeichnis /usr/local/etc/hiawatha/ liegt. Abzüglich der auskommentierten Zeilen und der Pfadangaben zu den Log-Files setzt sich die mitgelieferte Datei aus lediglich sieben Einträgen zusammen. Für erste Tests sollten Sie die Default-Konfiguration sichern und entweder eine komplett neue Konfigurationsdatei anlegen oder mit den in der Default-Konfiguration auskommentierten Parametern experimentieren.

Eine Minimalkonfiguration zeigt Listing 2; im Normalfall steht in jeder Zeile genau eine Definition. Eine sogenannte Sektion in geschweiften Klammern ist auch schon das komplexeste Strukturmerkmal der Konfigurationsdatei.

Listing 2

Binding {
  Port = 8080
  Interface = 192.168.0.45
}
WebsiteRoot = /usr/local/var/www/hiawatha
Hostname = localhost

Mit der Binding-Definition (eingeschlossenen in geschweifte Klammern) legen Sie fest, auf welchem Interface und auf welchem Port der Webserver Verbindungen entgegen nimmt. Soll der Webserver auf allen vorhandenen Netzwerkschnittstellen auf Verbindungen warten, lassen Sie die Interface-Angabe einfach weg. Selbstverständlich können Sie auch mehrere Binding-Sektionen einbauen, etwa eine eigene für den SSL-Port 443.

Das bei Apache als DocumentRoot bezeichnete Webserver-Verzeichnis heißt bei Hiawatha schlicht WebsiteRoot. Sie können hierfür zwar jeden beliebigen Ordner auf der Festplatte angegeben, unter /usr/local/var/www/hiawatha liegt aber bereits eine vorbereitete Beispielseite index.html.

Außerdem müssen Sie noch einen Namen oder eine IP-Adresse angeben, unter der sich die Webseite erreichen lässt. Dazu kommt wie bei Apache der Parameter Hostname zum Einsatz. Da Hiawatha wie eingangs erwähnt von Haus aus mit IPv6-Adressen zurecht kommt, stellt es kein Problem dar, eine solche einfach zu verwenden – Sogar das Mischen ist erlaubt.

Indianer rennt

Für einen Schnellstart genügt es, den Server mit administrativen Rechten direkt auf der Kommandozeile mit hiawatha anzuwerfen. Im Unterverzeichnis extras/ findet sich jedoch das vorbereitete Start/Stop-Skript hiawatha, das Sie mit etwas Erfahrung an Ihre Bedürfnisse anpassen und in den Init-Prozeß Ihrer Distribution einbauen.

Sollten Sie die Fehlermeldung Warning: can’t write PID file /usr/local/var/run/hiawatha.pid erhalten, hat Hiawatha keine ausreichenden Zugriffsrechte für das Verzeichnis /usr/local/var/run. Den Pfad zur PID-Datei mit der Prozess-ID des Servers passen Sie bei Bedarf in der dokumentierten Konfigurationsdatei leicht an.

Hat alles funktioniert, steht die mitgelieferte Testseite unter nach dem Start des Servers unter

http://IP-oder-Servername:Port

zur Verfügung (Abbildung 1). Im Beispiel aus Listing 2 verwenden wir Port 8080, um einem laufenden Apache nicht in die Quere zu kommen. Ohne Start/Stop-Skripte können Sie Hiawatha vorerst nur via sudo killall hiawatha wieder beenden.

Abbildung 1: Geschafft: Hiawatha läuft und grüßt mit seiner Willkommensseite.

Abbildung 1: Geschafft: Hiawatha läuft und grüßt mit seiner Willkommensseite.

CGI

Ohne den Einsatz Skripten geht im Web-2.0-Zeitalter nicht mehr viel. Um CGI zum aktivieren, erweitern Sie die Hiawatha-Konfigurationsdatei einfach um die Zeile ExecuteCGI = yes (Listing 3, Zeile 2) und legen mit dem Parameter CGIextension fest, welche Dateiendung die CGI-Programme haben sollen (Zeile 3). Möchten Sie PHP- oder Python-Anwendungen erlauben, müssen Sie Hiawatha noch Namen und Pfad zum zuständigen Interpreter mitteilen (Zeile 4). Analog funktioniert das auch mit Perl oder Python (Zeilen 5 und 6). Sollen fehlerhafte oder bösartige CGI-Programme nicht gleich den ganzen Webserver übernehmen können, empfiehlt es sich zudem, die jeweilige Lebensdauer der Skripte (in Sekunden) zu begrenzen (Zeile 7).

Listing 3

...
ExecuteCGI = yes
CGIextension = cgi
CGIhandler = /usr/bin/php5-cgi:php,php5
CGIhandler = /usr/bin/perl:pl
CGIhandler = /usr/bin/python:py
TimeForCGI = 10

Sicher ist sicher

Wie bereits erwähnt, zeichnet sich Hiawatha nicht zuletzt durch seine Sicherheitsfunktionen aus. Auch diese gilt es explizit über die Konfigurationsdatei zu aktivieren.

Dazu gehört unter anderen, von den gebotenen Logging-Möglichkeiten Gebrauch zu machen und Hiawatha anzuweisen, entsprechende Logfiles anzulegen und mit Inhalt zu füttern (Listing 4). Das SystemLogfile enthält die allgemeinen Meldungen des Hiawatha-Daemons, während das AccessLogfile Zugriffe protokolliert und das ErrorLogfile Fehler aufzeichnet.

Listing 4

SystemLogfile = /usr/local/var/log/hiawatha/system.log
AccessLogfile = /usr/local/var/log/hiawatha/access.log
ErrorLogfile = /usr/local/var/log/hiawatha/error.log

Hiawatha läuft nur beim Start mit Root-Rechten, damit er sich an den angegeben Port binden kann, und wechselt danach automatisch in den Kontext des Nutzers nobody. Sie dürfen aber übner die ServerId auch ein anderes Benutzerkonto dazu vorgeben, etwa ServerId = www-data.

Die beiden ersten Zeilen der mitgelieferten Konfigurationsdatei widmen sich übrigens möglichen Denial-of-Service-Angriffen. Um die Anfälligkeit für solche Attacken zu verringern, reduzieren Sie am besten die Anzahl der gleichzeitig von Hiawatha akzeptierten Verbindungen insgesamt (ConnectionsTotal = 150 ) sowie pro IP-Adresse (ConnectionsPerIP = 10).

Soll der Server zusätzlich oder ausschließlich SSL-Verbindungen akzeptieren, brauchen Sie neben dem dazu erforderlichen Binding zunächst ein X.509-SSL-Zertifikat. Wer das nicht käuflich bei einer Certificate Authority (CA) erwerben will, erzeugt es mittels OpenSSL selbst (Listing 5) und kopiert den damit erzeugten Schlüssel serverkey.pem ins Konfigurationsverzeichnis /usr/local/etc/hiawatha.

Listing 5

$ openssl genrsa -out serverkey.pem 2048
$ openssl req -new -x509 -days 365 -key serverkey.pem -out server.crt
$ echo "" >> serverkey.pem
$ cat server.crt >> serverkey.pem
$ echo "" >> serverkey.pem
$ rm -f server.crt

Jetzt müssen Sie Hiawatha noch in der Binding-Sektion für HTTPS (Port 443) den Pfad zum eben erzeugten Server-Key mitteilen und das Verwenden von SSL mit UseSSL einschalten (Listing 6). Ab sofort reagiert der Webserver in unserem Beispiel auch auf Anfragen unter https://192.168.0.45:443.

Listing 6

...
Binding {
Port = 443
Interface = 192.168.0.45
UseSSL = yes
ServerKey = /usr/local/etc/hiawatha/serverkey.pem
}

UrlToolkit

Hiawatha kennt auch eine mit Apaches Mod_rewrite vergleichbare Funktion. Sie heißt hier UrlToolkit und sorgt dafür, dass der Webserver jede an ihn gerichtete URL mit einem vorgegebenen Muster abgleicht und nur bei Übereinstimmung die festgelegte Aktion ausführt (Listing 7).

Listing 7

...
UrlToolkit {
    ToolkitID = rewrite
    RequestURI exists Return
    Match ^/images Return
    Match ^/data DenyAccess
    Match /(.*) Rewrite /index.php?page=$1
}

Das Beispiel sorgt dafür, dass Hiawatha URLs, die Dateien im Verzeichnis images/ adressieren, nicht umschreibt. Dagegen weist er URLs, die auf Dateien unter data/ verweisen, zurück und schreibt alle übrigen URLs so um, dass sie auf die Startseite des Webservers (index.php) zeigen. Eine Übersicht der kompletten Syntax nebst aller Funktionen finden Sie unter [3].

Virtuelle Hosts

Auf diesem Weg kann Hiawatha auch mit virtuellen Hosts umgehen, also mehrere voneinander unabhängige virtuelle Webauftritte ausliefern – ganz so, also liefen auf der Maschine mehrere Webserver. Dazu ist es erforderlich, dass der physische Server anhand der übermittelten URL erkennt, welche Webseite er ausliefern muss. Möchten Sie mit Hiawatha virtuelle Hosts aufsetzen, legen Sie einfach für jeden davon in der hiawatha.conf eine eigene Sektion an (Listing 8)

Listing 8

...
VirtualHost {
        WebsiteRoot = /var/www/weitere-webseite/wwwroot
        Hostname = www.weitere-webseite.de... Parameter und Funktionen für den virtuellen Host ...
}

Innerhalb der Sektion dürfen Sie beliebig viele Konfigurationseinstellungen vornehmen. Es gibt allerdings einige Optionen, die Sie ausschließlich in Virtual-Host-Sektionen verwenden können. Dazu zählen vier interessante Schutzmechanismen.

So verhindern Sie beispielsweise mit PreventCSRF = yes Cross-Site-Request-Forgery-Attacken (CSRF), weil der so ergänzte virtuelle Host dann alle von einem Browser gesendeten Cookies ignoriert, sofern die Anfrage über einen externen Link zustande kam. Mit PreventXSS = yes verhindern Sie Cross-Site-Skripting (XSS): Der virtuelle Host ersetzt sämtliche Kleiner- und Größer-als-Zeichen sowie Hochkommas und Anführungsstriche in der URL durch Unterstriche.

In ähnlicher Weise verhindert PreventCMDI = yes Command-Injection-Angriffe. Hiawatha ersetzt hier vorsorglich Backslashes, Strichpunkte und Pipe-Symbole in der URL durch einen Unterstrich, was allerdings auch hochgeladene Binärdateien zerstören kann. Ferner wirkt PreventSQLi = yes SQL-Injections entgegen, indem der virtuelle Host mit dieser Option einen Schrägstrich vor jedes Hochkomma in der URL stellt.

Fazit

Mit seinem runden Funktionsumfang und insbesondere den ausgefeilten Sicherheitsfunktionen kann Hiawatha in vielen Fällen einen Apache-Webserver ersetzen – und lässt sich obendrein wesentlich einfacher konfigurieren. Darüber hinaus bietet Hiawatha noch weitere nützliche Funktionen. Fordert ein Client beispielsweise eine XML-Datei an, führt der Webserver auf Wunsch eine automatische XSL-Transformation durch, sofern eine passende XSLT-Datei vorhanden ist. Wie bei Apache lässt sich die Ausführungsgeschwindigkeit von CGI-Skripten durch Einschalten von FastCGI steigern. Als “eierlegende Wollmilchsau” für das Web bleibt Apache allerdings aufgrund der unzähligen APIs, Schnittstellen, Addons und Zusatzprodukte erste Wahl. Für alles andere gibt es Hiawatha. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 08/2012 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben