Archiv für ‘Apache’

Apache2 durch Yaws ersetzen

4. Februar 2010 21:23 | Autor: Marc | Keine Kommentare | Kategorie(n): Allgemeines, Erlang

Ich hatte ja schon ein bisschen mit dem Erlang-Webserver Yaws experimentiert und festgestellt, dass die Performance im Vergleich zum de facto-Standard Apache2 deutlich besser ist. Beim Experimentieren ist es seinerzeit allerdings auch geblieben. Hauptsächlich aufgrund niedrigerer Prio auf meiner ToDo-Liste.

Nun wollte ich aber den ersten Systemen mal ernsthaft an den Kragen und den schwerfälligen Indianer endlich ablösen. Ein kurzer Test mit allerlei Standardsoftware hat mich ja schon fast ein bisschen erstaunt. Nachdem ich Yaws PHP (per php-cgi) beigebracht hatte, liefen so Sachen wie Joomla! oder WordPress bereits problemlos. Wenn letzteres auch nur ohne Rewrite-URLs. Einen Workaround gibt es allerdings an dieser Stelle. Wobei zu beachten ist, dass der Performance-Gewinn durch PHP natürlich wieder entsprechend minimiert wird.

Neben Geschwindigkeitsaspekten ist aber natürlich auch die Tatsache interessant, dass Erlang-Code direkt in die HTML-Seiten (dann mit der Endung .yaws) eingebunden und ausgeführt werden kann.

Für meine Konfiguration konnten größtenteils die Standardwerte beibehalten werden. Zu finden ist sie, wie immer, auf dem Gopher.

Was fehlt noch? Genau, IPv6.
Inzwischen bin ich mir recht sicher, dass ohne größere Modifikationen des Source Codes keine Möglichkeit besteht, Yaws an einen TCP6-Socket zu binden, obwohl Erlang es nativ unterstützen würde. Eine Möglichkeit, die bei vernünftiger Konfguration ebenfalls Performance-steigernd wirkt, ist der Einsatz von Varnish. Schätze, dazu verliere ich bei Gelegenheit auch noch ein paar Worte.

 

Es muss nicht immer PHP sein

13. August 2009 02:13 | Autor: Marc | Keine Kommentare | Kategorie(n): Erlang

Gemeint ist dynamischer Inhalt von Webseiten.

Aus aktuellem Anlass war ich zunächst auf der Suche nach einem Erlang-Modul für den Apache-Webserver und wurde auch fündig. Allerdings liegt die letzte Änderung an dieser Software offensichtlich schon ein bisschen länger zurück. Eigentlich schade, ermöglicht es doch dieses Modul, Erlang-Code direkt in HTML-Dokumente einzubinden.

Als ich das Orakel dann noch einmal befragte, fand ich eine etwas elegantere Möglichkeit, HTML-Seiten mit Erlang-Code auszustatten: Der ohnehin in Erlang programmierte und sehr performante Webserver Yaws bringt diese Funktion nativ mit.

Kleines Beispiel:

<erl>
out(A) ->
{html, "Hallo Welt"}.
</erl>

 

Slowloris fail2ban

21. Juni 2009 13:39 | Autor: Marc | Keine Kommentare | Kategorie(n): Netzwerke, Sicherheit

Wie bereits beschrieben, existiert bisher keine wirksame Möglichkeit, einen Apache-Server vor einem Angriff mit Slowloris zu schützen.

Ein Ansatz ist sicherlich, die IP des Angreifers zu sperren. Also im Prinzip die Funktionsweise des Tools fail2ban.

Ich habe ein kleines Script gebastelt, welches den Apache-Errorlog auf Einträge durchsucht, die auf einen Angriff mit Slowloris hindeuten und dann die entsprechenden IP-Adressen per iptables sperrt. Um den Angreifer nicht ewig zu sperren, sollte der Apache-Errorlog natürlich relativ häufig rotieren.

Beide Dateien habe ich auf dem Gopher zugänglich gemacht. Die Firewall-Regeln müssen ggf. angepasst werden (Flush beachten).

 

HTTP DoS mit Slowloris

20. Juni 2009 12:20 | Autor: Marc | Keine Kommentare | Kategorie(n): Netzwerke

RSnake hat mit dem Tool Slowloris eine einfache Möglichkeit veröffentlicht, Apache-Webserver zu attackieren.

Auf einer Debian Standard-Installation muss lediglich die Perl-Erweiterung IO::Socket::SSL installiert werden, um das Perl-Script auszuführen.

