Skip to main content

Sichern Sie Ihre Anwendung von Argo CD bis Kubernetes

Artikel von

JJ Ng

Pas Apicella

Kubernetes Blog

12. Oktober 2022

0 Min. Lesezeit

GitOps ist ein beliebtes Framework zur Verwaltung und Absicherung der Anwendungspipeline. Wer sich auf den Weg zu GitOps gemacht hat, stellt sich häufig die Frage: „Wie kann ich meine Pipeline absichern, wenn alles automatisiert ist?“

Das GitOps-Framework basiert auf dem Konzept, dass alle Code-Commits und Änderungen über Git erfolgen. Dadurch wird eine automatisierte Pipeline ausgelöst, die Anwendungen erstellt und auf Kubernetes bereitstellt. Da Entwicklungs- und Sicherheitsteams nur wenige Berührungspunkte innerhalb der Pipeline haben, muss die Sicherheit verbindlich vorgeschrieben werden. So wird sichergestellt, dass die bereitgestellten Anwendungen möglichst wenige Schwachstellen aufweisen.

In diesem Blog erfahren Sie, wie Snyk Anwendungssicherheit in GitOps ermöglicht – mit Fokus auf das beliebte Tool Argo CD. In diesem Szenario führt Snyk einen IaC-Scan durch, um sicherzustellen, dass die bereitzustellende Anwendung sicher ist, bevor sie bereitgestellt wird, und stoppt den Build, falls dies nicht der Fall ist. Außerdem kann Snyk bereitgestellte Anwendungen automatisiert in verschiedenen Namespaces auf Kubernetes überwachen.

Was ist Argo CD?

Argo CD ist ein deklaratives, Kubernetes-natives Continuous-Delivery-Tool (CD), das ein Repository verfolgt und Änderungen oder „Drift“ erkennt. Anschließend nimmt es die erforderlichen Änderungen an der Kubernetes-Clusterkonfiguration vor.

Argo CD für die Zusammenarbeit mit Snyk einrichten

Diese Demo zeigt, wie Sie Ihren GitOps-Prozess mit Argo CD starten und Snyk einsetzen, um Anwendungen abzusichern und Kubernetes-Workloads zu überwachen. Führen Sie dazu die folgenden Schritte aus:

  1. Git-Repository klonen

  2. Argo CD konfigurieren

  3. Anwendung mit Argo CD bereitstellen

  4. Kubernetes-Secret-Objekt für Ihr Snyk-Token erstellen

  5. Argo-CD-PreSync-Ressourcen-Hook erstellen

  6. Warten, bis Argo CD die Konfigurationsdrift erkennt

  7. Mit Kubernetes integrieren

Voraussetzungen

  1. Für Snyk-Tests in Argo CD und den automatischen Import von Kubernetes-Workloads in Snyk benötigen Sie ein Snyk-Konto mit einem Business- oder Enterprise-Plan. Falls Sie noch kein Snyk-Konto haben, können Sie eine kostenlose Testversion unseres Business-Plans starten.

  2. Eine laufende Argo-CD-Instanz in Ihrem Kubernetes-Cluster. Einzelheiten zur Einrichtung finden Sie in der Argo-CD-Dokumentation.

  3. Ein laufender Kubernetes-Cluster (z. B. EKS, AKS, GKE, Red Hat OpenShift oder eine beliebige unterstützte Variante).

Schritt 1: Git-Repository klonen

In dieser Demo kommt eine Flask-Polling-Anwendung zum Einsatz, deren Quellcode unter https://github.com/jiajunngjj/flask-polling-app gehostet wird. Klonen Sie das Repository in Ihre eigene Umgebung.

žœ  git clone https://github.com/jiajunngjj/flask-polling-app.git

Schritt 2: Argo CD konfigurieren

Fügen Sie Ihren Kubernetes-Cluster zu Argo CD hinzu:

žœ argocd cluster add CONTEXTNAME

In dieser Demo läuft Argo CD innerhalb dieses Kubernetes-Clusters und ist daher automatisch über den internen K8s-Hostnamen (kubernetes.default.svc) verbunden:

Einstellungsseite für Argo CD-Cluster mit einem Kubernetes-Cluster im Cluster unter https://kubernetes.default.svc, Version 1.21 und erfolgreichem Verbindungsstatus

Fügen Sie anschließend auch das zuvor erwähnte Repository zu Argo CD hinzu:

Argo-CD-Formular „Repository über SSH verbinden“ mit Projektstandard und einer GitHub-Repository-URL.

Nach dem erfolgreichen Hinzufügen des Repositorys sollte etwa Folgendes angezeigt werden:

