Skip to main content

Mehrere Snyk-Kubernetes-Controller in einem einzelnen Kubernetes-Cluster installieren

Artikel von

Pas Apicella

feature multispace k8s

15. August 2022

0 Min. Lesezeit

Kubernetes bietet eine Schnittstelle, über die verteilte Systeme reibungslos ausgeführt werden können. Die Plattform kümmert sich um Skalierung und Failover Ihrer Anwendungen, stellt Deployment-Muster bereit und vieles mehr. Bei der Sicherheit müssen die Teams, die Workloads im Kubernetes-Cluster bereitstellen, entscheiden, welche Workloads sie gemäß ihren Anforderungen an die Anwendungssicherheit überwachen möchten.

Was aber, wenn jedes Team selbst festlegen könnte, welche Container-Images und welche konkreten Workloads gescannt werden? Möglicherweise stellen mehrere Teams Workloads in Kubernetes bereit, und jedes hat eigene Anforderungen an die Überwachung. Dieser Anwendungsfall lässt sich am besten lösen, indem jedes Team eine eigene Snyk-Kubernetes-Integration einrichtet und die benötigten Workloads überwacht. Sehen wir uns an, wie das funktioniert.

Überblick über die Snyk-Kubernetes-Integration

Snyk lässt sich in Kubernetes integrieren. So können Sie Ihre laufenden Workloads importieren und kontinuierlich testen, um Schwachstellen in den zugrunde liegenden Images sowie Konfigurationen zu erkennen, die die Sicherheit der Workloads beeinträchtigen könnten. Auch nach dem Deployment überwacht Snyk die Workloads weiterhin und erkennt, wenn sie durch neu entdeckte Schwachstellen oder weitere Sicherheitsprobleme gefährdet sind, etwa wenn neue Container bereitgestellt werden oder sich die Workload-Konfiguration ändert.

Systemkontextdiagramm, das zeigt, wie ein Kunde mit Kubernetes-Integration Kubernetes, Snyk Controller und die Snyk Platform verbindet.

Architekturdiagramm der Kubernetes-Integration

Mehrere Snyk-Controller in einem einzelnen Kubernetes-Cluster installieren

Jetzt wird es spannend! Wir führen Sie Schritt für Schritt durch die Einrichtung mehrerer Snyk-Controller in einem einzelnen Kubernetes-Cluster. Dabei gehen wir folgendermaßen vor:

  1. Separate Namespaces konfigurieren

  2. Für jeden Namespace eine Snyk-Organisation erstellen

  3. snyk monitor für den ersten Namespace (Äpfel) installieren und konfigurieren

  4. snyk monitor für den zweiten Namespace (Bananen) installieren und konfigurieren

  5. Überprüfen, ob bereitgestellte Workloads automatisch über die Policy importiert werden

  6. Workloads in „Bananen“ bereitstellen, die über eine Rego-Policy-Datei automatisch importiert werden

Voraussetzungen

  1. Für die Kubernetes-Integration benötigen Sie ein Business- oder Enterprise-Konto bei Snyk. Falls Sie noch keines haben, können Sie eine kostenlose Testversion unseres Business-Plans starten. Auch wenn Sie die Schritte nicht selbst ausprobieren möchten, empfehle ich Ihnen, weiterzulesen (und die Codeblöcke zu überspringen), um zu erfahren, wie Sie mehrere Snyk-Controller in einem einzelnen Kubernetes-Cluster installieren und verwalten.

  2. Ein Kubernetes-Cluster, z. B. AKS, EKS, GKE, Red Hat OpenShift oder eine andere unterstützte Variante.

Schritt 1: Separate Namespaces konfigurieren

In dieser Demo verwende ich einen Azure-AKS-Dienst für meinen Kubernetes-Cluster. In diesem Cluster installieren wir zwei Snyk-Controller, jeweils in einem eigenen Namespace: einen im Namespace apples und einen im Namespace bananas, wie im folgenden Diagramm dargestellt.

Diagramm eines Kubernetes-Clusters mit den Namespaces „Apples“ und „Bananas“, die jeweils Node.js-, Python- und Snyk-Controller-Komponenten enthalten.

Erstellen Sie nun wie unten gezeigt die Namespaces:

➜  kubectl create namespace apples
namespace/apples created
➜  kubectl create namespace bananas
namespace/bananas created

Schritt 2: Für jeden Namespace eine Snyk-Organisation erstellen

