Skip to main content

Serverless-Observability, -Monitoring und -Sicherheit verbessern

Artikel von

15. Juli 2019

0 Min. Lesezeit

Funktionen haben oft eine kurze Laufzeit, werden in großer Zahl bereitgestellt und mit zunehmender Skalierung immer häufiger aufgerufen. Deshalb verliert man leicht den Überblick über den Ereignisfluss oder kann die Ursache eines Fehlers nur schwer ermitteln.

Mit zunehmender Verbreitung von Serverless in einem Unternehmen wird es außerdem immer schwieriger, unsichere Abläufe und böswillige Versuche von Angreifern zu überwachen, eine Funktion in einen unsicheren Codepfad zu zwingen.

Damit Sie Funktionen bereitstellen und gleichzeitig sicher bleiben können, empfehlen wir:

In einem früheren Beitrag habe ich weitere Einblicke in die Serverless-Sicherheit geteilt: 10 Best Practices für Serverless-Sicherheit. Den Beitrag sollten Sie sich für später merken. Doch zunächst geht es um Monitoring- und Logging-Praktiken, die Sie auf Ihre cloudbasierten Serverless-Projekte anwenden können.

Machen Sie sichtbar, zu welchen Umgebungen die Funktionen gehören

Funktionen sind praktisch kostenlos, da Kosten nur bei ihrem Aufruf anfallen. Deshalb stellen wir viele davon bereit. Mit der Zeit stellt jedoch jede Funktion ein Sicherheitsrisiko dar, da sie möglicherweise Zugriff auf unser Netzwerk und unsere Daten ermöglicht. Außerdem können die in den Funktionen verwendeten Bibliotheken mit der Zeit veralten und anfällig werden. Nach der Bereitstellung lässt sich eine Funktion nur schwer löschen, wenn unklar ist, wem sie gehört und wer organisatorisch für sie verantwortlich ist, oder diese Zuständigkeit nie festgelegt wurde.

Damit Sie nicht den Überblick über Funktionen, ihren Zweck und die zugehörigen Umgebungen verlieren, legen Sie Folgendes fest:

  • strenge Regeln für die bereitgestellten Funktionen, damit klar ist, welche Funktionen langfristig in der Produktion, experimentell, im Backoffice usw. eingesetzt werden

  • klare Richtlinien dafür, wann eine Funktion entfernt werden sollte

AWS hat kürzlich die Möglichkeit eingeführt, Lambda-Funktionen mit Tags zu versehen, damit sie sich leicht nachverfolgen und gruppieren lassen. Mit dem Serverless-Framework können Sie Funktionen in den YAML-Dateien taggen – entweder global (für alle Funktionen in der Datei serverless.yml) oder für einzelne Funktionen:


1 service:
2  name: hello-world
3
4 provider:
5  name: aws
6  runtime: nodejs8.10
7  stage: ${opt:stage, 'dev'}
8  region: ${opt:region, 'us-east-1'}
9  profile: production
10  tags:
11    foo: bar
12    baz: qux
13  functions:
14    helloWorld:
15      handler: helloworld.get
16      name: helloworld
17      description: My function
18      tags:
19        foo: bar

Der obige Code zeigt zwei Arten von Tags, die für Lambda-Funktionen auf AWS verfügbar sind:

  • Zeile 10 zeigt globale Tags in der Bereitstellung über serverless.yml, die allen Funktionen zugewiesen sind

  • Zeile 18 zeigt ein foo-Tag, das nur der Funktion helloWorld zugewiesen ist

Funktionen auf Sicherheitslücken überwachen

Es gibt viele Möglichkeiten, Funktionen bereitzustellen, und die Zahl der bereitgestellten Funktionen kann schnell außer Kontrolle geraten. Mit der Zeit können Code und Abhängigkeiten in diesen Funktionen veralten und anfällig werden, wenn der Wartungsaufwand abnimmt und sich der Fokus auf andere Projekte verlagert.

Nutzen Sie eine Lösung, die sich in Ihren Function-as-a-Service-Anbieter (FaaS) integrieren lässt, um die bereitgestellten Funktionen zu überwachen und aktuell zu halten. So können Sie bekannte Sicherheitslücken über den gesamten Softwareentwicklungszyklus hinweg beheben, die Funktionen und die Verwendung ihrer Open-Source-Abhängigkeiten betreffen.

Die folgende Abbildung zeigt das GitHub-Projekt lirantal/bazz-serverless nach einem Scan. Das Projekt weist mehrere Schwachstellen mit hohem, mittlerem und niedrigem Schweregrad auf. Es handelt sich um den Quellcode meines Serverless-Projekts, das mehrere Funktionen bereitstellt. Unter dem GitHub-Projekt-Repository sehen Sie alle sechs AWS-Lambda-Funktionen, die ich bereitgestellt habe. Dies sind die tatsächlichen Funktionen, wie sie von AWS bereitgestellt und ausgeführt werden.

