Benutzerdefinierte IaC-Regeln mit Snyk entwickeln
Teodora Sandu
18. November 2021
0 Min. LesezeitIn einer zunehmend cloudnativen Welt ist Infrastructure as Code (IaC) oft der erste Berührungspunkt mit einer Anwendung. Und da Technologien wie Kubernetes und Terraform immer beliebter werden, aktualisieren die meisten App-Entwickler im Laufe ihrer Karriere mindestens einmal eine Kubernetes- oder Terraform-Ressource.
Die Aktualisierung und Wartung der Infrastruktur kann so einfach sein wie die Verwaltung einiger Konfigurationsdateien oder so komplex wie die Orchestrierung einer komplexen Architektur mit mehreren cloudnativen Stacks. Eines gilt jedoch immer: Infrastruktursicherheit ist entscheidend für die Anwendungssicherheit. Obwohl viele Cloud-Anbieter und IaC-Scan-Tools integrierte oder von der Community beigesteuerte Konfigurations- und Sicherheitsregelsätze bieten, ist die Infrastruktur oft zu vielfältig und zu komplex für einen Ansatz nach dem Motto „eine Lösung für alles“.
In diesem Artikel zeige ich Ihnen, wie Sie Ihre Infrastrukturumgebung mit benutzerdefinierten Regeln für Snyk IaC absichern. Mit dem SDK für Snyk-IaC-Regeln (snyk-iac-rules) können Sie jetzt benutzerdefinierte Infrastrukturregeln für die Snyk CLI schreiben, testen und bündeln.
Mehr Flexibilität mit Open Policy Agent (OPA)
Im Hintergrund nutzt Snyk IaC Open Policy Agent (OPA), einen universellen Open-Source-Richtlinienagenten, und dessen Sprache Rego, um benutzerdefinierte Regeln zu definieren. Als frameworkunabhängiger Agent erleichtert OPA Teams die Anpassung und Durchsetzung von Richtlinien für ihren gesamten cloudnativen Stack – ob für Infrastruktur, Anwendungsautorisierung oder die Zulassungssteuerung in Kubernetes.
Da die Regeln in der nativen Abfragesprache von OPA geschrieben werden, lassen sie sich auch exportieren und außerhalb von Snyk wiederverwenden. So können Sie Ihre Investitionen hier im gesamten Integrationsökosystem von OPA nutzen.
Für die Anleitung benötigen Sie Grundkenntnisse in OPA sowie in WebAssembly (Wasm) und OCI-Artefakten, mit denen wir die Regeln bündeln und verteilen.
Besser absichern mit benutzerdefinierten Regeln
Mit benutzerdefinierten Regeln können Sie jeden konkreten Anwendungsfall berücksichtigen. In Kombination mit vorgefertigten, von Sicherheitsexperten modellierten Bedrohungsregelsätzen sind sie ein leistungsstarkes Werkzeug.
Nehmen wir als Beispiel für eine benutzerdefinierte Regel an, ich sei Security Architect und hätte eine bestimmte interne Anforderung: Alle Terraform-Ressourcen vom Typ aws_iam_role in unserer Anwendung müssen mit den Tags owner, description und type versehen sein.
Dazu möchte ich eine Regel ausführen, die:
sicherstellt, dass alle vorhandenen und zukünftigen IAM-Rollenressourcen die Tags owner, description und type enthalten
App-Entwickler benachrichtigt, wenn sie vergessen, Tags hinzuzufügen.
Außerdem möchte ich unsere CI/CD so konfigurieren, dass sie bei einer Codeänderung fehlschlägt, wenn diese den Standard nicht erfüllt, damit sie nicht in unseren Produktionsumgebungen landet.
Wie würde ich das umsetzen? Indem ich die Snyk CLI so konfiguriere, dass sie in meiner CI/CD mit einem benutzerdefinierten Regelsatz ausgeführt wird, den ich schreibe, bündele und an einem sicheren Ort meiner Wahl veröffentliche.
Eine benutzerdefinierte IaC-Regel mit Snyk entwickeln
Mit dem neuen SDK für Snyk-IaC-Regeln kann ich genau das tun. Ich installiere es auf meinem Rechner und kann mithilfe der Dokumentation zu benutzerdefinierten Regeln meinen neuen Tagging-Standard schnell in der Snyk CLI durchsetzen.
Nehmen Sie die folgende Terraform-Ressource als Beispiel. Sie soll unsere Tags owner, description und type enthalten:
Gemäß der Anleitung in der Dokumentation zu benutzerdefinierten Regeln führe ich den Befehl template aus, um das Grundgerüst einer Regel zu erstellen:
Der Tagging-Standard soll als Regel mit mittlerem Schweregrad eingestuft werden. Deshalb passe ich die Vorlage entsprechend an und ändere Titel und Meldung:
Bevor ich die Regel bündele und veröffentliche, schreibe ich Unit-Tests, um ihr Verhalten zu überprüfen, und lege meine beispielhafte Terraform-Fixture-Datei in der generierten Datei ./rules/CUSTOM-RULE-8/fixtures/denied2.tf ab:
Diese und weitere Regeln finden Sie in unserem öffentlichen GitHub-Repository.
Sobald ich die Tests ausgeführt habe und mit dem Ergebnis zufrieden bin, bündele ich die Regel mithilfe des SDK. Mit dem Flag --rules kann ich sie sogar lokal mit der Snyk CLI testen. Zunächst stelle ich sicher, dass ich bei einer Organisation namens test-org angemeldet bin. Von nun an führe ich alle Experimente mit meinen benutzerdefinierten Regeln dort aus:
Anschließend erstelle ich ein Bundle meiner benutzerdefinierten Regeln und übergebe es an das Flag --rules, um sicherzustellen, dass meine IaC-Probleme erkannt werden:
Da ich nun sicher bin, dass die Snyk CLI meine Regel interpretieren kann, übertrage ich sie in eine OCI-Registry – in diesem Fall DockerHub – und kennzeichne sie als erste Version meiner benutzerdefinierten Regeln. So kann ich bei späteren Änderungen mit möglichen inkompatiblen Anpassungen die Regeln schrittweise ausrollen, indem ich ein neues Tag verwende:
Zu guter Letzt setze ich die Verwendung meiner neuen benutzerdefinierten Regel in allen Teams meiner Abteilung durch. Dazu konfiguriere ich die IaC-Einstellungen meiner Snyk-Gruppe über die öffentliche Group IaC Settings API.
Ich habe all diese Schritte mithilfe eines GitHub-Aktionsworkflows automatisiert, wie Sie in unserem öffentlichen GitHub-Repository sehen können. Ab sofort verwenden alle App-Entwickler und CI/CD-Pipelines, die bei einer Organisation innerhalb meiner Gruppe authentifiziert sind, meine benutzerdefinierte Regel. Wie Sie die Snyk CLI und das SDK für Snyk-IaC-Regeln in GitHub integrieren, erfahren Sie in unserer Dokumentation.
Wenn wir für verschiedene Unternehmensbereiche unterschiedliche benutzerdefinierte Regeln anwenden möchten, können wir die Einstellungen für benutzerdefinierte Regeln auch auf Organisationsebene überschreiben. So wird für die jeweilige Organisation ein eigener Regelsatz ausgeführt. Damit ich beispielsweise weiterhin das Flag --rules verwenden kann, um meine benutzerdefinierten Regeln mit der Snyk CLI zu testen, habe ich die Einstellungen für benutzerdefinierte Regeln in meiner Organisation test-org deaktiviert. So kann ich meine eigenen benutzerdefinierten Regeln lokal bereitstellen:

Vielleicht benötigt das Platform-Team künftig einen restriktiveren Satz benutzerdefinierter Regeln. In diesem Fall konfiguriere ich für dessen Organisation ein anderes Bundle mit benutzerdefinierten Regeln, das unter einem anderen OCI-Artefakt gespeichert ist.
Die Vorteile benutzerdefinierter Regeln für Snyk IaC nutzen
Wir haben gesehen, wie ich als Security Architect mithilfe des SDK für Snyk-IaC-Regeln neue Sicherheitsstandards für meine Abteilung konfiguriert habe. Sehen wir uns nun an, wie mir diese Funktion als App-Entwickler während der Entwicklung hilft.
Nehmen wir an, ich füge der Terraform-Infrastruktur unserer Anwendung eine neue Ressource vom Typ aws_iam_role hinzu, um eine neue IAM-Rolle zu konfigurieren:
Ich habe die Ressource lokal getestet und überprüft, dass meine IAM-Rolle korrekt konfiguriert ist. Allerdings habe ich vergessen, dass meine Abteilung für alle Ressourcen sehr strenge Tagging-Vorgaben hat. Als ich einen PR erstellen möchte, sehe ich, dass das Repository, in das ich meine Änderungen übertrage, für die Ausführung der Snyk IaC GitHub Action konfiguriert ist – und diese schlägt fehl.

Ich sehe mir die Ergebnisse an und stelle fest, dass meine neue Datei die PR-Prüfung fehlschlagen lässt. Genauer gesagt fehlen meiner Ressource die Tags owner, description und type.

Ich gehe zurück zu meinem Code und füge die fehlenden Tags hinzu. Sobald ich meine Änderung übertrage und die PR-Prüfung erneut ausgeführt wurde, kann ich die neue Ressource sicher und mit gutem Gewissen in unsere Produktionsumgebung übernehmen!
Ihre Anwendungen mit Snyk IaC absichern
Snyk Infrastructure as Code (Snyk IaC) hilft Ihnen, schnell und sicher zu entwickeln. Dafür stellt es Entwicklern Sicherheitsinformationen und Inline-Korrekturen für Terraform-, CloudFormation- und Kubernetes-Konfigurationen sowie ARM-Vorlagen bereit, die sich direkt in den Code übernehmen lassen.
Snyk IaC fügt sich in die Arbeitsumgebung von Entwicklern ein und lässt sich in Systeme wie Terraform Cloud und CI/CD-Tools sowie in Entwicklerwerkzeuge wie Quellcodeverwaltungssysteme (GitHub, GitLab, Bitbucket) und IDEs integrieren.
Sie können jetzt kostenlos loslegen – mit Snyk IaC auf unserer Plattform oder durch Herunterladen der neuesten Snyk CLI.
Sichern Sie Ihre Infrastruktur an der Quelle
Snyk automatisiert die IaC-Sicherheit und Compliance in Workflows und erkennt abweichende sowie fehlende Ressourcen.
