13 Best Practices zum Sichern von Microservices

Sicherheitsaspekte in Microservices-Architekturen

Die Microservices-Architektur erweist sich als äußerst anpassungsfähig und skalierbar. Sie ermöglicht es, Softwarekomponenten nach Bedarf zu modifizieren, hinzuzufügen oder zu entfernen, ohne die Funktionalität anderer Anwendungsbereiche zu kompromittieren.

Neben einer Beschleunigung der Softwareentwicklungszyklen, kleineren Entwicklungsteams und der Flexibilität bei der Wahl der Programmiersprachen, erlaubt diese Architektur, bestimmte Funktionen oder Dienste unabhängig voneinander zu skalieren oder Fehler zu beheben, ohne andere Komponenten zu beeinträchtigen.

Im Wesentlichen ermöglichen Microservices die Aufteilung umfassender, monolithischer Anwendungen in eigenständige, separate Dienste. Diese kleineren, unabhängigen Dienste führen jedoch zu einer Erhöhung der Komponentenanzahl, was die Komplexität und die Schwierigkeit der Absicherung erhöht.

Vergleich: Monolithische vs. Microservices-Architektur: Red Hat

Eine typische Microservices-Implementierung umfasst in der Regel verschiedene Ebenen: Hardware, Dienste oder Anwendungen, Kommunikation, Cloud, Virtualisierung und Orchestrierung. Jede dieser Ebenen birgt spezifische Sicherheitsanforderungen, Kontrollen und Herausforderungen.

Sicherheitsherausforderungen in Microservices-Umgebungen

Microservices sind oft weitverzweigte Systeme mit komplexen Zugriffsstrukturen, einem erhöhten Datenverkehrsaufkommen, das überwacht werden muss, und einer größeren Angriffsfläche. Die meisten Microservices-Umgebungen werden zudem in Cloud-Infrastrukturen betrieben, die ihrerseits unterschiedliche Sicherheitskonfigurationen und Kontrollen aufweisen.

Aufgrund der großen Anzahl exponierter APIs, Ports und Komponenten bieten konventionelle Firewalls möglicherweise keinen ausreichenden Schutz. Diese Faktoren erhöhen die Anfälligkeit von Microservices-Implementierungen gegenüber diversen Cyberbedrohungen wie Man-in-the-Middle-Attacken, Injection-Angriffen, Cross-Site-Scripting, DDoS-Attacken und anderen.

Die Netzwerksicherheit stellt eine weitere Herausforderung bei Microservices dar, insbesondere im Hinblick auf Identitäts- und Zugriffsmanagement, das eine neue Komplexitätsebene erreicht. Weitere potenzielle Schwachstellen liegen in unsicherem Code und Fehlern in Diensterkennungssystemen.

Obwohl die Absicherung von Microservices komplexer ist als bei monolithischen Anwendungen, ist ein wirksamer Schutz durch eine durchdachte Strategie und die Anwendung bewährter Praktiken möglich.

Idealerweise sollte die Architektur einen verteilten Ansatz verfolgen, der alle relevanten Komponenten einbezieht.

Typische Bereiche, die berücksichtigt werden müssen, sind:

  • Schutz von Anwendungen, Microservices und Endbenutzern
  • Sicheres Identitäts- und Zugriffsmanagement
  • Datensicherheit
  • Verbesserung der Sicherheit der Service-zu-Service-Kommunikation
  • Überwachung von Microservices und Sicherheitssystemen

Bewährte Praktiken zur Absicherung von Microservices

Eine der effektivsten Strategien ist die Kombination von Best Practices, Tools und Kontrollen, um das gesamte Ökosystem zu schützen. Der spezifische Ansatz kann je nach Art der Dienste, Anwendungen, Benutzer, der Umgebung und anderen Faktoren variieren.

Bei der Entscheidung für die Nutzung von Microservices ist es unerlässlich, sicherzustellen, dass alle Sicherheitsanforderungen für die Dienste, Verbindungen und Daten erfüllt sind.

Im Folgenden werden einige wirksame Sicherheitspraktiken für Microservices vorgestellt.

#1. Sicherheit von Anfang an integrieren 👮

Sicherheit muss ein integraler Bestandteil des gesamten Entwicklungszyklus sein. Idealerweise sollte Sicherheit von Beginn an in die Entwicklung und Bereitstellung von Microservices integriert werden. Dieser Ansatz ist oft einfacher, effektiver und kostengünstiger, als die Sicherheit erst kurz vor Abschluss der Softwareentwicklung nachträglich hinzuzufügen.

#2. Einsatz eines mehrschichtigen Sicherheitskonzepts

