Cloud-Ressourcen umfassender erfassen, um Infrastrukturabweichungen zu reduzieren
Stephane Jourdan
23. März 2022
0 Min. LesezeitHinweis zur Einstellung: Drift-Erkennung für verwaltete Ressourcen
Die Drift-Erkennung für verwaltete Ressourcen, einschließlich snyk iac describe --only-managed and snyk iac describe --drift, wurde eingestellt. Die Drift-Erkennung für verwaltete Ressourcen wird am 30. September 2023 endgültig eingestellt.
Als Entwickler benötigen wir maximale Transparenz darüber, was tatsächlich in unseren Cloud-Umgebungen ausgeführt wird, um sie sicher zu halten. Mit Infrastructure as Code (IaC) können Entwickler ihre Cloud-Infrastrukturen automatisieren. So behalten sie die Kontrolle über die in der Cloud bereitgestellten Ressourcen und können diese problemlos überprüfen. Eine vollständige IaC-Abdeckung Ihrer Infrastruktur zu erreichen und aufrechtzuerhalten, bringt jedoch viele Herausforderungen mit sich.
Unsere Sicherheit ist nur so gut wie das, was tatsächlich in unseren Cloud-Umgebungen bereitgestellt wird und läuft. Häufig werden regelmäßig noch viele manuelle Änderungen vorgenommen – von uns, anderen Teams oder authentifizierten Diensten. Diese Änderungen sind für IaC und Audits nicht sichtbar und können zu Problemen wie Fehlkonfigurationen und Sicherheitsrisiken führen. Genau deshalb ist das Management von Abweichungen wichtig: Wir benötigen Berichte über Ressourcen, die noch nicht durch IaC verwaltet werden oder aus irgendeinem Grund geändert wurden.
In diesem Artikel zeigen wir, wie Snyk IaC Entwickler dabei unterstützt, Cloud-Ressourcen zu finden, die nicht durch Infrastructure as Code (IaC) verwaltet werden (nicht verwaltete Ressourcen) oder von ihrem erwarteten Zustand abweichen (verwaltete Ressourcen).
Umgebung einrichten
Mit Snyk IaC können Sie die gefundenen Ressourcen als Terraform-Ressourcen auflisten. So sehen Sie leicht, welcher Teil des Cloud-Dienstes von der Erkennung betroffen ist. Ein einzelner Amazon-API-Gateway-v2-Dienst besteht beispielsweise aus mindestens 12 Terraform-Ressourcen. Dank der von Snyk bereitgestellten Erkennungsinformationen können Sie schnell entscheiden, ob Sie die Änderung rückgängig machen, eine neue Ressource importieren oder die neue Änderung einfach löschen möchten.
Für die Anleitung können Sie die folgende Terraform-Datei verwenden, um zwei AWS-Ressourcen zu erstellen. Wir verwenden sie im weiteren Verlauf. Sie erstellt einen IAM-Benutzer namens „user1“ mit einem zufälligen Suffix, einen Zugriffsschlüssel und eine angehängte Richtlinie mit schreibgeschütztem Zugriff.
Zum Zeitpunkt der Erstellung dieses Artikels haben wir Terraform v1.1.7 mit dem AWS-Provider v3.74.2 verwendet.
Verwenden Sie die folgende HCL-Konfiguration erneut:
main.tf
Wenden Sie diese Terraform-Konfiguration an:
Vergewissern Sie sich, dass sich im Stammverzeichnis des Verzeichnisses eine terraform.tfstate befindet:
Vergewissern Sie sich außerdem, dass der IAM-Benutzer erfolgreich in AWS erstellt wurde.
Mit einer sauberen Ausgangsbasis beginnen
Listen wir zunächst alle Cloud-Ressourcen auf, die nicht von Terraform verwaltet werden:
Wahrscheinlich erhalten Sie eine umfangreiche Liste mit Ressourcen, die nicht von Terraform verwaltet werden. Das sind zwar nützliche Informationen, für unseren Anwendungsfall jedoch nicht sehr handlungsrelevant. Snyk IaC bietet eine integrierte Möglichkeit, Ressourcen gesammelt zu ignorieren, indem alle gefundenen Ressourcen zur Richtliniendatei .snyk hinzugefügt werden.
Ignorieren wir alle vorhandenen, nicht verwalteten Ressourcen, damit wir in einer kontrollierten Umgebung präziser arbeiten können – nur mit den beiden oben erstellten Ressourcen:
Führen Sie erneut einen Scan durch, um zu bestätigen, dass Ihre Umgebung die erkannten Abweichungen jetzt ignoriert. (Sie haben später noch genügend Zeit, den Import dieser Ressourcen zu planen.)
Jetzt können wir mit einer sauberen Ausgangsbasis beginnen.
Abweichungen mit IAM erzeugen
Wir erzeugen nun drei Arten von Abweichungen, um Situationen aus der Praxis nachzustellen:
Eine Änderung am vorhandenen IAM-Benutzer (die wir rückgängig machen möchten)
Eine manuelle Zuordnung einer neuen IAM-Richtlinie (die wir entfernen möchten)
Ein neuer IAM-Benutzer (den wir verbessern möchten)
Navigieren Sie dazu zur AWS-IAM-Konsole.
Vorhandenen IAM-Benutzer durch Hinzufügen eines Tags ändern
Klicken Sie auf der Seite „IAM-Benutzer“ auf „user1“.
Klicken Sie auf den Tab Tags.
Klicken Sie auf die Schaltfläche Edit Tags.
Fügen Sie einen neuen Schlüssel („environment“) und einen neuen Wert („production“) hinzu.
Klicken Sie auf Save.
Vorhandenem IAM-Benutzer eine leistungsstarke Richtlinie zuordnen
Klicken Sie auf der Seite „IAM-Benutzer“ auf „user1“.
Klicken Sie auf den Tab Permissions.
Klicken Sie auf die Schaltfläche Add permissions.
Klicken Sie auf Attach existing policies directly.
Wählen Sie Administrator Access aus.
Klicken Sie auf Next: Review.
Bestätigen Sie mit einem Klick auf Add permissions.
Manuell einen weiteren IAM-Benutzer erstellen
Klicken Sie auf der Seite „IAM-Benutzer“ auf die Schaltfläche Add Users.
Geben Sie im Feld User name: „user2“ ein.
Wählen Sie Access key aus.
Klicken Sie auf die Schaltfläche Next: Permissions.
Legen Sie keine Berechtigungen oder Tags fest.
Klicken Sie auf Create user (die angezeigten Anmeldedaten sind nicht relevant und können verworfen werden).
Jetzt können wir diese manuellen Änderungen mit der Erkennung von Abweichungen in Snyk IaC angehen.
Abweichungen bei verwalteter und nicht verwalteter Infrastruktur
Sehen wir uns nun an, wie Snyk IaC diese Änderungen erkennt. Beginnen wir mit Ressourcen, die überhaupt nicht von Terraform verwaltet werden.
Dieser Scan meldet die folgenden Ressourcen nach Terraform-Begriffen:
Den manuell erstellten IAM-Benutzer „user2“ mit seinem IAM-Zugriffsschlüssel
Die manuell an den von Terraform verwalteten IAM-Benutzer „user1“ angehängte IAM-Richtlinie.
Prüfen wir nun ausschließlich Änderungen an Ressourcen, die von Terraform verwaltet und in den verschiedenen Terraform-Statusdateien gefunden werden:
Dieser Scan lieferte eine ganz andere Ausgabe und dauerte deutlich länger (36 s gegenüber 9 s im Scan-Modus für „nicht verwaltete“ Ressourcen).
Anhand dieser Ausgabe erfahren wir, dass der IAM-Benutzer „user1-84i30k“, den wir in HCL als Ressource unter dem Namen „user1“ finden, ein Tag namens „environment“ mit dem Wert „production“ hat.
Aktionsplan
Mit dem Snyk-Tool zur Erkennung von Abweichungen haben wir vier unerwartete Unterschiede zwischen unseren Erwartungen und der Realität entdeckt. Für diesen Artikel nehmen wir an, dass das Team Folgendes beschließt:
Der IAM-Benutzer „user2“ wird in der Produktion verwendet und sollte in Terraform importiert werden.
Der IAM-Zugriffsschlüssel von „user2“ sollte aus Sicherheitsgründen rotiert werden.
„user1“ darf unter keinen Umständen Administrator sein.
Das neue Tag für „user1“ wird aufgrund einer Anforderung benötigt und sollte in Terraform importiert werden.
Was | Ressourcentyp | Name | Abweichungstyp | Aktion |
|---|---|---|---|---|
Ein IAM-Benutzer |
|
| Nicht verwaltet | IMPORT |
Ein IAM-Zugriffsschlüssel |
|
| Nicht verwaltet | ROTIEREN |
Eine angehängte IAM-Richtlinie |
|
| Nicht verwaltet | LÖSCHEN |
Ein Tag für einen IAM-Benutzer |
|
| Verwaltet | IMPORT |
Deployment-Pipelines sind keine Abhilfe
Wir haben eine gute Terraform-Deployment-Pipeline eingerichtet. Wenn das nächste Mal terraform apply ausgeführt wird, erwarten wir vielleicht, dass alles wieder normal ist.
Was wird Terraform in diesem Fall tun? Ein Deployment-Job:
Terraform war nie dafür vorgesehen, manuell erstellte oder zugeordnete Ressourcen zu erkennen. Es setzt geänderte Ressourcen einfach auf den ursprünglichen Zustand zurück – was wir in diesem Fall nicht möchten.
Was | Ressourcentyp | Name | Abweichungstyp | Aktion |
|---|---|---|---|---|
Ein IAM-Benutzer |
|
| Nicht verwaltet | KEINE |
Ein IAM-Zugriffsschlüssel |
|
| Nicht verwaltet | KEINE |
Eine angehängte IAM-Richtlinie |
|
| Nicht verwaltet | KEINE |
Ein Tag für einen IAM-Benutzer |
|
| Verwaltet | ZURÜCKSETZEN |
In keinem der Fälle erhalten wir die erwartete Unterstützung:
Der manuell erstellte IAM-Benutzer und sein Zugriffsschlüssel werden nicht gemeldet (nicht hilfreich).
Die manuell angehängte Administrator-Richtlinie eines verwalteten Benutzers wird nicht gemeldet (nicht hilfreich).
Das wichtige Tag, das manuell für einen verwalteten Benutzer hinzugefügt wurde, wird zurückgesetzt (schädlich).
Für diese Art der Erkennung und Bearbeitung wird ein anderes Tool benötigt.
Unsere Abdeckung verbessern
Bei nicht verwalteten Ressourcen starten wir mit einer Abdeckung von 50 %:
Verbessern wir sie anhand des Teamplans.
IAM-Richtlinie für „user1“ löschen
Beginnen wir mit der dringendsten und einfachsten Maßnahme: Entfernen der Richtlinie „Administrator“ für den verwalteten IAM-Benutzer „user1“:
Navigieren Sie zu IAM > Users > „user1“.
Klicken Sie auf Permissions > löschen Sie „AdministratorAccess“.
Jetzt erfassen wir 60 % unserer AWS-Ressourcen statt 50 %.
Was | Ressourcentyp | Name | Abweichungstyp | Aktion | Status |
|---|---|---|---|---|---|
Ein IAM-Benutzer |
|
| Nicht verwaltet | IMPORT | |
Ein IAM-Zugriffsschlüssel |
|
| Nicht verwaltet | ROTIEREN | |
Eine angehängte IAM-Richtlinie |
|
| Nicht verwaltet | LÖSCHEN | * |
Ein Tag für einen IAM-Benutzer |
|
| Verwaltet | HINZUFÜGEN |
Weiter geht’s.
Terraform-Deployment-Pipeline entsperren
Die Pipeline wird derzeit durch diese manuelle Änderung der Tags für aws_iam_user.user1 blockiert. Bei einem Deployment würden die Tags auf die Werte in HCL zurückgesetzt. Was ist also die Lösung? Verwenden Sie die Ausgabe der Snyk-IaC-Abweichungserkennung, um Ihre Terraform-Konfiguration anzupassen.
Uns liegen folgende Informationen vor:
Aus dieser Ausgabe wissen wir:
Wir suchen nach einer Ressource vom Typ
aws_iam_usermit dem Namen „user1“.Diese Ressource ist in terraform.tfstate zu finden (sehr praktisch, wenn Sie Dutzende oder Hunderte von Statusdateien haben).
Es gibt einen neuen Tag-Schlüssel namens
environmentmit dem Wert „production“.
Aktualisieren wir einfach unsere IAM-Benutzerressource, indem wir environment = "production" hinzufügen. Dann sieht unsere Ressource so aus:
Jetzt können wir unsere Terraform-Deployment-Pipeline bedenkenlos entsperren:
Damit haben wir unsere „verwalteten“ Abweichungen vorerst behoben:
Was | Ressourcentyp | Name | Abweichungstyp | Aktion | Status |
|---|---|---|---|---|---|
Ein IAM-Benutzer |
|
| Nicht verwaltet | IMPORT | |
Ein IAM-Zugriffsschlüssel |
|
| Nicht verwaltet | ROTIEREN | |
Eine angehängte IAM-Richtlinie |
|
| Nicht verwaltet | LÖSCHEN | * |
Ein Tag für einen IAM-Benutzer |
|
| Verwaltet | HINZUFÜGEN | * |
IAM-Benutzer user2 importieren und Schlüssel rotieren
Kümmern wir uns nun um „user2“. Wir möchten:
den Benutzer in Terraform importieren
den Schlüssel rotieren
Importieren wir zunächst den IAM-Benutzer in Terraform. Hier ist eine einfache Möglichkeit dazu.
Erfassen Sie zunächst die Informationen aus Snyk IaC:
Ressourcentyp | Name |
|---|---|
|
|
Wie importieren wir eine aws_iam_user resource? Laut der offiziellen Terraform-Dokumentation: IAM-Benutzer können mit ihremNamenimportiert werden, z. B. mit $ terraform import aws_iam_user.lb loadbalancer.
Außerdem erfahren wir, dass nur das Argument name erforderlich ist. Fügen wir also diese einfache Struktur zu unserer HCL-Datei hinzu:
Importieren wir diesen Benutzer nun in Terraform:
Wie hat sich unsere Abdeckung entwickelt? Sehen wir nach:
Jetzt erreichen wir eine Abdeckung von 80 % (zuvor 60 %), und nur eine Ressource bleibt übrig.
Was | Ressourcentyp | Name | Abweichungstyp | Aktion | Status |
|---|---|---|---|---|---|
Ein IAM-Benutzer |
|
| Nicht verwaltet | IMPORT | * |
Ein IAM-Zugriffsschlüssel |
|
| Nicht verwaltet | ROTIEREN | |
Eine angehängte IAM-Richtlinie |
|
| Nicht verwaltet | LÖSCHEN | * |
Ein Tag für einen IAM-Benutzer |
|
| Verwaltet | HINZUFÜGEN | * |
Schlüssel rotieren
Kümmern wir uns jetzt darum. Wir möchten den Schlüssel rotieren und ihn gleichzeitig in Terraform aufnehmen. Fügen wir zunächst den neuen Schlüssel zu HCL hinzu, um einen neuen Schlüssel zu erstellen (den wir zum Beispiel dem zuständigen Team geben können). Anschließend löschen wir einfach den alten Schlüssel aus AWS.
Die Terraform-Dokumentation zu aws_iam_access_key ist sehr verständlich. Daher können wir einfach eine Ressource erstellen, für die der Name von user2 als Argument dient:
Da die Deployment-Pipeline zuvor entsperrt wurde, können wir dies sicher mit Terraform anwenden und einen neuen Schlüssel erstellen:
Der alte Schlüssel muss noch entfernt werden. Anhand der Ausgabe von Snyk IaC wissen wir, dass der Schlüsselname AKIASBXWQ3AYQETE6OFR lautet.
Am einfachsten entfernen Sie diesen Schlüssel wie folgt:
Navigieren Sie zu IAM > Users > user2 > Security Credentials.
Entfernen Sie den von Snyk IaC gemeldeten Schlüssel
AKIASBXWQ3AYQETE6OFR, indem Sie ihn zunächst deaktivieren und anschließend löschen.
Wie sieht unsere Abdeckung jetzt aus?
Herzlichen Glückwunsch! Dank der Erkennung von Abweichungen in Snyk IaC ist wieder alles unter Kontrolle.
Was | Ressourcentyp | Name | Abweichungstyp | Aktion | Status |
|---|---|---|---|---|---|
Ein IAM-Benutzer |
|
| Nicht verwaltet | IMPORT | * |
Ein IAM-Zugriffsschlüssel |
|
| Nicht verwaltet | ROTIEREN | * |
Eine angehängte IAM-Richtlinie |
|
| Nicht verwaltet | LÖSCHEN | * |
Ein Tag für einen IAM-Benutzer |
|
| Verwaltet | HINZUFÜGEN | * |
Fazit
In diesem Artikel haben wir gezeigt, wie die Erkennung von Abweichungen in Snyk IaC dabei helfen kann, manuell erstellte AWS-Ressourcen zu finden. Außerdem haben wir gesehen, wie die Ergebnisse in Terraform-Begriffen und mit den erforderlichen Informationen aufbereitet werden, damit Entwickler diese Ressourcen in ihren Terraform-HCL-Code importieren können. Wir haben auch kurz festgestellt, dass Änderungen nicht immer automatisch zurückgesetzt werden sollten und dass zusätzlich zur Deployment-Pipeline ein schlankes Warnsystem zur Erkennung von Abweichungen erforderlich ist.
Wir sind überzeugt, dass die gesamte Infrastruktur als Code vorliegen sollte, damit Entwickler so früh wie möglich Sicherheitsfeedback erhalten und Probleme erkennen können.
Deshalb unterstützt Snyk IaC Teams dabei, alle Ressourcen, die tatsächlich in ihrem AWS-Konto ausgeführt werden, schnell wieder in Terraform-Code zu integrieren, um die IaC-Abdeckung insgesamt zu erhöhen und Sicherheitsprobleme zu reduzieren. Snyk IaC ermöglicht schnellere Fehlerbehebungen, indem es die Feedbackschleife zwischen Cloud-Security- und Engineering-Teams schließt und umsetzbare Lösungen direkt an die zuständigen Engineers meldet – in einer für Engineers verständlichen Sprache.
Sichern Sie Ihre Infrastruktur an der Quelle
Snyk automatisiert die IaC-Sicherheit und Compliance in Workflows und erkennt abweichende sowie fehlende Ressourcen.
