ilLU[TZ]mination main menu
Wir alle kennen das:
Bei der Auswertung der Internet-Statistik erkennen wir, dass ständig irgendwelche Seiten auf unserem Server aufgerufen werden, die gar nicht vorhanden sind (der Fehler 404):
Woher kommt das ? Die Antwort ist einfach:
Es wird ständig versucht, Sicherheitslücken auf unseren Servern zu finden, um dann über diese Sicherheitslücken einzubrechen. Im gezeigten Beispiel erkennen wir, dass phpMyAdmin gerne als Angriffsziel genutzt wird. Daher werden diverse mögliche Installationsordner von den Angreifern wie phpMyAdmin, phpmyadmin, admin, pma ... gesucht. Für sehr Interessierte gibts hier mehr Infos.
Wie verhindern wir solche Ausspähungen ?
Als OpenSource System zur Erkennen der Angriffe ist Snort weit verbreitet. Snort kann in erster Linie die Angriffe erkennen und in den aktuellen Versionen auch direkt verhindern.
Dazu werden in Snort Regeln definiert. Beispiel zum Erkennen des gezeigten Angriffs:
var XHTTP_PORTS [80]
alert tcp $EXTERNAL_NET any -> $HOME_NET $XHTTP_PORTS \
(msg:"phpMyAdmin Requests"; \
flow:established,to_server; \
content:"/phpMyAdmin"; offset:4; nocase; \
classtype:misc-attack;sid:20010;rev:1; \
fwsam: src, 86400 seconds; )
Wenn in der Anfrage an den Server phpMyAdmin - in irgendeiner Schreibweise - existiert, wird dies erkannt. Dann wird die Aktion fwsam aufgerufen.
Wie schon erwähnt, können die neuen Versionen von Snort auch den Angriff verhindern. Da dies bei den alten Versionen noch nicht möglich war, wurde z.B. snortsam eingesetzt, um die erkannten Angriffe zu unterbinden.
Snortsam ermöglicht es, als Konsequenz zu einem erkannten Angriff, den Angreifer zu blockieren, indem die Firewall für den Angreifer gesperrt wird. Snortsam benutzt dazu iptables, ipfw ... .
Die Regel im o.g. Beispiel sperrt den Angreifer für 86400 Sekunden - also exakt 24 Stunden - aus.
Da Snort die Netzwerk-Datenpakete direkt auswertet, wird es schwierig, diese Auswertungen vorzunehmen, wenn der Datenverkehr verschlüsselt ist. Würde derselbe Angriff also über https erfolgen, würde die Regel von Snort den Angriff nicht erkennen.
fail2ban ist ein Dienst, der Protokolldateien des Servers auswerten kann. Auch hier werden wieder Regeln erstellt:
In der Datei jail.conf wird ein Abschnitt erzeugt, der angibt, dass das Protokoll des Web-Servers nach den Regeln des Filters apache-pma ausgewertet wird.
[apache-pma]
enabled = true
port = http,https
filter = apache-pma
logpath = /var/log/apache*/*error.log
maxretry = 2
findtime = 3600
bantime = 7200
In dem Ordner filter.d wird dazu eine Datei apache-pma.conf erzeugt, die folgende Regel enthaelt:
failregex = [[]client <HOST>[]] File does not exist: .*(?i)(admin|manager)
[[]client <HOST>[]] File does not exist: .*(?i)(sql|pma|db)
Wenn die Datei error.log des Web-Servers einen Eintrag hat, in dem auf eine nicht existierende Datei mit dem Inhalt admin, pma ... hingewiesen wird, wird der Aufrufer für 7200 Sekunden - also 2 Stunden - ausgesperrt. Auch fail2ban sperrt dazu die Firewall.
fail2ban erhöht die Sicherheit, hat aber noch einen kleinen Nachteil: Da die Auswertung durch regelmässiges Auslesen der Protokolldateien erfolgt, ist die Reaktion zeitverzögert, meiner Erfahrung nach bis zu 2 Sekunden.
2 Sekunden sind zwar wenig im Vergleich zur Erdgeschichte, aber eventuell zu viel beim Abwehren von Computer-Angriffen. Auszug aus einer Auswertung von fail2ban:
[Thu May 05 20:49:22 2011] [error] File does not exist: /var/www/admin
[Thu May 05 20:49:22 2011] [error] File does not exist: /var/www/admin
[Thu May 05 20:49:22 2011] [error] File does not exist: /var/www/admin
[Thu May 05 20:49:22 2011] [error] File does not exist: /var/www/db
[Thu May 05 20:49:22 2011] [error] File does not exist: /var/www/dbadmin
[Thu May 05 20:49:22 2011] [error] File does not exist: /var/www/myadmin
[Thu May 05 20:49:22 2011] [error] File does not exist: /var/www/mysql
[Thu May 05 20:49:23 2011] [error] File does not exist: /var/www/mysqladmin
[Thu May 05 20:49:23 2011] [error] File does not exist: /var/www/phpMyAdmin
[Thu May 05 20:49:23 2011] [error] File does not exist: /var/www/phpadmin
[Thu May 05 20:49:23 2011] [error] File does not exist: /var/www/phpmyadmin
In 2 Sekunden wurden 11 Varianten ausprobiert, bevor die Firewall weitere Ausspähungen verhinderte. Wäre einer der Versuche fündig geworden, hätte die Zeit für die Folge-Angriffe eventuell gereicht.
Ähnlich wie Snort erkennt das Apache Modul mod_security bestimmte Muster von Aufrufen. Allerdings wertet mod_security die Aufrufe erst nach der Entschlüsselung des Netzwerkverkehrs aus, so dass auch ver- bzw. entschlüsselte Angriffe über https erkannt werden:
SecRule REQUEST_URI phpmyadmin t:lowercase,setenv:MODSEC_ID=980001, \
setenv:MODSEC_TO=36000,pause:2000,exec:/usr/sbin/snortsam.sh
Die Regel ruft das Skript snortsam.sh auf, falls die aufgerufene Internetseite des Angreifers phpmyadmin enthält.
Das Skript snortsam.sh wiederum ruft ein Kommando-Zeilen Programm aus den Programmen von snortsam auf, um den Angreifer abzuwehren:
/usr/sbin/samtool -v -block -ip $REMOTE_ADDR -duration $MODSEC_TO \
-sid $MODSEC_ID localhost:8610/snort
Hier wird der Angreifer sofort beim ersten Aufruf durch die Firewall fuer 36000 Sekunden ausgesperrt.
Trotz aller Vorsichtsmassnahmen ist es nicht auszuschliessen, dass es jemandem gelingt, sich Zugang zum System zu verschaffen.
Damit solche Änderungen zuverlässig erkannt und gemeldet werden, kann tripwire eingesetzt werden.
Daher sollten auch alle im Web-gehosteten Dateien von tripwire überwacht werden. Wenn die Dateien des Web-Server in /var/www liegen, wird die Konfigurationsdatei von Tripwire /etc/tripwire/twpol.txt ergänzt:
# WEB DIRECTORIES
#
(
rulename = "WEB - Directories",
severity = $(SIG_MED)
)
{
/var/www -> $(SEC_CRIT) ;
}
Anschliessend müssen die Konfiguration(en) für tripwire (neu) generiert werden:
twadmin --create-cfgfile --cfgfile tw.cfg \
--site-keyfile site.key twcfg.txt
twadmin --create-polfile --cfgfile tw.cfg \
--polfile tw.pol --site-keyfile site.key twpol.txt
Bei entsprechender Konfiguration überprüft Tripwire die Dateien täglich per Cron-Job und sendet ein Protokoll über Änderungen per Email. Werden Änderungen erkannt, sollte umgehend manuell überprüft werden, ob fremder Code eingeschleust wurde.
Mit den 5 Werkzeugen
kann die Sicherheit von Internetservern deutlich erhöht werden.
Es handelt sich hierbei nicht um eine Entweder - Oder, sondern es sollten ruhig alle genannte Werkzeuge eingesetzt werden.
Im Beispiel mit phpMyAdmin wäre die Auswertung durch snort und fail2ban zwar grundsätzlich nicht mehr nötig, da mod_security den Angriff erkennt und snortsam den Angriff über die Firewall für die festgelegte Zeit unterdrückt.
Allerdings: Auf vielen Servern laufen noch andere Dienste als der Web-Server, z.B. ftp, ssh usw. Snort wertet auch Angriffe auf ftp aus und da ssh verschlüsselt ist, kann fail2ban wiederum brute-force Attacken auf ssh beenden.