Das Konzept der „Defense in Depth“ (DiP) beinhaltet die Anwendung mehrerer Sicherheitsebenen auf Dienste und Daten. Diese Technik erschwert es Angreifern, die verschiedenen Schichten zu durchdringen und bietet so einen stärkeren Schutz für Ihre Dienste und Daten.

Im Gegensatz zu perimeterbasierten Sicherheitslösungen wie Firewalls setzt DiP auf eine Kombination von Werkzeugen wie Antivirensoftware, Firewalls, Patch-Management und Anti-Spam-Software, um verschiedene Sicherheitsebenen über das gesamte System zu verteilen.

Grafik: Mehrschichtige Defense-in-Depth-Sicherheit: Imperva

Bei diesem Ansatz müssen zuerst die sensiblen Dienste identifiziert und dann entsprechende Sicherheitsebenen um diese implementiert werden.

#3. Sicherheit auf Containerebene implementieren 📦

Microservices basieren häufig auf Containertechnologien. Daher ist die Sicherung von Containern, sowohl intern als auch extern, eine Möglichkeit, die Angriffsfläche und Risiken zu reduzieren. Die Einhaltung des Sicherheitsprinzips der geringsten Privilegien ist eine gute Praxis und erfordert eine Kombination von Strategien, darunter:

  • Beschränkung der Berechtigungen auf das notwendige Minimum
  • Vermeidung der Ausführung von Diensten und anderen Prozessen mit sudo- oder privilegierten Konten
  • Beschränkung oder Kontrolle des Zugriffs und der Nutzung verfügbarer Ressourcen. Beispielsweise hilft die Beschränkung des Zugriffs von Containern auf Betriebssystemressourcen, Datendiebstahl oder Kompromittierung zu verhindern.
  • Keine Speicherung von Geheimnissen auf dem Container-Dateisystem
  • Verwendung geeigneter Regeln zur Isolierung des Ressourcenzugriffs

Es ist auch wichtig sicherzustellen, dass Container-Images keine Sicherheitslücken aufweisen. Regelmäßige Sicherheits- und Schwachstellenscans von Containern helfen, Risiken zu identifizieren.

Zu den gängigen Tools für Image-Scans gehören Clair, Anchore und andere.

#4. Multi-Faktor-Authentifizierung einsetzen 🔒

Die Aktivierung der Multi-Faktor-Authentifizierung erhöht die Sicherheit des Frontends.

Benutzer müssen nicht nur Benutzername und Passwort, sondern auch eine zweite Form der Bestätigung angeben, wie einen Code, der an ihr Telefon oder eine bestimmte E-Mail-Adresse gesendet wird. Dies erschwert es Angreifern erheblich, selbst bei gestohlenen oder gehackten Anmeldeinformationen auf die Microservices zuzugreifen, da sie die zweite Authentifizierung nicht bereitstellen können.

#5. Verwendung von Benutzeridentitäts- und Zugriffstoken

Bei der Bereitstellung von Microservices benötigen zahlreiche Anwendungen und Dienste eine sichere Autorisierung und Zugriffskontrolle. Ein Autorisierungs-Framework wie OAuth 2.0 und OpenID ermöglicht eine sichere Verwaltung von Token zum Schutz der Microservices. Dadurch können Anwendungen von Drittanbietern auf bestimmte Dienste oder Benutzerdaten zugreifen.

In einem typischen Szenario fordert die Hauptanwendung den Benutzer auf, den Drittanbieterdienst zu autorisieren. Nach der Zustimmung generiert die Anwendung ein Zugriffstoken für die Sitzung.

Insbesondere OAuth ist eine der effektivsten Strategien für Benutzeridentität und Zugriffskontrolle. Es gibt zwar auch andere Autorisierungsprotokolle, und es ist möglich, eigene zu entwickeln, es wird jedoch empfohlen, OAuth zu verwenden, da es standardisiert, stabil und weit verbreitet ist.

#6. API-Gateway erstellen

Microservices bestehen in der Regel aus vielen Komponenten, die über verschiedene Netzwerke verteilt und von einer Vielzahl von Systemen und Clients aus zugänglich sind. Die Exposition der Microservices erhöht deren Schwachstellen und Sicherheitsrisiken. Eine Möglichkeit, diese zu schützen, ist die Schaffung eines zentralen und sicheren Zugangspunkts, um den gesamten Zugriff externer Systeme und Clients zu bündeln.

