Skip to main content

Installer plusieurs contrôleurs Snyk Kubernetes dans un même cluster Kubernetes

Écrit par

Pas Apicella

feature multispace k8s

15 août 2022

0 minutes de lecture

Kubernetes fournit une interface qui facilite l’exécution de systèmes distribués. Il prend en charge la mise à l’échelle et le basculement de vos applications, propose des modèles de déploiement et bien plus encore. En matière de sécurité, ce sont les équipes qui déploient des workloads dans le cluster Kubernetes qui doivent déterminer lesquels surveiller pour répondre aux exigences de sécurité de leurs applications.

Mais que se passerait-il si chaque équipe pouvait contrôler les images de conteneurs analysées et les workloads concernés ? Plusieurs équipes pourraient déployer des workloads dans Kubernetes, chacune ayant ses propres exigences en matière de surveillance. Pour répondre au mieux à ce besoin, chaque équipe peut configurer sa propre intégration Snyk Kubernetes et surveiller les workloads qui la concernent. Voyons comment procéder.

Présentation de l’intégration Snyk Kubernetes

Snyk s’intègre à Kubernetes pour vous permettre d’importer et de tester en continu vos workloads en cours d’exécution, afin d’identifier les vulnérabilités dans les images sous-jacentes ainsi que les configurations susceptibles de réduire leur niveau de sécurité. Une fois les workloads déployés, Snyk continue de les surveiller pour détecter les expositions à de nouvelles vulnérabilités et tout autre problème de sécurité, à mesure que de nouveaux conteneurs sont déployés ou que la configuration des workloads évolue.

Diagramme de contexte système montrant un client ayant intégré Kubernetes et reliant Kubernetes, Snyk Controller et Snyk Platform.

Diagramme de l’architecture de l’intégration Kubernetes

Comment installer plusieurs contrôleurs Snyk dans un même cluster Kubernetes

Passons à la partie pratique ! Nous allons vous guider pas à pas pour configurer plusieurs contrôleurs Snyk dans un même cluster Kubernetes. Voici les étapes à suivre :

  1. Configurer des espaces de noms distincts

  2. Créer une organisation Snyk pour chaque espace de noms

  3. Installer et configurer snyk monitor pour le premier espace de noms (apples)

  4. Installer et configurer snyk monitor pour le deuxième espace de noms (bananas)

  5. Vérifier que les workloads déployés sont automatiquement importés par le biais de la policy

  6. Déployer des workloads dans bananas, qui seront importés automatiquement à l’aide d’un fichier de policy Rego

Prérequis

  1. Vous devez disposer d’un compte Snyk Business ou Enterprise pour utiliser l’intégration Kubernetes. Si vous n’en avez pas, vous pouvez démarrer un essai gratuit de notre offre Business. Même si vous ne souhaitez pas essayer par vous-même, nous vous encourageons à poursuivre votre lecture (en passant les blocs de code) pour découvrir comment installer et gérer plusieurs contrôleurs Snyk dans un même cluster Kubernetes.

  2. Un cluster Kubernetes, tel qu’AKS, EKS, GKE, Red Hat OpenShift ou toute autre distribution prise en charge.

Étape 1 : configurer des espaces de noms distincts

Pour cette démonstration, j’utilise un service Azure AKS comme cluster Kubernetes. Nous allons y installer deux contrôleurs Snyk, chacun dans son propre espace de noms : l’un dans l’espace de noms apples et l’autre dans l’espace de noms bananas, comme l’illustre le schéma ci-dessous.

Schéma d’un cluster Kubernetes divisé en espaces de noms Apples et Bananas, contenant chacun des composants Node.js, Python et Snyk Controller.

Créez les espaces de noms comme indiqué ci-dessous :

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

Étape 2 : créer une organisation Snyk pour chaque espace de noms

En utilisant des organisations Snyk distinctes, nous séparons l’analyse des workloads. Les équipes produit peuvent ainsi disposer de leur propre organisation et mieux contrôler l’analyse de leurs workloads et de leurs images. Vous pouvez utiliser la même organisation avec chacun des contrôleurs Snyk déployés, mais nous allons ici les séparer. Dans les deux cas, les workloads apparaîtront avec un libellé que nous définirons lors de l’installation des contrôleurs Snyk.

Menu de sélection d’organisation affichant les organisations répertoriées et l’option « Créer une nouvelle organisation » entourée

Nos nouvelles organisations

 Une pour l’espace de noms apples :

Bannière Snyk violette avec une vignette de voiture rouge et le libellé « aks-apples-kubernetes »

Une pour l’espace de noms bananas :

Bannière Snyk violette montrant une petite voiture rouge et le texte « aks-bananas-kubernetes » avec une flèche de menu déroulant

Une fois créées, vous devriez voir deux organisations vides dans l’application Snyk. Nous les utiliserons bientôt.