Mit separaten Snyk-Organisationen können wir das Scannen der Workloads voneinander trennen. So können Feature-Teams eigene Organisationen verwenden und das Scannen ihrer Workloads und Images besser steuern. Sie können für alle Snyk-Controller, die wir bereitstellen, auch dieselbe Organisation verwenden. In diesem Beispiel halten wir sie jedoch getrennt. In beiden Fällen werden die Workloads mit einem Label angezeigt, das wir bei der Installation der Snyk-Controller festlegen.

Organisationsauswahlmenü mit aufgelisteten Organisationen und der eingekreisten Option „Neue Organisation erstellen“

Unsere neuen Organisationen

Eine für den Namespace apples:

Violettes Snyk-Banner mit Vorschaubild eines roten Autos und der Bezeichnung „aks-apples-kubernetes“

Eine für den Namespace bananas:

Violettes Snyk-Banner mit dem Bild eines kleinen roten Autos und dem Text „aks-bananas-kubernetes“ mit einem Dropdown-Pfeil

Nach der Erstellung sollten in der Snyk-App zwei leere Organisationen angezeigt werden. Wir verwenden sie gleich.

Suchoberfläche für Organisationen mit „Apples Inc.“ und den Gruppen „aks-apples-kubernetes“ und „aks-bananas-kubernetes“, hervorgehoben durch ein rotes Oval.
Snyk-Dashboard-Kopfzeile mit der Projektauswahl „aks-bananas-kubernetes“ und hervorgehobenem Einstellungssymbol

Aktivieren Sie für jede Organisation die Kubernetes-Integration: Wählen Sie dazu den Tab Integrations und anschließend Kubernetes aus. Klicken Sie dann auf Connect. Folgen Sie abschließend der Snyk-Dokumentation zu Kubernetes, um die Einrichtung abzuschließen.

Notieren Sie sich die Integrations-IDs für die Kubernetes-Integration jeder Snyk-Organisation – Sie benötigen sie gleich. Die Kubernetes-Integrations-ID finden Sie über das Symbol Organisationseinstellungen in der oberen Navigationsleiste von Snyk. Navigieren Sie anschließend in der Seitenleiste zu Integrations und wählen Sie die Kubernetes-Integration aus, wie unten dargestellt.

Snyk-Kubernetes-Integrationseinstellungen mit einem verbundenen Cluster, einer Integrations-ID, einer Schaltfläche zum Kopieren, Dokumentation und Controllerversion.

Schritt 3: snyk monitor für den Namespace „Äpfel“ installieren und konfigurieren

Nachdem wir unsere Organisationen und Integrationen eingerichtet und mit unserem Cluster verbunden haben, können wir Snyk Monitor konfigurieren. Dazu verwenden wir ein Terminalfenster.

Wir erstellen eine Datei, um Workload-Ereignisse zu abonnieren, legen die Kriterien für unsere Abonnements fest, installieren das Helm-Chart von Snyk für die Kubernetes-Überwachung und richten den Monitor ein und starten ihn.

Die Registry-Datei erstellen

Erstellen Sie im Terminal ein Verzeichnis für die Organisation „Äpfel“ und wechseln Sie in dieses Verzeichnis:

➜  mkdir apples
➜  cd apples

Erstellen Sie eine Datei namens workload-events.rego mit folgendem Inhalt. Ersetzen Sie <APPLES_INTEGRATION_ID> durch die Integrations-ID der Kubernetes-Integration der Organisation „Äpfel“.

Mit der folgenden Rego-Policy weisen wir den Snyk-Controller an, Workloads ausschließlich aus dem Namespace apples zu importieren bzw. zu löschen, sofern der Kubernetes-Workload-Typ weder CronJob noch Service ist. Weitere Informationen zu den verschiedenen Workload-Typen finden Sie in der Snyk-Dokumentation.

workload-events.rego
package snyk
orgs := ["<APPLES_INTEGRATION_ID>"]
default workload_events = false
workload_events {
  input.metadata.namespace == "apples"
  input.kind != "CronJob"
  input.kind != "Service"
}

Die Snyk-Helm-Charts zu Ihrem Repository hinzufügen

Greifen Sie auf Ihre Kubernetes-Umgebung zu und führen Sie den folgenden Befehl aus, um das Snyk-Charts-Repository zu Helm hinzuzufügen. Wir benötigen es gleich, wenn wir dieses Helm-Chart installieren.