Dafür wird ein API-Gateway implementiert, das alle eingehenden Anfragen auf Sicherheitsrisiken prüft, bevor sie an die entsprechenden Microservices weitergeleitet werden. Das API-Gateway dient als Schnittstelle zwischen den Clientanwendungen und den Microservices. Es beschränkt die Offenlegung der Microservices und bietet zusätzliche Funktionen zur Anforderungsverwaltung, wie Authentifizierung, SSL-Terminierung, Protokollübersetzung, Überwachung, Weiterleitung von Anfragen und Caching.

Dieser Ansatz leitet alle externen Dienste über das API-Gateway an die Microservices weiter und unterstützt gleichzeitig das „Defense-in-Depth“-Sicherheitsprinzip.

Grafik: Microservices-API-Gateway: Livebook

Gängige API-Gateways sind NGINX, Kong, Tyk, Ambassador, AWS API Gateway und andere.

Weitere Informationen zur API-Sicherheit finden Sie in unserem Leitfaden: Warum und wie man API-Endpunkte sichert.

#7. Profilierung von APIs basierend auf der Bereitstellungszone

Implementieren Sie rollenbasierte Beschränkungen, um sicherzustellen, dass Benutzer nur Zugriff auf die APIs und Dienste haben, die sie tatsächlich benötigen. Da Schadsoftware oft Dienste für eine größere Anzahl von Personen zugänglich macht, verringert die Beschränkung des Zugriffs auf autorisierte Benutzer die Risiken. Eine Möglichkeit, die Gefährdung zu reduzieren, besteht darin, APIs basierend auf den Benutzern zu kennzeichnen, die Zugriff darauf haben sollten. APIs können unterteilt werden in:

  • Ethernet-APIs – für Dienste, die außerhalb des Rechenzentrums für die Öffentlichkeit zugänglich sind
  • Unternehmenszonen-APIs – für den internen privaten Datenverkehr
  • DMZ-APIs – zur Verarbeitung von Datenverkehr aus dem Internet
  • Hybridzonen-APIs – für Bereitstellungen in Rechenzentren

#8. Sicherung der Service-zu-Service-Kommunikation

Wirksame Praktiken umfassen die Authentifizierung und Autorisierung von Anfragen, wenn zwei Microservices miteinander kommunizieren.

Es gibt im Wesentlichen drei Haupttechniken zur Sicherung der Kommunikation zwischen Diensten: Trust the Network, JSON Web Token (JWT) und Mutual Transport Layer Security (mTLS oder Mutual TLS).

Grafik: Sicherung der Service-Kommunikation mit JWT: Livebook

Von diesen drei Techniken ist mTLS die beliebteste. Bei diesem Ansatz muss jeder Microservice ein öffentliches/privates Schlüsselpaar besitzen. Der Client-Microservice verwendet dann das Schlüsselpaar zur Authentifizierung beim empfangenden Microservice über mTLS.

Während der Authentifizierung generiert jeder Microservice ein Zertifikat, und jeder verwendet das Zertifikat des anderen, um sich zu authentifizieren.

Während TLS Integrität und Vertraulichkeit der übertragenen Daten gewährleistet, ermöglicht es dem Client auch, einen Microservice zu identifizieren. Der Client-Microservice kennt normalerweise den anderen Microservice. Da TLS jedoch unidirektional ist, kann ein empfangender Microservice den Client-Microservice nicht überprüfen – und Angreifer können diesen Umstand ausnutzen. mTLS hingegen bietet eine Methode, mit der jeder Microservice den anderen identifizieren kann.

#9. Begrenzung des Client-Traffics 🚏

Die Begrenzung des externen Datenverkehrs verhindert Probleme wie Denial-of-Service-Angriffe (DoS) und Situationen, in denen einige Clients den Großteil der Anwendungsbandbreite beanspruchen. Ein Ansatz ist die Anwendung verschiedener Regeln, die die vom Client gesendete oder empfangene Datenverkehrsrate basierend auf IP-Adresse, Zeit usw. überwachen und steuern können.

Konfigurieren Sie Ihre Dienste so, dass sie bei mehreren fehlgeschlagenen Anmeldeversuchen bei Ihren APIs oder anderen verdächtigen Aktivitäten verlangsamt werden.

Ein langsam reagierendes System kann Angreifer abschrecken und sie eher veranlassen, ihren Versuch, auf die Dienste zuzugreifen, aufzugeben. Die Ratenbegrenzung kann über das API-Gateway, Code oder andere Techniken erfolgen. Die meisten SaaS-Umgebungen verfügen standardmäßig über eine API-Ratenbegrenzung, um Missbrauch durch Benutzer und Angriffe zu minimieren.

#10. Einsatz von Orchestrierungsmanagern

