Logging und Monitoring

Anwendungssicherheit effektiv überwachen

26.08.2019
Von 

Bernhard Hirschmann ist Experte für Enterprise Security Consulting bei der EXXETA AG. Er hat langjährige Erfahrung in den Bereichen Software-Entwicklung, Web-Plattformen und deren Architekturen. Das Thema Security auf Anwendungs-Level interessiert ihn schon seit Beginn seiner Tätigkeiten in der IT, weshalb er sich auf Sicherheit in Web-Anwendungen spezialisiert hat. Secure Coding Training und SecDevOps sind genauso seine Leidenschaft wie Security-Analysen und Pentesting.

Was bedeutet Monitoring auf Anwendungs-Level?

Betrachtet man den Technologie-Stack einer Anwendung und ihrer darunterliegenden Komponenten, dann existieren im professionellen Betrieb bereits einige Monitoring-Komponenten auf dem Level der Netzwerk-Infrastruktur. Dazu zählen etwa Firewalls, Intrusion-Detection-Systeme (IDS) und Intrusion-Prevention-Systeme (IPS).

Diese sind wichtig und notwendig, allerdings haben sie den Nachteil, dass sie sehr wenig Informationen zum Kontext der Anwendung haben. Sie können also meist nicht beurteilen, ob der Request an eine Anwendung ein ganz normaler und legitimer Zugriff ist, oder ob es sich um einen Angriffsversuch handelt. Monitoring auf Anwendungs-Level bedeutet also, dass innerhalb der Anwendung, also beispielsweise im Quellcode selbst, untersucht und bewertet wird, was der Request für einen genauen Sinn und Zweck hat.

Wird etwa versucht, durch bekannte Angriffsvektoren über SQL-Injection auf das Datenbankmanagementsystem (DBMS) zuzugreifen, so kann dies in der Eingabevalidierung durch Abgleich mit einer Blacklist erkannt werden. Ebenso könnten Angriffe via Cross Site Scripting (XSS) oder XML External Entity (XXE) identifiziert werden. Beim einem Brute-Force-Angriff auf die Authentifizierungs-Komponente oder dem Aushebeln des Berechtigungssystems durch Privilege Escalation können ebenfalls Security-Logeinträge geschrieben werden, damit sämtliche Aktivitäten dokumentiert sind. Dabei ist es auch egal, ob diese Angriffsversuche erfolgreich sind oder nicht. Für die Forensik ist es wichtig zu wissen, ob ein Angriff stattfindet oder stattgefunden hat und von wo aus dieser durchgeführt wurde. Nur so können Abwehrmaßnahmen bereits beim Angriffsversuch stattfinden, und nicht erst nach dem erfolgreichen Einbruch.

Ein Monitoringsystem auf Anwendungs-Level ist also eine wichtige Ergänzung zu bestehenden Systemen, die auf Host- oder Netzwerk-Level arbeiten. Mit dessen Hilfe werden die Angreifer (und nicht nur die Schwachstellen) erkannt und die Auswirkungen eines Angriffs verhindert oder wenigstens reduziert.

OWASP AppSensor- mehr als nur ein Monitoring-Tool

Eine mögliche Implementierung eines solchen Monitoring-Systems wurde von dem Open Web Application Security Project (OWASP) mit dem AppSensor-Projekt umgesetzt. Es handelt sich dabei um ein Projekt-Template oder -Framework, das bereits viele der oben genannten Funktionen bereithält.

AppSensor ist mehr als nur ein Monitoring-Tool - es ist ein Security-Protection-System auf Anwendungs-Level. Es konzentriert relevante Security-Informationen zentral an einem Ort, damit sie nicht im Rauschen der Logs untergehen. Es sorgt für dynamische Abwehr, indem Events von der Anwendung aus über eine Programmierschnittstelle (API) direkt übergeben werden können, wenn etwa Logins wiederholt scheitern. Nur die Anwendung kennt den kompletten Kontext und kann wertvolle Informationen dazu liefern. Dadurch wird eine sinnvolle Abwehr erst möglich, etwa um Accounts auszusperren oder die IP-Adresse des Angreifers zu blockieren.

AppSensor arbeitet für die Erkennung und Einschätzung von Angriffen mit Policies. Ein einfaches Beispiel einer solchen Policy könnte sein:

Erfolgen zehn falsche Login-Events in fünf Minuten für einen User, wird der Account blockiert.

An den Erkennungspunkten im Quellcode wird ein Event an AppSensor gesendet. Dadurch kann dann in AppSensor durch die Policy festgelegt werden, was getan werden muss - in diesem Fall den Account zu blockieren. Events können auf verschiedene Arten an AppSensor geschickt werden:

Im Code könnte das dann so aussehen:

if ( isUserAuthorized( account ) ) { // present/view account} else { //new code for appsensor appSensor.addEvent( logged_in_user, "INSUFFICIENT_AUTHORIZATION" )}

Beim Scheitern des Logins im "else"-Zweig wird dann die Logik für das Feuern des Events eingebaut. AppSensor prüft nun seine Policy und reagiert entsprechend. Die Abwehrmaßnahme "blockiere den Account" wird beispielweise durch ein Skript umgesetzt, das per SQL-Befehl den Benutzeraccount blockiert und ihn nach einer Karenzzeit wieder entsperrt. AppSensor agiert hier also als Schaltzentrale, um solche Ereignisse angemessen zu orchestrieren.

Eine andere Policy, etwa um einen Credential-Stuffing-Angriff zu erkennen und zu vereiteln, könnte so aussehen: Erkenne, ob in kurzer Zeit von einer einzigen IP-Adresse Anmeldeversuche für viele Benutzer kommen - auch wenn nur je ein Mal. Mit AppSensor lassen sich solche Angriffe erkennen und Maßnahmen ergreifen.