Einmal aufgerufen, sendet Slowloris permanent unvollständige HTTP-Requests an das "Ziel". Ein Apache-Prozess wartet nach dem Empfang eines unvollständigen Requests auf die Vervollständigung durch den Client. Das führt dazu, dass der Apache das (konfigurierbaren) Maximum seiner Kindprozesse ausführt und so innerhalb kürzester Zeit keine wirklichen HTTP-Requests anderer Clients mehr beantworten kann.

Währenddessen sind andere Dienste – selbst andere Apache-Instanzen – auf der gleichen Maschine weiterhin erreichbar. Zumal der Angriff mit Slowloris lediglich eine Bandbreite von <1 Kbyte/Sek. benötigt.

Eine Firewall bietet für diese Art der Angriffe i.d.R. keinen Schutz, da die TCP-Verbindung korrekt zustande kommt. Der Angriff beginnt also auf Protkollebene.

Auch scheint kein Workaround für die Apache-Konfiguration zu existieren. Hier fällt mir auch lediglich das Experimentieren mit der Konfiguration des Moduls mpm_prefork ein. Allerdings stößt ja jeder Server irgendwann an seine physikalischen Grenzen.

Neben dem Apache sollen noch weitere Web- und Proxyserver betroffen sein. Populäre Ausnahmen sind architekturbedingt aber lighttpd und IIS.

 

Apache2 mit mehreren SSL-VirtualHosts

6. Februar 2009 17:05 | Autor: Marc | 4 Kommentare | Kategorie(n): Netzwerke, Sicherheit

Wer mehrere Domains auf einem Webserver betreibt, wird möglicherweise den Wunsch haben, hier verschiedene SSL-Zertifikate für die jeweiligen Domains zu installieren. Allerdings kann der Server erst nach dem SSL-Handshake entscheiden, welchen Host der Browser angefragt hat.

Abhilfe schafft das die TSL-Erweiterung SNI (Server Name Indication). Unterstützt wird diese doch recht sinnvolle Neuerung aber bisher nur von gnutls. Die Installation auf einem Debian-Server wird hier kurz beschrieben und sollte auch auf anderen Systemen mit geringen Anpassungen machbar sein.

Als Allererstes steht die Installation des Pakets apache2-threaded-dev auf dem Programm (sofern noch nicht geschehen). Dann wird die aktuelle gnutls-Version benötigt. Und zwar von gnu.org. Herunterladen, entpacken, konfigurieren, kompilieren, installieren kennt man ja. Dann benötigen div. Systeme noch einen Aufruf von ldconfig. Anschließend kann dann bereits das Apache-Modul heruntergeladen und installiert werden. Zu bekommen ist es hier.
Die Installationsprozedur verläft hier auch unspektakulär normal. Ich musste configure allerdings den Pfad von apxs2 mitgeben:
./configure --with.apxs2=/usr/bin/apxs2

make install
kopiert das Apache-Modul dann (hoffentlich) an die richtige Stelle. In diesem Fall /usr/lib/apache2/modules

Die Datei /etc/apache2/mods-enabled/gnutls.load wird nun mit folgendem Inhalt erstellt: LoadModule gnutls_module /usr/lib/apache2/modules/mod_gnutls.so
Und auch die Datei /etc/apache2/mods-enabled/gnutls.conf muss erstellt werden. Sie sollte Folgendes enthalten:
<IfModule gnutls_module>
GnuTLSCache dbm /var/cache/mod_gnutls_cache
GnuTLSCacheTimeout 300
</IfModule>

Natürlich müssen die virtuellen Hosts noch angepasst werden. Jeder vHost, der SSL verwenden soll, benötigt folgende Zeilen:
<VirtualHost 192.168.1.250:443>
ServerName www.example.de
GnuTLSEnable on
GnuTLSPriorities NORMAL
GnuTLSCertificateFile /etc/certs/example_server.pem
GnuTLSKeyFile /etc/certs/example_key.pem
DocumentRoot "/var/www/example.de"
...
</DocumentRoot>

Die möglicherweise bisher vorhandenen Zeilen, beginnend mit SSL, müssen selbstverständlich den neuen Angaben weichen.
Achtung: Die VirtualHosts-Direktiven müssen mit IP-Adresse definiert werden. Ggf. werden also für ein DocumentRoot 2 Einträge erstellt, beispielsweise bei paralleler Verwendung von IPv4 & IPv6.