Interface de recherche des organisations affichant Apples Inc. et les groupes « aks-apples-kubernetes » et « aks-bananas-kubernetes », mis en évidence par un ovale rouge.
En-tête du tableau de bord Snyk affichant le sélecteur de projet « aks-bananas-kubernetes » et l’icône des paramètres mise en évidence

Pour chaque organisation, activez l’intégration Kubernetes en sélectionnant l’onglet Integrations, puis Kubernetes et enfin Connect. Suivez ensuite les instructions Snyk sur Kubernetes pour terminer la configuration.

Notez les Integration IDs de l’intégration Kubernetes de chaque organisation Snyk : vous en aurez bientôt besoin. Pour récupérer l’Integration ID Kubernetes, cliquez sur l’icône organization settings dans la barre de navigation supérieure de Snyk, puis accédez à Integrations dans la barre latérale et sélectionnez l’intégration Kubernetes, comme indiqué ci-dessous.

Paramètres de l’intégration Snyk Kubernetes affichant un cluster connecté, un ID d’intégration, un bouton de copie, la documentation et la version du contrôleur.

Étape 3 : installer et configurer snyk monitor pour l’espace de noms apples

Maintenant que nos organisations et nos intégrations sont configurées et connectées à notre cluster, nous pouvons configurer Snyk Monitor depuis un terminal.

Nous allons créer un fichier pour nous abonner aux événements de workloads, définir les critères de nos abonnements, installer le chart Helm de Snyk pour la surveillance Kubernetes, puis configurer et démarrer le moniteur.

Créer le fichier de registre

Dans un terminal, créez un répertoire pour l’organisation apples, puis accédez-y :

➜  mkdir apples
➜  cd apples

Créez un fichier nommé workload-events.rego contenant le texte suivant, en remplaçant <APPLES_INTEGRATION_ID> par l’Integration ID de l’intégration Kubernetes de l’organisation apples.

Dans la policy Rego ci-dessous, nous demandons au contrôleur Snyk d’importer ou de supprimer uniquement les workloads de l’espace de noms apples, à condition que leur type ne soit ni CronJob ni Service. Pour en savoir plus sur les différents types de workloads, consultez la documentation Snyk.

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"
}

Ajouter les charts Helm Snyk à votre dépôt

Accédez à votre environnement Kubernetes et exécutez la commande suivante pour ajouter le dépôt Snyk Charts à Helm. Nous en aurons besoin pour installer ce chart Helm.

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

Créer la configuration de Snyk Monitor et déployer le chart Helm

Un secret Kubernetes nous permet d’exécuter le moniteur sans exposer d’identifiants en texte brut. Dans ces étapes, nous allons créer et utiliser ce secret lors du déploiement de la configuration de l’organisation apples.

Créez le secret snyk-monitor pour l’espace de noms apples, en remplaçant <APPLES_INTEGRATION_ID> par l’ID de l’intégration Kubernetes de l’application Snyk pour apples. Dans cette démonstration, nous utilisons Docker Hub public pour notre registre de conteneurs, qui ne nécessite pas d’identifiants pour accéder aux images publiques. Pour en savoir plus sur l’utilisation de registres de conteneurs privés, consultez la documentation du contrôleur Snyk.

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

Créez ensuite une configmap pour stocker le fichier de policy Rego qui permettra à snyk-monitor de déterminer ce qu’il faut importer ou supprimer automatiquement de l’espace de noms apples :

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

Installez ensuite snyk-monitor dans l’espace de noms apples, en remplaçant <APPLES_INTEGRATION_ID> par l’ID d’intégration de l’application Snyk pour apples dans la commande :

➜ 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

Remarque :Le libellé « AKS K8s - Apples » vous permettra de retrouver les workloads importés dans l’interface Snyk, comme vous le verrez bientôt.

Enfin, vérifiez que tout fonctionne (cette commande suppose que jq est installé ; sinon, omettez la partie | jq de l’instruction) :

➜ 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

À ce stade, un contrôleur Snyk portant un nom unique est installé dans l’espace de noms apples. Nous verrons plus loin comment ce contrôleur importe automatiquement les workloads en fonction de notre configuration, au fur et à mesure de leur déploiement dans l’espace de noms apples du cluster Kubernetes. Pour l’instant, si vous actualisez la page des projets de l’organisation apples, vous remarquerez peut-être que Snyk Monitor lui-même a été analysé : c’est parce que nous lui avons demandé d’analyser les workloads de type Deployment dans l’espace de noms apples.

Tableau de bord des projets Snyk affichant deux projets Kubernetes, le nombre de vulnérabilités par niveau de gravité et une option pour ajouter un autre projet.

Étape 4 : installer et configurer snyk monitor pour l’espace de noms bananas

Créez un répertoire nommé bananas, puis accédez-y :

➜ cd ..
➜ mkdir bananas
➜ cd bananas

