PHPIDS ( Intrusion Detection System )
Als Programmierer für Webseiten muss man sich immer Gedanken um die Sicherheit machen.
PHPIDS ist ein Skript, welches versucht, solche Einbruchsversuche frühzeitig zu erkennen!
Mit Hilfe von unterschiedlichen Prüfverfahren werden alle Benutzereingabe auf schadafte Skriptfragmente oder Zeichen untersucht.
Was wird geprüft?
Geprüft werden alle Eingaben, sei es $_POST, $_GET, $_COOKIE oder $_REQUEST. Das Ganze ist natürlich abhängig von der Konfiguration. Man kann auswählen, was durchsucht werden soll und was nicht.
Durch die Filterung mit Regulären Ausdrücken werden unter anderem Angriffe wie XSS, SQL Injektion ( SQLI ), Remote File Inclusion, Remote File Excution (RFE) und LDAP Injektionen erkannt.
Auch verschleierte Angriffe über oktale oder hexadezimale JavaSkript-Entities werden erkannt.
Unterscheidung zwischen Angriffen
Nach der Prüfung der Benutzereingabe steht die Bewertung in einem Ergebnisobjekt. Der Schweregrad des Angriffes wird wird mit einem numerischen Wert, dem sogenannten Impact, festgelegt. Je höher der Wert ist, desto schlimmer ist der Angriff.
Abhängig von dem Impact-Wert kann dann unterschiedlich reagiert werden. Wie man reagieren möchte, bleibt jedem selber überlassen, als Bespiel könnte man bei einem eindeutigen Angriff die Session des Users löschen oder Ihm eine Nachricht anzeigen, dass er dies zu unterlassen hat. Auch das Aussperen der IP Adresse ist dann möglich, wobei ich hier sehr Vorsichtig wäre, da man damit auch andere User ausperren könnte, da der Angreifer z.b. über ein Proxy gekommen ist. Man würde also alle User hinter diesem Proxy aussperren.
Auch das Logging der Angriffe ist fertig vorhanden. Hier habt hier die Möglichkeit, alle Angriffe in einer Tabelle oder in einem File zu speichern. So hat man immer die Möglichkeit, diese Daten auszuwerten, um gegebenenfalls Sicherheitslücken zu schliessen. Es kann auch ein eigener Logger verwendet werden. Dieser Logger muss nur das Interface IDS_Log_Interface inplementieren
Die geloggten Daten finde ich persönlich sehr interessant. Ohne ein Logging ist es wirklich nicht einfach, die Art des Angriffes und den Ort festzustellen. Damit ist es auch schwer, eine eventuell vorhandene Lücke zu schliessen.
Verfolgung eines Angreifers
Das größte Problem bei einer automatischen Erkennung ist ein Fehlalarm (false Positive). Niemand möchte jemanden aussperen, nur weil ein Skript eine falsche Entscheidung getroffen hat. Laut dem Artikel der Ct ( Ausgabe 10 ) ist das bei einem Impactwert von 2-5 der Fall. Hier gibt es meiner Meinung nach aber eine wirklich gute Lösung.
Es bietet sich hier an den User mit Hilfe der Session zu verfolgen. Viele Angreifer sind vorsichtig und testen ganz simpel mit z.b. „‚>, ob ein Angriff möglich ist. Dies würde einen sehr geringen Impactwert bringen und würde damit nicht sofort als Angriff erkannt werden. Wenn man Besucher aber verfolgt und er macht dies an unterschiedlichen Stellen der Seite, kann man sichergehen, dass dies zumindest eine Suche nach Sicherheitslücken ist und dementsprechend reagieren.
Performance und Caching
Wichtig ist natürlich die Performance. Die Entwickler von PHPIDS haben sich auch hier Gedanken gemacht und bieten dafür das Cachen in der DB , FILE oder Memchache an. Zu der Performance kann ich bis jetzt noch nichts sagen, da ich das Ganze nur in einem Testskript mal ausprobieren wollte. Ich habe die Zeit zwar hier gemessen mit microtime() und kann mich absolut nicht beschweren, allerdings in wie weit das ganze realistisch ist, kann ich so nicht sagen. Vielleicht möchte ja jemand mal das in einer fertigen Applikation testen und berichten. Würde mich auf jeden Fall sehr freuen. 🙂
Eine Testmöglichkeit
Da jeder gerne selber testet, habe ich mal ein kleines Testskript erstellt, welches Ihr unter Testskript erreichen könnt. Die von euch eingegebenen Daten werden nur erfasst, wenn es einen Angriff darstellt. 🙂 Aus reiner Neugierde wird jede Art des Angriffes geloggt. Später möchte ich diese Daten mal auswerten und euch das Ergebnis präsentieren. So dass sich jeder einen Eindruck machen kann.
Einbindung und Code
Die Einbindung in ein bestehendes Projekt ist wirklich simpel. Es wird nur eine Lokale Schnittstelle benötigt welche bei den meisten wohl die Index.php darstellt. Sollte dies nicht der Fall sein, muss PHPIDS natürlich in allen Datein eingebunden werden.
// PHPIDS Testskript $go = microtime(true); require_once 'IDS/Init.php'; $request = array( 'GET' => $_GET, 'POST' => $_POST ); $init = IDS_Init::init('../../security/ids_config/Config.ini'); $ids = new IDS_Monitor($request, $init); $result = $ids->run(); if (!$result->isEmpty()) { // Logger einbinden require_once 'IDS/Log/Composite.php'; require_once 'IDS/Log/Database.php'; $compositeLog = new IDS_Log_Composite(); $compositeLog->addLogger(IDS_Log_Database::getInstance($init)); $compositeLog->execute($result); // Take a look at the result object echo $result; } else{ echo "Dis ist kein Angriff!"; } $end = microtime(true); $time = $end - $go; echo ""; echo "Benchmark: ".$time ." sek.";
Wie Ihr seht, ist es wirklich nicht schwer. Zusätzlich muss nur noch die config.ini-Datei angepasst werden, diese ist allerdings selbsterklärend, so dass ich da nicht weiter drauf eingehen werde.
Manchmal ist es ja auch gewünscht, dass man z.b. Code in ein Formularfeld eingeben kann, wie z.b. in einem Javaskript- oder PHP-Forum. Hier besteht dann die Möglichkeit, Ausnahmen zu erstellen, so dass diese Eingaben nicht als Angriff gewertet werden. Bis jetzt habe ich mich damit allerdings noch nicht genau befasst. Werde dies, wenn die Zeit da ist, zu einem späteren Zeitpunkt nachholen. 🙂
Wirklich wichtig ist, dass PHPIDS nicht dafür gedacht ist, um Sicherheitslücken ignorieren zu können oder für die ganz Faulen die jetzt denken endlich brauch ich kein mysql_real_escape_string() mehr. Dem ist nicht so. PHPIDS ist nur dafür da, frühzeitig eindeutige Angriffe erkennen zu können, um diese gleich zu blocken.
Ich persönlich finde diese Art und Weise sehr interessant und freue mich jetzt auf eure Meinung zu diesem Thema.
Link:
www.phpids.org
[…] fand PHPIDS wirklich Interessant und musste das einfach mal selber testen. Habe dazu hier einen kleinen Artikel geschrieben, ein kleines Testskript ist auch verlinkt. Ich bin nicht so […]
[…] […]
[…] diesbezüglich jedoch nochmal überdacht und geändert. Zusammen mit Creator (Autor des Artikels PHPIDS) habe ich ein Forum für Webmaster gestartet. Der Themenschwerpunkt liegt genau wie beim Blog auf […]
[…] Aber auch die Artikel von Creator, der weiterhin aktiv ist, können sich sehen lassen! z.B. PHPIDS […]