Einstellungsseite für Argo-CD-Repositories mit zwei GitHub-Repositories, die erfolgreich verbunden sind, und Optionen zum Verbinden weiterer Repositories.

Schritt 3: Anwendung mit Argo CD bereitstellen

Erstellen Sie einen Kubernetes-Namespace, in dem die Anwendung bereitgestellt wird. In diesem Beispiel erstellen wir den Namespace argocd-demo, um die Anwendung flask-polling-app auszuführen:

žœ kubectl create ns argocd-demo

Erstellen Sie die Anwendung über die Argo-CD-Befehlszeile (oder über die Argo-CD-Benutzeroberfläche, nachdem Sie das Repository hinzugefügt haben):

žœ argocd app create snyk-demo  \  --repo https://github.com/jiajunngjj/flask-polling-app.git \  --path argocd \  --dest-server https://kubernetes.default.svc \  --dest-namespace argocd-demo

Eine Erläuterung der Befehlsparameter:

  • repo — Repository für die Quellcodeverwaltung (SCM)

  • path — Verzeichnis mit dem Kubernetes-Manifest

  • dest-server — Kubernetes-Cluster

  • dest-namespace — Kubernetes-Namespace, in dem die Anwendung bereitgestellt wird

Nach dem Erstellen der Anwendung in Argo CD wird in der Benutzeroberfläche der Status OutOfSync angezeigt:

Argo-CD-Anwendungsdashboard mit der als „Missing“ und „OutOfSync“ markierten Anwendung snyk-demo
Bildschirm mit Argo-CD-Anwendungsdetails: Die Anwendung snyk-demo wird als OutOfSync angezeigt. Im Anwendungsbaum sind der polling-app-Service und die Deployment-Ressourcen zu sehen.

Führen Sie als Nächstes den Argo-CD-Befehl sync aus, um die Anwendung bereitzustellen:

žœ argocd app sync snyk-demo

Anschließend sollte die Anwendung in der Argo-CD-Benutzeroberfläche zu sehen sein:

Baumansicht der Argo-CD-Anwendungsdetails mit der fehlerfreien, synchronisierten Anwendung snyk-demo und den Kubernetes-Ressourcen von polling-app

Sie sollten außerdem sehen, dass die Anwendung im Kubernetes-Namespace argocd-demo bereitgestellt wird:

➜ kubectl get pods -n argocd-demoNAME READY STATUS RESTARTS AGEpolling-app-6f5978849c-pp8f4 1/1 Running 0 33spolling-app-6f5978849c-tqpd2 1/1 Running 0 33s

Schritt 4: Kubernetes-Secret-Objekt für Ihr Snyk-Token erstellen

Nachdem die Anwendung erfolgreich zu Argo CD hinzugefügt wurde, können Sie den Snyk-IaC-Test in die Argo-CD-Pipeline integrieren. Rufen Sie Ihr Snyk-Token in der Snyk-App ab und erstellen Sie ein Secret-Objekt im Namespace argocd-demo:

➜ kubectl create secret generic snyk-token \ --from-literal=token=<XXXX-XXXXXX-XXXXXXXX> \ -n argocd-demo

Schritt 5: Argo-CD-PreSync-Ressourcen-Hook erstellen

Erstellen Sie im selben Verzeichnis wie die Deployment-YAML-Dateien (argocd) eine Datei mit dem Namen snyk-scan.yaml, die folgenden Inhalt enthält:

apiVersion: batch/v1
kind: Job
metadata:
  name: snyk-iac-scan
  annotations:
    argocd.argoproj.io/hook: PreSync
spec:
  ttlSecondsAfterFinished: 600
  template:
    spec:
      containers:
      - name: snyk-cli
        image: snyk/snyk-cli:npm
        command: ["/bin/sh","-c"]
        args:
          - git clone https://github.com/jiajunngjj/flask-polling-app.git;
            snyk auth $SNYK_TOKEN;
            snyk iac test flask-polling-app/argocd/polling-app.yaml || true;
        env:
          - name: SNYK_TOKEN
            valueFrom:
              secretKeyRef:
                name: snyk-token
                key: token
      restartPolicy: Never
  backoffLimit: 0

Bearbeiten Sie die Datei polling-app.yaml, um die Erkennung von Konfigurationsdrift auszulösen (in diesem Beispiel wird die Anzahl der Replikate auf „1“ geändert):

---
apiVersion: v1
kind: Service
metadata:
  name: polling-app