➜  helm repo add snyk-charts https://snyk.github.io/kubernetes-monitor --force-update
"snyk-charts" has been added to your repositories

Die Konfiguration für Snyk Monitor erstellen und das Helm-Chart bereitstellen

Mit einem Kubernetes-Secret können wir den Dienst ausführen, ohne Zugangsdaten im Klartext offenzulegen. In diesen Schritten erstellen und verwenden wir das Secret, während wir die Konfiguration für die Organisation „Äpfel“ bereitstellen.

Erstellen Sie das Secret snyk-monitor für den Namespace „Äpfel“ und ersetzen Sie <APPLES_INTEGRATION_ID> durch die Kubernetes-Integrations-ID der Snyk-App für „Äpfel“. In dieser Demo verwenden wir Docker Hub als öffentliche Container-Registry. Für den Zugriff auf öffentliche Images sind keine Zugangsdaten erforderlich. Weitere Informationen zur Verwendung privater Container-Registries finden Sie in der Snyk-Controller-Dokumentation.

➜ kubectl create secret generic snyk-monitor -n apples \
    --from-literal=dockercfg.json={} \
    --from-literal=integrationId=<APPLES_INTEGRATION_ID>
secret/snyk-monitor created

Erstellen Sie nun eine ConfigMap, in der die Rego-Policy-Datei gespeichert wird, anhand derer snyk-monitor bestimmt, was im Namespace apples automatisch importiert oder gelöscht werden soll:

➜ kubectl create configmap snyk-monitor-custom-policies -n apples \       --from-file=./workload-events.rego
configmap/snyk-monitor-custom-policies created

Installieren Sie als Nächstes snyk-monitor im Namespace apples. Ersetzen Sie im Befehl <APPLES_INTEGRATION_ID> durch die Snyk-App-Integrations-ID für „Äpfel“:

➜ helm upgrade --install snyk-monitor-apples snyk-charts/snyk-monitor \
        --namespace apples \
        --set clusterName="AKS K8s - Apples" \
        --set policyOrgs=<APPLES_INTEGRATION_ID> \
        --set workloadPoliciesMap=snyk-monitor-custom-policies

Release "snyk-monitor-apples" does not exist. Installing it now.
LAST DEPLOYED: Thu Jul 14 19:29:28 2022
NAMESPACE: apples
STATUS: deployed
REVISION: 1
TEST SUITE: None

Hinweis: Anhand des Labels „AKS K8s - Apples“ finden Sie die importierten Workloads in der Snyk-Benutzeroberfläche, die Sie gleich sehen werden.

Überprüfen Sie abschließend, ob alles läuft. (Dieser Befehl setzt voraus, dass jq installiert ist. Falls nicht, lassen Sie den Teil | jq des Befehls weg.)

➜ helm ls -A -o json | jq
[
  {
"name": "snyk-monitor-apples",
"namespace": "apples",
"revision": "1",
"updated": "2022-07-14 19:45:56.681028 +1000 AEST",
"status": "deployed",
"chart": "snyk-monitor-1.92.10",
"app_version": ""
  }
]

➜ kubectl get pods -n apples
NAME                             READY   STATUS RESTARTS   AGE
snyk-monitor-apples-797cd64c-sqvj4   1/1 Running   0      16m

Nun ist im Namespace apples ein Snyk-Controller mit einem eigenen eindeutigen Namen installiert. Später zeigen wir, wie dieser Snyk-Controller Workloads automatisch importiert, wenn sie gemäß unserer Konfiguration im Namespace apples des Kubernetes-Clusters bereitgestellt werden. Wenn Sie jetzt die Projektseite der Organisation „Äpfel“ aktualisieren, sehen Sie möglicherweise, dass Snyk Monitor selbst gescannt wurde. Das liegt daran, dass wir den Controller angewiesen haben, Workloads vom Typ Deployment im Namespace apples zu scannen.

Snyk Projects-Dashboard mit zwei Kubernetes-Projekten, der Anzahl der Schwachstellen nach Schweregrad und Optionen zum Hinzufügen eines weiteren Projekts.

Schritt 4: snyk monitor für den Namespace „Bananen“ installieren und konfigurieren

Erstellen Sie ein Verzeichnis namens „bananas“ und wechseln Sie in dieses Verzeichnis:

➜ cd ..
➜ mkdir bananas
➜ cd bananas