Snyk hat all diese einzelnen Funktionen auf bekannte Sicherheitslücken überprüft. Da jede von ihnen denselben Abhängigkeitsbaum verwendet, sehen wir, dass sie alle mit anfälligen Bibliotheken bereitgestellt wurden.

Interessanterweise gibt es im Projekt-Repository vier Schwachstellen mit niedrigem Schweregrad, die in den einzelnen Funktionen jedoch nicht auftauchen. Der Grund: Die bereitgestellte Version unterscheidet sich von der im Git-Repository gespeicherten Version. Die bereitgestellte Funktion ist veraltet und enthält eine Bibliothek nicht, die ich dem Quellcode hinzugefügt hatte.

Hätte ich die Sicherheit meines Projekts nicht nachverfolgt, hätte ich weitere anfällige Bibliotheken in der Produktionsumgebung bereitstellen und dadurch die Angriffsfläche meiner App vergrößern können.

Snyk-Oberfläche mit der Auswahl eines GitHub-Repositorys für ein Serverless-Projekt sowie einer Liste von AWS-Lambda-Funktionen und der Anzahl der Schwachstellen.

Ressourcenzugriffe überwachen

Stellen Sie sich folgendes Szenario vor: Ein Angreifer nutzt eine Sicherheitslücke in einer Node.js-Funktion aus, die die Event-Loop blockiert, indem er sie zu rechenintensiven CPU-Operationen zwingt. Aufgrund des Function-as-a-Service-Paradigmas, bei dem Funktionen bei Bedarf gestartet werden, um neue Anfragen zu bearbeiten, lässt sich das möglicherweise nur schwer erkennen. Das scheint eine großartige Funktion zu sein – und ist es in gewisser Hinsicht wahrscheinlich auch. Der Nachteil: Ihre Cloud-Rechnung steigt aufgrund der nutzungsabhängigen Kosten für Funktionen stark an.

Erstellen Sie eine Monitoring-Strategie mit Richtlinien, Warnmeldungen und Durchsetzungsmaßnahmen, um unbeabsichtigte Funktionsaufrufe zu erkennen und zu blockieren. Berücksichtigen Sie beim Monitoring die folgenden Ressourcen:

  • CPU

  • Arbeitsspeicher

  • Ein- und Ausgabe: Verbrauch und Vorgänge

  • Dateizugriffe, z. B. Lese- und Schreibzugriffe

  • Laufzeit der Funktion

  • Aufrufabläufe der Funktion und Abweichungen von den erwarteten Aufrufquellen

  • Ausführung von untergeordneten Prozessen

Cloud-Anbieter bieten häufig integrierte Monitoring-Funktionen für Anwendungen und Funktionsressourcen, die entsprechende Einblicke liefern. Microsoft bietet Azure Monitoring, Amazon AWS X-Ray. Als Beispiel sehen Sie anhand der offiziellen AWS-Dokumentation die AWS-X-Ray-Konsole mit Einblicken in den Datenfluss durch Funktionen und andere Cloud-Ressourcen sowie Kennzahlen wie die Ausführungszeit.

Diagramm zum Ablauf einer Serverless-Anwendung mit Verbindungen zwischen Clients, AWS-Lambda-Funktionen, SNS, Elastic Beanstalk und DynamoDB-Tabellen sowie Latenzmetriken.

Sobald das Monitoring eingerichtet ist, setzen Sie funktionsbezogene Grenzwerte durch, um eine Erschöpfung finanzieller Ressourcen zusätzlich zu verhindern.

Funktionen protokollieren

Logs werden nach Funktionsgruppen geordnet und liefern dadurch wertvolle zusätzliche Einblicke. Bei unsachgemäßem Umgang können sie jedoch auch weitere Sicherheitsprobleme verursachen.

So holen Sie das Maximum aus Logs heraus:

  • Protokollieren Sie Ereignisse, ihren Kontext und Fehlerinformationen möglichst ausführlich.

  • Nutzen Sie die Logging-Funktionen Ihres Cloud-Anbieters.

  • Implementieren Sie ein zentrales Log-Management-System, damit Ihr Team Probleme leicht debuggen und Ereignisse finden kann.

  • Verknüpfen Sie Logs und besondere Ereignisse mit Schwellenwerten und Warnmeldungen. So dienen Logs nicht nur als Prüfpfad, sondern lösen auch Warnmeldungen aus, wenn Probleme sofortige Aufmerksamkeit erfordern.

Achten Sie dabei darauf, keine sensiblen Informationen wie Zugangsdaten oder übermäßig viele Daten wie Umgebungsvariablen zu protokollieren. Stellen Sie außerdem sicher, dass Sie die geltenden DSGVO-Vorschriften einhalten und keine personenbezogenen Daten protokollieren.

Zusammenfassung

Lesen Sie für weitere Sicherheitsaspekte beim Entwickeln und Bereitstellen von Serverless-Funktionen die ausführliche Liste mit 10 Best Practices für Serverless-Sicherheit.