spec:
  ports:
  - name: 8080-tcp
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: polling-app
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: polling-app
spec:
  replicas: 1
  selector:
  matchLabels:
    app: polling-app
  template:
    metadata:
      labels:
        app: polling-app
    spec:
      containers:
      - image: jiajunngjj/polling-app
        name: polling-app
        ports:
        - containerPort: 8080
      restartPolicy: "Always"

Führen Sie Git-Befehle aus, um die Datei an das Repository zu übertragen:

➜ git add argocd/snyk-scan.yaml argocd/polling-app.yaml➜ git commit -m "added snyk-scan.yaml and edited polling-app.yaml"➜ git push

Schritt 6: Warten, bis Argo CD die Konfigurationsdrift erkennt

Wenn Argo CD die Konfigurationsdrift erkennt, beginnt die Synchronisierung, um den gewünschten neuen Zustand herzustellen. Sie sehen, dass der Snyk-IaC-Scan vor der Bereitstellung der Anwendung gestartet wird:

Baumansicht der Argo-CD-Anwendungsdetails: Die Anwendung snyk-demo ist intakt und synchronisiert; der Job snyk-iac-scan ist rot hervorgehoben.

Sie sehen auch, dass snyk-iac-scan als Pod ausgeführt wird:

➜ kubectl get pods -n argocd-demoNAME READY STATUS RESTARTS AGEpolling-app-6f5978849c-pp8f4 1/1 Running 0 16msnyk-iac-scan-9x8gz 0/1 Completed 0 2m32s

Schließlich sehen Sie in der Argo-CD-Benutzeroberfläche den Job snyk-iac-scan:

Argo-CD-Protokolle für den Job snyk-iac-scan zeigen, dass der Test mit Snyk Infrastructure as Code abgeschlossen wurde und fünf Probleme mit niedrigem Schweregrad aufgedeckt hat.

Schritt 7: Mit Kubernetes integrieren

Snyk lässt sich in Kubernetes integrieren. So können Sie laufende Workloads importieren und testen, um Schwachstellen in den zugehörigen Images sowie Konfigurationen zu erkennen, die die Sicherheit dieser Workloads beeinträchtigen könnten. Nach dem Import überwacht Snyk die Workloads kontinuierlich und erkennt und priorisiert Sicherheitsprobleme, wenn neue Images bereitgestellt und Workload-Konfigurationen geändert werden.

Ein Vorteil: Sie müssen Ihre Deployment-YAML-Dateien nicht aktualisieren, da dies automatisch über den Snyk Controller erfolgt, wenn Sie den automatischen Import aktivieren (wie in der Snyk-Dokumentation erläutert). Snyk unterstützt die folgenden Workloads:

  • Deployments

  • ReplicaSets

  • DaemonSets

  • StatefulSets

  • Jobs

  • CronJobs

  • ReplicationControllers

  • Pods

Weitere Snyk-Blogbeiträge zeigen, wie Sie mehrere Snyk-Kubernetes-Cluster in einem einzelnen Cluster installieren und Pulumi zur Automatisierung der Snyk-Kubernetes-Integration einsetzen können.

Sobald Argo CD Ihre Anwendung bereitgestellt hat, importiert die Kubernetes-Integration von Snyk den Scan dieses Workloads ohne manuelles Eingreifen in die Plattform:

Snyk Projects-Dashboard mit Kubernetes-Workloads und der Anzahl von Sicherheitsproblemen; das Projekt „polling-app“ ist rot eingekreist.
Snyk-Projekt-Dashboard für eine Kubernetes-Polling-App mit Bilddetails und Empfehlungen zum Upgrade des Python-Basisimages.

Zusammenfassung

In dieser Demo wird über den Ressourcen-Hook von Argo CD bei jeder erkannten Konfigurationsänderung ein Snyk-IaC-Scan gestartet. So lässt sich ein GitOps-Workflow verbindlich mit Sicherheitsprüfungen versehen: Snyk erkennt Schwachstellen und hält den Workflow an, wenn eine erkannte Schwachstelle den festgelegten Schweregrad erreicht. Dadurch gelangt niemals anfälliger Code in die Produktionsumgebung.

Weitere Informationen

Nachdem Sie nun wissen, wie Sie einen Snyk-IaC-Test mit Argo CD einrichten und Workloads auf Kubernetes überwachen, finden Sie in diesen Ressourcen weitere Informationen dazu, wie Sie Ihren Softwareentwicklungslebenszyklus zusätzlich absichern:

Sichern Sie Ihre Infrastruktur an der Quelle

Snyk automatisiert die IaC-Sicherheit und Compliance in Workflows und erkennt abweichende sowie fehlende Ressourcen.