Erstellen Sie nun eine Datei namens workload-events.rego mit folgendem Inhalt. Ersetzen Sie <BANANAS_INTEGRATION_ID> durch die Kubernetes-Integrations-ID der Snyk-App für „Bananen“:

package snyk
orgs := ["<BANANAS_INTEGRATION_ID>"]
default workload_events = false
workload_events {
      input.metadata.namespace == "bananas"
      input.kind != "CronJob"
      input.kind != "Service"
}

Erstellen Sie als Nächstes das Secret snyk-monitor für den Namespace „Bananen“ und ersetzen Sie BANANAS_INTEGRATION_ID durch die Kubernetes-Integrations-ID der Snyk-App für „Bananen“:

➜  ~/snyk/SE/blogs/snyk-multi-namespace-controllers/bananas kubectl create secret generic snyk-monitor -n bananas \
  --from-literal=dockercfg.json={} \
  --from-literal=integrationId=BANANAS_INTEGRATION_ID
secret/snyk-monitor created

Erstellen Sie anschließend eine ConfigMap, in der die Rego-Policy-Datei gespeichert wird, anhand derer snyk-monitor bestimmt, was im Namespace „Bananen“ automatisch importiert oder gelöscht werden soll:

➜ kubectl create configmap snyk-monitor-custom-policies -n bananas --from-file=./workload-events.rego
configmap/snyk-monitor-custom-policies created

Installieren Sie snyk-monitor im Namespace „Bananen“ und ersetzen Sie ‰¤BANANAS_INTEGRATION_ID> durch die Kubernetes-Integrations-ID der Snyk-App für „Bananen“:

➜ helm upgrade --install snyk-monitor-bananas snyk-charts/snyk-monitor \
      --namespace bananas \
      --set clusterName="K8s - Bananas" \
      --set policyOrgs=<BANANAS_INTEGRATION_ID> \
      --set workloadPoliciesMap=snyk-monitor-custom-policies
Release "snyk-monitor-bananas" does not exist. Installing it now.
NAME: snyk-monitor-bananas
LAST DEPLOYED: Thu Jul 14 20:19:36 2022
NAMESPACE: bananas
STATUS: deployed
REVISION: 1
TEST SUITE: None

Überprüfen Sie abschließend, ob alles läuft:

➜ helm ls -A -o json | jq .
[
  {
"name": "snyk-monitor-apples",
"namespace": "apples",
"revision": "1",
"updated": "2022-07-14 19:45:56.681028 +1000 AEST",
"status": "deployed",
"chart": "snyk-monitor-1.92.10",
"app_version": ""
  },
  {
"name": "snyk-monitor-bananas",
"namespace": "bananas",
"revision": "1",
"updated": "2022-07-14 20:19:36.563328 +1000 AEST",
"status": "deployed",
"chart": "snyk-monitor-1.92.10",
"app_version": ""
  }
]

➜ kubectl get pods -n bananas
NAME                                  READY   STATUS   RESTARTS  AGE
Snyk-monitor-bananas-54b8c4bf89-r6tf2   1/1 Running   0      3m38s

Schritt 5: Überprüfen, ob bereitgestellte Workloads automatisch über die Policy importiert werden

Als Nächstes stellen wir Workloads im Namespace apples bereit, um sicherzustellen, dass sie automatisch importiert werden. Wir beginnen mit einer Spring-Boot-Anwendung, die wir wie unten gezeigt in Kubernetes bereitstellen.

Erstellen Sie eine Datei namens springbootemployee-K8s.yaml mit folgendem Inhalt:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-employee-api-apples
  namespace: apples
spec:
  selector:
matchLabels:
  app: springboot-employee-api-apples
  replicas: 1
  template:
metadata:
  labels:
    app: springboot-employee-api-apples
spec:
  containers:
    - name: springboot-employee-api-apples
      image: pasapples/springbootemployee:multi-stage-add-layers
      imagePullPolicy: Always
      ports:
        - containerPort: 8080

Stellen Sie sie anschließend bereit:

➜ kubectl apply -f springbootemployee-K8s.yaml
deployment.apps/springboot-employee-api-apples created

Überprüfen Sie nach einigen Minuten, ob der Workload gescannt und automatisch in die Snyk-Organisation „Äpfel“ in Snyk importiert wurde. Der Snyk-Controller im Namespace apples sollte dies entsprechend seiner Konfiguration erledigt haben.