Orchestrierungsmanager ermöglichen die Automatisierung der Konfiguration, Koordination und anderer Verwaltungsaufgaben von Microservices und verbessern gleichzeitig die Sicherheit. Diese Tools erlauben es, mehrere Container zu verwalten, den Zugriff auf Metadaten einzuschränken, Workloads zu trennen und Protokolle zu sammeln.

Einige Orchestrierungstools bieten zusätzliche Funktionen, die es Entwicklern ermöglichen, vertrauliche Informationen wie SSL-Zertifikate, Verschlüsselungsschlüssel, Passwörter und Identitätstoken zu speichern und sicher zu teilen.

Die zwei gängigen Methoden für eine effektive Microservice-Orchestrierung sind:

  • Kodierung der Orchestrierung als Microservice
  • Verwendung der API-Gateways zur Bereitstellung einer Orchestrierungsebene

Die Orchestrierung über das API-Gateway wird aufgrund von Herausforderungen nicht empfohlen, wenn Dienste skaliert werden müssen.

Grafik: Microservice-Orchestrierungsebene: Globallogik

Typische Orchestrierungs-Management-Tools sind Kubernetes, Istio, Azure Kubernetes Service (AKS) usw.

Weitere Informationen finden Sie unter Container-Orchestrierung für DeOps.

#11. Überwachung aller Systeme und Dienste

Da Microservices auf verteilte Systeme angewiesen sind, ist eine zuverlässige und effektive Überwachungsstrategie für alle einzelnen Komponenten erforderlich.

Durch den Einsatz kontinuierlicher Überwachung können Sicherheitsrisiken rechtzeitig erkannt und behoben werden. Es gibt eine breite Palette von Microservices-Überwachungslösungen, darunter Prometheus, Statsd, InfluxDB, Logstash und andere.

Grafik: Überwachung von Microservices.

Überwachung innerhalb der Microservices-Architektur

Verwenden Sie geeignete Tools, um interne Systeme und Dienste zu überwachen. Einige bewährte Praktiken sind:

  • Aktivierung der Protokollierung auf Anwendungsebene. Sie können Splunk, Grafana, ELK-Stack und andere Tools nutzen, um Protokolle auf Anwendungs-, Container-, Netzwerk- und Infrastrukturebene zu sammeln.
  • Überwachung von Nutzungskennzahlen
  • Verwenden von Trends in Metriken wie CPU, Arbeitsspeicher, Antwortzeiten, Fehlern, Benachrichtigungen und anderen, um ungewöhnliche Aktivitäten zu erkennen, die auf einen bestehenden oder potenziellen Angriff hinweisen können.
  • Prüfen Sie Protokolle in Bereichen wie eingehenden Clientanfragen, Datenbankeinträgen, Containern und anderen, um Inkonsistenzen oder ungewöhnliche Aktivitäten zu identifizieren.

#12. Automatisierung von Sicherheitsaktivitäten

Automatisieren Sie Sicherheitsprozesse wie die Bereitstellung von Updates, Schwachstellenscans, Überwachung, Durchsetzung von Richtlinien und andere Aktivitäten. Überprüfen Sie auch Updates, um sicherzustellen, dass sie sicher sind und keine neuen Schwachstellen verursachen.

Nach Updates sollte die Sicherheitssoftware idealerweise Tests an allen Containern und Microservices durchführen, um festzustellen, ob möglicherweise bereits zuvor Schwachstellen oder Sicherheitsprobleme vorhanden waren.

#13. Schutz von Daten zu jeder Zeit 🛡️

Schützen Sie Daten sowohl während der Übertragung als auch im Ruhezustand. Erzwingen Sie idealerweise die Verwendung von HTTPS für die gesamte Kommunikation, um Daten während der Übertragung zu sichern, und die Verschlüsselung aller sensiblen Daten im Ruhezustand. Vermeiden Sie die Übertragung und Speicherung von Klartext-Passwörtern, Schlüsseln, Anmeldeinformationen und sensiblen Daten außerhalb des Codes.

Die beste Strategie ist, alle sensiblen Daten so früh wie möglich mit Standardtechnologien zu verschlüsseln und sie so spät wie möglich zu entschlüsseln, um das Expositionsrisiko zu minimieren.

Fazit

Microservices stützen sich auf verteilte Komponenten, um Vorteile wie erhöhte Flexibilität und Bereitstellungsoptionen zu bieten. Bei der Nutzung von Microservices müssen Unternehmen jedoch interne Sicherheitsrichtlinien und -strategien an einen Cloud-nativen und verteilten Ansatz anpassen.

Idealerweise sollte die Angriffsfläche reduziert und die Microservices-Umgebung, APIs, Anwendungen und Daten geschützt werden.