Créez ensuite un fichier nommé workload-events.rego contenant le texte suivant, et remplacez <BANANAS_INTEGRATION_ID> par l’ID de l’intégration Kubernetes de l’application Snyk pour bananas :

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

Créez ensuite le secret snyk-monitor pour l’espace de noms bananas, en remplaçant BANANAS_INTEGRATION_ID par l’ID de l’intégration Kubernetes de l’application Snyk pour bananas :

➜  ~/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

Créez ensuite une configmap pour stocker le fichier de policy Rego qui permettra à snyk-monitor de déterminer ce qu’il faut importer ou supprimer automatiquement de l’espace de noms bananas :

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

Installez snyk-monitor dans l’espace de noms bananas, en remplaçant ‰¤BANANAS_INTEGRATION_ID> par l’ID de l’intégration Kubernetes de l’application Snyk pour bananas :

➜ 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

Enfin, vérifiez que tout fonctionne :

➜ 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

Étape 5 : vérifier que les workloads déployés sont automatiquement importés par le biais de la policy

Nous allons maintenant déployer des workloads dans l’espace de noms apples pour vérifier qu’ils sont importés automatiquement. Commençons par une application Spring Boot que nous allons déployer dans Kubernetes comme indiqué ci-dessous.

Créez un fichier nommé springbootemployee-K8s.yaml contenant les éléments suivants :

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

Déployez-le ensuite :

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

Après quelques minutes, vérifiez que le workload a été analysé et automatiquement importé dans l’organisation Snyk apples, comme demandé au contrôleur Snyk dans l’espace de noms apples.

Tableau de bord des projets Snyk affichant les projets Kubernetes de l’organisation aks-apples-kubernetes avec le nombre de problèmes par niveau de gravité

Étape 6 : déployer des workloads dans bananas — importation automatique à l’aide du fichier de policy Rego

Créez un fichier nommé snyk-boot-web-deployment.yaml contenant les éléments suivants :

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

Déployez-le comme suit :

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

Après environ 3 minutes, vérifiez que le workload a été analysé et automatiquement importé dans l’organisation Snyk bananas de l’application Snyk, comme demandé au contrôleur Snyk dans l’espace de noms bananas.

Tableau de bord des projets Snyk affichant des projets Kubernetes, le nombre de vulnérabilités par niveau de gravité et des options pour consulter des rapports ou ajouter un projet.

Bonus : consulter les journaux des contrôleurs Snyk

La configuration Kubernetes et les fichiers YAML peuvent être délicats. Si vous rencontrez des problèmes lors de la configuration de vos moniteurs, il peut être utile de consulter les journaux de chaque contrôleur Snyk, comme dans les exemples de commandes ci-dessous :

Contrôleur Snyk Apples

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

Contrôleur Snyk Bananas

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

Récapitulatif

Dans cet article, nous avons montré comment déployer plusieurs contrôleurs Snyk dans un même cluster Kubernetes, chacun surveillant son propre espace de noms. Les contrôleurs communiquent avec l’API Kubernetes pour déterminer quels workloads (par exemple Deployment, ReplicationController, CronJob, etc., comme indiqué dans le fichier de policy Rego) sont exécutés sur le cluster, trouver les images qui leur sont associées et les analyser directement sur le cluster pour détecter les vulnérabilités.

N’hésitez pas à essayer ces étapes sur votre propre cluster Kubernetes. Pour cela, démarrez un essai gratuit de l’offre Snyk Business.

Ressources pour en savoir plus

Maintenant que vous savez à quel point il est facile de configurer l’intégration Kubernetes avec Snyk, voici quelques liens utiles pour vous lancer dans la sécurisation de vos conteneurs.

Sécurisez votre infrastructure dès la source

Snyk automatise la sécurité et la conformité de l’IaC dans vos workflows, et détecte les ressources dont la configuration a dérivé ou qui sont manquantes.

Lire la suite

feature insights context
Blog

Les attaques autonomes sont déjà là. La défense doit suivre leur rythme.

Les attaquants autonomes réduisent la fenêtre de défense. Découvrez comment la découverte, la correction, la validation et la prévention continues peuvent aider les équipes de sécurité à suivre le rythme.

Blog

Evo ADS : la gouvernance des comportements des agents est disponible : maîtrisez l’utilisation de MCP

La gouvernance des comportements des agents Evo ADS est désormais disponible, avec MCP Governance en première étape. Découvrez, approuvez, surveillez, consignez et bloquez l’utilisation des serveurs MCP par les principaux agents de programmation IA.

illustration hero ai
Blog

Qu’est-ce que l’AppSec agentique ?

Découvrez comment l’AppSec agentique s’appuie sur des agents IA ancrés dans la réalité, aux missions délimitées et vérifiés de manière indépendante pour gérer le cycle de sécurité des applications.