Snyk Projects-Dashboard mit Kubernetes-Projekten der Organisation aks-apples-kubernetes und der Anzahl der Issues nach Schweregrad

Schritt 6: Workloads in „Bananen“ bereitstellen – automatischer Import über eine Rego-Policy-Datei

Erstellen Sie eine Datei namens snyk-boot-web-deployment.yaml mit folgendem Inhalt:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: snyk-boot-web
  namespace: bananas
spec:
  selector:
    matchLabels:
      app: snyk-boot-web
  replicas: 1
  template:
    metadata:
      labels:
        app: snyk-boot-web
    spec:
      containers:
        - name: snyk-boot-web
          image: pasapples/snyk-boot-web:v1
          imagePullPolicy: Always
          ports:
            - containerPort: 5000

Stellen Sie sie wie folgt bereit:

➜ kubectl apply -f snyk-boot-web-deployment.yaml
deployment.apps/snyk-boot-web created

Überprüfen Sie nach etwa drei Minuten, ob der Workload gescannt und automatisch in die Snyk-Organisation „Bananen“ in der Snyk-App importiert wurde. Der Snyk-Controller im Namespace „Bananen“ sollte dies entsprechend seiner Konfiguration erledigt haben.

Snyk Projects-Dashboard mit Kubernetes-Projekten, Anzahl der Schwachstellen nach Schweregrad sowie Optionen zum Anzeigen von Berichten oder Hinzufügen eines Projekts.

Bonus: Protokolle der Snyk-Controller anzeigen

Kubernetes-Konfigurations- und YAML-Dateien können etwas knifflig sein. Falls bei der Einrichtung Ihrer Monitore Probleme auftreten, kann es hilfreich sein, die Protokolle der einzelnen Snyk-Controller anzusehen, wie in den folgenden Befehlsbeispielen gezeigt:

Snyk-Controller für „Äpfel“

export APPLES_POD=`kubectl get pods --namespace apples -l "app.kubernetes.io/name=snyk-monitor-apples" -o jsonpath="{.items[0].metadata.name}"`

kubectl logs -n apples $APPLES_POD -f

Snyk-Controller für „Bananen“

export BANANAS_POD=`kubectl get pods --namespace bananas -l "app.kubernetes.io/name=snyk-monitor-bananas" -o jsonpath="{.items[0].metadata.name}"`

kubectl logs -n bananas $BANANAS_POD -f

Zusammenfassung

In diesem Blogbeitrag haben wir gezeigt, wie Sie mehrere Snyk-Controller in einem einzelnen Kubernetes-Cluster bereitstellen, die jeweils ihren eigenen Namespace überwachen. Die Controller kommunizieren mit der Kubernetes-API, um festzustellen, welche Workloads im Cluster ausgeführt werden (z. B. Deployment, ReplicationController, CronJob usw., wie in der Rego-Policy-Datei definiert). Sie ermitteln die zugehörigen Images und scannen diese direkt im Cluster auf Schwachstellen.

Probieren Sie diese Schritte gerne in Ihrem eigenen Kubernetes-Cluster aus. Starten Sie dazu eine kostenlose Testversion des Snyk-Business-Plans.

Weitere Informationen

Nachdem Sie nun erfahren haben, wie einfach sich die Kubernetes-Integration mit Snyk einrichten lässt, finden Sie hier einige hilfreiche Links für den Einstieg in die Container-Sicherheit.

Sichern Sie Ihre Infrastruktur an der Quelle

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

Weiterlesen

feature insights context
Blog

Autonome Angriffe sind bereits Realität. Die Verteidigung muss Schritt halten.

Autonome Angreifer verkürzen das Zeitfenster für die Verteidigung. Erfahren Sie, wie kontinuierliches Erkennen, Beheben, Validieren und Verhindern Sicherheitsteams helfen kann, Schritt zu halten.

Blog

Evo ADS Govern Agent Behavior ist allgemein verfügbar: MCP-Nutzung unter Kontrolle bringen

Evo ADS Govern Agent Behavior ist jetzt allgemein verfügbar und startet mit MCP Governance. Entdecken, genehmigen, überwachen, protokollieren und blockieren Sie die MCP-Server-Nutzung in führenden KI-Coding-Agenten.

illustration hero ai
Blog

Was ist Agentic AppSec?

Erfahren Sie, wie Agentic AppSec fundierte, klar begrenzte und unabhängig überprüfte KI-Agenten einsetzt, um den Application-Security-Kreislauf zu steuern.