Der ultimative Leitfaden zu Anwendungssicherheit und Sicherheit von Cloud-Anwendungen
Applikationen machen zwar nur eine Ebene des Software-Stacks aus, aber sie sind wohl die kritischste – und in mancher Hinsicht am schwierigsten zu sichernde – Ebene. Andere Schichten, wie z. B. die Infrastruktur, auf der die Anwendungen gehostet werden, haben in der Regel eine geringere Angriffsfläche und sind konsistenter in Bezug auf ihre Inhalte und ihre Konfiguration.
Im Gegensatz dazu sind die meisten Applikationen dem Internet ausgesetzt, was bedeutet, dass sie einem ständigen Risiko von Angriffen ausgesetzt sind. Da Anwendungen zudem eine Vielzahl unterschiedlicher Architekturen verwenden und in verschiedenen Programmiersprachen geschrieben sein können, ist es schwieriger, auf jede Anwendung zugeschnittene Sicherheitsmaßnahmen zu schaffen, als andere Komponenten des Software-Stacks zu schützen.
Darüber hinaus werden die Herausforderungen für die Anwendungssicherheit noch komplexer, wenn Anwendungen in die Cloud verlagert und in verschiedene Cloud-Dienste integriert werden, um Datenverkehr zu verwalten, Daten zu speichern, Zugriffssteuerungseinstellungen durchzusetzen und so weiter. Die Komplexität der Cloud bedeutet, dass Security-Teams bei der Planung einer Sicherheitsstrategie für Cloud-Anwendungen noch mehr Variablen Risiken berücksichtigen müssen.
Dieser Artikel gibt einen Überblick über die wichtigsten Herausforderungen bei der Sicherung von On-Premise Anwendungen und Applikationen in der Cloud. Er erläutert die wichtigsten Sicherheitsrisiken, denen Anwendungen ausgesetzt sind, sowie die Best Practices, die Sicherheits-, DevOps- und IT-Teams befolgen sollten, um das Risiko zu minimieren, dass die Anwendungsschicht Angreifern die Möglichkeit eröffnet, Daten zu exfiltrieren, bösartigen Code auszuführen oder wichtige Services zu unterbrechen.
Was bedeutet Anwendungssicherheit?
Anwendungssicherheit in DevOps ist der Prozess des Schutzes von Anwendungen vor Angriffen und Missbrauch. Wie bereits erwähnt, stellen Anwendungen einen besonderen Teil des Hosting-Stacks dar. Folglich sind Anwendungen mit besonderen Sicherheitsrisiken konfrontiert und erfordern anwendungsspezifische Sicherheitstools.
Um zu verstehen, wie sich die Anwendungssicherheit von anderen Typen von Sicherheitsmaßnahmen unterscheidet, sollten Sie sich vor Augen führen, wie ein Security-Team Zugriffskontrollen für einen Server durchsetzt, der eine Anwendung hostet, und nicht für die Anwendung selbst. Zur Sicherung des Host-Servers könnte sich das Team auf Tools zur Zugriffskontrolle verlassen, die in das Betriebssystem des Servers integriert sind. Auf einem Linux-Server könnte es beispielsweise den Befehl chmod verwenden, um festzulegen, welche Benutzer welche Aktionen auf dem Server durchführen dürfen.
Die Beschränkung des Zugriffs auf eine Anwendung ist jedoch nicht so einfach, da die Art und Weise, wie Benutzer auf die Applikation zugreifen, sehr unterschiedlich sein kann. Die Anwendung könnte eine interne Logik verwenden, um Benutzer zu authentifizieren
zu authentifizieren und die Zugriffsrechte für jeden Benutzer festzulegen. Oder sie könnte ein verteiltes Authentifizierungs-Framework wie OAuth verwenden, um die Zugriffsrechte extern zu verwalten.
Dazu kommt, dass die Regeln für die Zugriffskontrolle innerhalb der CI/CD-Toolchain, die zur Erstellung der Anwendung verwendet wird, ordnungsgemäß definiert werden müssen, um die Anwendung abzusichern. Zu viele Rechte für die GitHub-Repositories oder CI-Tools könnten es böswilligen Nutzern ermöglichen, die Funktionsweise der Applikation zu verändern, indem sie Schadcode in die Lieferkette injizieren.
In diesem Beispiel geht es übrigens um Zugriffskontrollen für Anwendungen, die nur eine von vielen Überlegungen sind, die Security-Teams anstellen müssen, um eine Anwendung zu schützen. Sie müssen auch dafür sorgen, dass die Anwendung Daten sicher verwaltet, Buffer-Overflow-Angriffen widersteht, keine Sicherheitslücken aufweist und so weiter. (Auf die wichtigsten Arten von Risiken für die Anwendungssicherheit gehen wir weiter unten im Detail ein).
Zusammenfassend ist festzuhalten, dass bei der Sicherung von Applikationen eine große Anzahl von Variablen im Spiel ist und Security-Teams eine Vielzahl an Herausforderungen zu bewältigen haben. Tools und Verfahren für die Anwendungssicherheit sind darauf ausgelegt, diese spezifischen Anforderungen zu erfüllen, im Gegensatz zu den Sicherheitsüberlegungen, die andere Schichten des Hosting-Stacks betreffen.
Konventionelle Anwendungssicherheit vs. Cloud-Anwendungssicherheit
Die Herausforderungen für die Anwendungssicherheit werden bei Anwendungen, die in der Cloud gehostet werden, noch größer und komplexer als bei “herkömmlichen” Anwendungen, die in einer On-Premise-Umgebung laufen.
Zu den wichtigsten Unterschieden zwischen konventionellen Anwendungen und Cloud-Anwendungen, die sich auf die Sicherheit auswirken, gehören:
- Weniger Kontrolle: In der Cloud haben die IT- und Security-Teams in der Regel weniger Kontrolle über die Umgebung, in der die Anwendungen gehostet werden. Sie können beispielsweise nicht auf die Betriebssystemprotokolle der zugrundeliegenden physischen Server zugreifen und haben unter Umständen nur begrenzte Möglichkeiten, Zugriffskontrollen auf Netzwerkebene zu definieren. Dies bedeutet, dass Cloud-Anwendungen mit noch mehr Sicherheitsrisiken behaftet sein können und dass die in der Infrastrukturebene des Stacks implementierten Schutzmaßnahmen nicht so effizient sind.
- Anbieterspezifische Security Tools: Public-Cloud-Anbieter bieten Tools und Frameworks wie Identity and Access Management (IAM)-Dienste an, um Anwendungen zu schützen. Die Tools der verschiedenen Clouds funktionieren jedoch alle etwas unterschiedlich, was es schwierig macht, einheitliche und effektive Richtlinien zu definieren, die für alle Clouds gelten. Darüber hinaus hängt das Ausmaß, in dem Anwendungen von Sicherheitstools der Cloud profitieren können, davon ab, wie sie konzipiert sind und wie eng sie in die Cloud-Umgebung integriert sind.
- Verteilte Umgebungen: Obwohl nicht alle Cloud-basierten Anwendungen notwendigerweise eine verteilte Hosting-Architektur verwenden – d. h. eine Architektur, bei der mehrere Anwendungsinstanzen über einen Cluster von Host-Servern verteilt sind – tun dies viele, um die Skalierbarkeit und Flexibilität der Cloud voll auszuschöpfen. Dies hat zur Folge, dass mehr Anwendungsinstanzen gesichert und überwacht werden müssen und das Risiko potenzieller Sicherheitsverletzungen steigt.
- Network Exposure: Cloud-Anwendungen sind fast immer mit dem Internet verbunden, was bedeutet, dass sie ständig Bedrohungen aus dem Netz ausgesetzt sind. Herkömmliche Anwendungen lassen sich leichter durch Firewalls, private Netzwerke oder sogar Air-Gapping (d. h. einer vollständigen Trennung der Anwendungen vom Internet) schützen.
Anwendungssicherheit: Die größten Risiken
Unabhängig davon, welche Art von Anwendung Sie betreiben und ob sie auf Ihren eigenen Servern oder in der Cloud ausgeführt wird, gibt es verschiedene Arten von Sicherheitsrisiken, denen sie ausgesetzt sein kann.
Code Injection Angriffe
Wenn Angreifer in die CI/CD-Pipeline Ihrer Anwendung eindringen, können sie potenziell bösartigen Quellcode in die Codebasis der Anwendung einschleusen (was beispielsweise bei der Codecov-Panne im Jahr 2021 geschah). Wenn Sie den Schadcode nicht abfangen, bevor Sie die nächste Version Ihrer Anwendung erstellen und deployen, wird er schließlich in Ihrer Laufzeitumgebung aktiv.
Cross-site Scripting
Ein Cross-Site-Scripting-Angriff liegt vor, wenn ein Angreifer einen Weg findet, bösartige Skripte in laufende Anwendungen einzuschleusen. Webanwendungen sind die häufigste Art von Anwendungen, auf die Cross-Site-Scripting-Angriffe abzielen, obwohl potenziell jede Art von Anwendung auf diese Weise angegriffen werden kann. Diese Art von Angriffen wird in der Regel durch das Fehlen einer ordnungsgemäßen Eingabevalidierung ermöglicht. Angreifer nutzen dies aus, um die Anwendung zur Ausführung von Skripten zu “verleiten”, die sie in die Anwendung einschleusen.
Fehlerhafte Konfigurationen
Anwendungen stützen sich gewöhnlich auf eine Vielzahl von Konfigurationen, um zu definieren, wie sie sich verhalten. Entwickler legen einige Konfigurationsregeln direkt im Quellcode fest, während andere als Laufzeitvariablen definiert sind. Konfigurationsoptionen in der Host-Umgebung der Anwendung – z. B. welche Zugriffskontroll-Einstellungen im Host-Server oder in der Cloud der Anwendung definiert sind – können sich ebenfalls auf die Ausführung der Anwendung auswirken.
Fehlkonfigurationen auf jeder Ebene innerhalb der Anwendung oder ihrer Host-Umgebung können zu Sicherheitslücken führen. So könnten Entwickler zum Beispiel eine Laufzeitvariable erstellen, die allen Anwendungsbenutzern Administratorrechte verleiht, damit sie die Anwendung vor der Bereitstellung leichter testen können. Wenn sie die Laufzeitvariable versehentlich im diesem hochprivilegierten Modus belassen, wenn die Anwendung in die Produktion gelangt, könnten Angreifer dies dazu missbrauchen, ihre Privilegien zu erweitern.
Schwachstellen im Quellcode
Es gibt eine Reihe von Programmierungs- und Flüchtigkeitsfehlern, die sich in den Quellcode von Anwendungen einschleichen können. Beispielsweise können Entwickler es versäumen, Code zu schreiben, der Eingaben ordnungsgemäß validiert, wodurch Angreifer sensible Daten ausspähen können, indem sie bösartige Befehle in die Anwendung einschleusen. Oder eine schlechte Speicherverwaltung der Anwendung kann einen “Buffer Overflow”-Angriff ermöglichen, bei dem ein Angreifer eine fehlerhafte Anwendung ausnutzt, um den Systemspeicher zu überschreiben und bösartigen Code auszuführen.
Verwundbare Abhängigkeiten
Es ist üblich, dass Entwickler Abhängigkeiten für Anwendungen definieren. Abhängigkeiten sind externe Module, Bibliotheken oder andere Ressourcen, die eine Anwendung benötigt, um ausgeführt werden zu können. Wenn diese Abhängigkeiten Schwachstellen enthalten, können sie von Angreifern ausgenutzt werden, um die Kontrolle über die Anwendung zu übernehmen oder auf sensible Daten zuzugreifen, die von der Anwendung kontrolliert werden.
Best Practices für Anwendungssicherheit & Cloud Application Security
Da die Risiken für die Anwendungs- und Cloud-Anwendungssicherheit so vielfältig sind, sollten Unternehmen eine ganze Reihe von Abwehrmaßnahmen ergreifen, um sich vor ihnen zu schützen.
Sichern Sie Ihre Software-Lieferkette
Wie bereits erwähnt, können unsichere Konfigurationen oder Tools innerhalb der Software Delivery-Pipeline Backdoors schaffen, die potenzielle Angreifer ausnutzen können. Daher ist es von zentraler Bedeutung, nicht nur die Anwendung selbst, sondern auch alle Tools und Ressourcen zu sichern, auf die sich Ihre Teams beim Schreiben, Testen und Bereitstellen der Anwendung verlassen.
Nutzen Sie verschiedene Application Security Testing Tools, um die Sicherheit Ihrer Anwendung zu gewährleisten
Es gibt verschiedene Arten von Tools, um die Sicherheit von Anwendungen zu testen und zu validieren:
- Software Composition Analysis (SCA): SCA-Tools scannen den Quellcode, um anfällige Komponenten und Abhängigkeiten zu erkennen.
- Statische Anwendungssicherheitstests (SAST): SAST-Tools werten den Quellcode aus, um Sicherheitslücken zu finden, z. B. das Fehlen einer ordnungsgemäßen Eingabevalidierung.
- Dynamische Anwendungssicherheitstests (DAST): DAST ermöglicht es Teams, Tests gegen Live-Anwendungen durchzuführen, um Schwachstellen zu entdecken, die Angreifer ausnutzen könnten.
- Cloud Security Posture Management (CSPM): CSPM-Tools sind per se keine Lösungen für die Anwendungssicherheit, da sie die Konfigurationen von Cloud-Diensten, die Ihre Anwendungen hosten, validieren und nicht die Anwendungen selbst.
Dennoch kann CSPM Konfigurationsfehler aufdecken, wie z. B. schwache IAM-Einstellungen, die zu Angriffen auf Anwendungen führen können.
Durch den Einsatz all dieser Tools maximieren DevOps-Teams ihre Chancen, alle Arten von Anwendungssicherheitsrisiken zu erkennen, die im Quellcode, in den Binärdateien und in den Laufzeitumgebungen von Anwendungen vorhanden sein können.
Vermeiden Sie unnötige Anwendungskomponenten
Je einfacher Ihre Anwendung ist, desto geringer ist auch das Risiko eines Angriffs. Aus diesem Grund ist es eine bewährte Praxis, unnötige Abhängigkeiten, Erweiterungen oder andere Komponenten zu vermeiden, die die Angriffsfläche der Anwendung unnötig vergrößern.
Validieren Sie Ihre Abhängigkeiten
Da unsichere Abhängigkeiten ein Hauptvektor für Sicherheitsverletzungen in Anwendungen sind, ist es entscheidend, ein Tool zum Scannen der Anwendungssicherheit zu verwenden, um zu wissen, welche Abhängigkeiten Ihre Anwendung hat und welche Version die jeweilige Abhängigkeit hat. Versionsinformationen sind von zentraler Bedeutung, da in vielen Fällen nur bestimmte Versionen einer Abhängigkeit bekannten Sicherheitsrisiken ausgesetzt sind.
Härten Sie Ihr Betriebssystem
Einige Betriebssysteme bieten “Härtungs-Tools”, wie z.B. SELinux und AppArmor, die das Risiko von Sicherheitsverletzungen in Anwendungen verringern sollen. Diese Frameworks beheben zwar nicht die zugrundeliegenden Sicherheitsrisiken in den Anwendungen, können aber zumindest deren Ausnutzung erschweren, indem sie beispielsweise verhindern, dass kompromittierte Anwendungen durch einen Buffer Overflow den Systemspeicher überschreiben.
Der Einsatz solcher “Hardening-Tools”, wo immer möglich, ist eine Best Practice für die Absicherung von Anwendungen. Beachten Sie jedoch bitte, dass Sie im Falle von Cloud-Anwendungen nicht immer die erforderliche Kontrolle über die Hosting-Umgebung haben, um Frameworks wie SELinux oder AppArmor auch zu installieren.