Skip to main content

Sécurisez votre application, d’Argo CD à Kubernetes

Écrit par

JJ Ng

Pas Apicella

Kubernetes Blog

12 octobre 2022

0 minutes de lecture

GitOps est un cadre très répandu pour gérer et sécuriser le pipeline de développement des applications. Pour beaucoup de ceux qui se sont lancés dans une démarche GitOps, une question revient souvent : « Comment sécuriser mon pipeline quand tout est automatisé ? »

Le cadre GitOps repose sur un principe : toutes les validations de code et modifications s’effectuent dans Git, ce qui déclenche ensuite un pipeline automatisé qui compile et déploie les applications sur Kubernetes. Comme les équipes de développement et de sécurité interviennent peu dans le pipeline, il est essentiel d’imposer des exigences de sécurité afin que les applications déployées présentent le moins de vulnérabilités possible.

Cet article explique comment Snyk peut assurer la sécurité des applications dans un environnement GitOps, en se concentrant sur Argo CD, un outil très répandu. Dans ce scénario, Snyk analyse l’IaC pour vérifier que l’application à déployer est sécurisée avant son déploiement, et interrompt la compilation si ce n’est pas le cas. Snyk peut également surveiller automatiquement les applications déployées dans différents espaces de noms Kubernetes.

Qu’est-ce qu’Argo CD ?

Argo CD est un outil de livraison continue (CD) déclaratif et natif de Kubernetes. Il suit un dépôt et détecte les modifications, ou « dérives ». Il applique ensuite les changements nécessaires à la configuration du cluster Kubernetes.

Configurer Argo CD pour fonctionner avec Snyk

Cette démonstration vous montre comment démarrer votre processus GitOps avec Argo CD, en utilisant Snyk pour sécuriser l’application et surveiller les charges de travail Kubernetes. Voici les étapes à suivre :

  1. Clonez votre dépôt Git

  2. Configurez Argo CD

  3. Déployez l’application avec Argo CD

  4. Créez un objet Secret Kubernetes pour votre jeton Snyk

  5. Créez un hook de ressource PreSync Argo CD

  6. Attendez qu’Argo CD détecte la dérive de configuration

  7. Intégrez Kubernetes

Prérequis

  1. Vous devez disposer d’un compte Snyk avec un forfait Business ou Enterprise pour exécuter des tests Snyk sur Argo CD et importer automatiquement des charges de travail Kubernetes dans Snyk. Si vous n’avez pas de compte Snyk, vous pouvez essayer gratuitement notre forfait Business.

  2. Une instance Argo CD opérationnelle dans votre cluster Kubernetes. Pour en savoir plus sur la configuration, consultez la documentation Argo CD.

  3. Un cluster Kubernetes opérationnel (par exemple, EKS, AKS, GKE, Red Hat OpenShift ou toute autre distribution prise en charge).

Étape 1 : Clonez votre dépôt Git

Cette démonstration utilise une application de sondage Flask dont le code source est hébergé sur https://github.com/jiajunngjj/flask-polling-app. Clonez le dépôt dans votre propre environnement.

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

Étape 2 : Configurez Argo CD

Ajoutez votre cluster Kubernetes à Argo CD :

žœ argocd cluster add CONTEXTNAME

Dans cette démonstration, Argo CD se trouve dans ce cluster Kubernetes. Il s’y connecte donc automatiquement à l’aide du nom d’hôte interne K8s (kubernetes.default.svc) :

Page des paramètres des clusters Argo CD affichant un cluster Kubernetes dans le cluster à l’adresse https://kubernetes.default.svc, en version 1.21 et avec un état de connexion réussi

Ensuite, vérifiez que le dépôt mentionné précédemment est également ajouté à Argo CD :

Formulaire Argo CD « Connect repo using SSH » affichant le projet par défaut et l’URL d’un dépôt GitHub.

Une fois le dépôt ajouté, vous devriez voir quelque chose de similaire :

Page des paramètres des dépôts Argo CD affichant deux dépôts GitHub connectés avec succès et des options pour connecter des dépôts.

Étape 3 : Déployez l’application avec Argo CD

Créez un espace de noms Kubernetes pour y déployer l’application. Dans cet exemple, nous créons l’espace de noms argocd-demo pour exécuter flask-polling-app :

žœ kubectl create ns argocd-demo

Utilisez la ligne de commande Argo CD pour créer l’application (ou faites-le depuis l’interface Argo CD après avoir ajouté le dépôt) :

žœ 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

Voici le détail de la commande :

  • repo — Dépôt de gestion du code source (SCM)

  • path — Répertoire contenant le manifeste Kubernetes

  • dest-server — Cluster Kubernetes

  • dest-namespace — Espace de noms Kubernetes où déployer l’application

Une fois l’application créée dans Argo CD, son état apparaît comme OutOfSync dans l’interface :

Tableau de bord des applications Argo CD montrant l’application snyk-demo marquée « Manquante » et « Désynchronisée »
Écran des détails de l’application Argo CD affichant l’application snyk-demo avec l’état OutOfSync, ainsi que les ressources du service et du déploiement polling-app dans l’arborescence de l’application.

Exécutez ensuite la commande Argo CD sync pour déployer l’application :

žœ argocd app sync snyk-demo

L’application devrait alors apparaître dans l’interface Argo CD :

Arborescence des détails de l’application Argo CD montrant l’application snyk-demo en bon état et synchronisée, ainsi que les ressources Kubernetes de polling-app

Vous devriez également voir que le déploiement de l’application a commencé dans l’espace de noms Kubernetes argocd-demo :

➜ 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

Étape 4 : Créez un objet Secret Kubernetes pour votre jeton Snyk

Une fois l’application ajoutée à Argo CD, vous pouvez intégrer le test Snyk IaC au pipeline Argo CD. Récupérez votre jeton Snyk dans l’application Snyk, puis créez un objet Secret dans l’espace de noms argocd-demo :

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

Étape 5 : Créez un hook de ressource PreSync Argo CD

Créez un fichier nommé snyk-scan.yaml dans le même répertoire que les fichiers YAML de déploiement (argocd) et ajoutez-y le contenu suivant :

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

Modifiez le fichier polling-app.yaml pour déclencher la détection de dérive de configuration (dans cet exemple, le nombre de réplicas passe à « 1 ») :

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

Exécutez les commandes Git pour envoyer le fichier vers le dépôt :

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

Étape 6 : Attendez qu’Argo CD détecte la dérive de configuration

Lorsqu’Argo CD détecte la dérive de configuration, il lance la synchronisation pour atteindre le nouvel état souhaité. Vous pouvez voir l’analyse Snyk IaC se déclencher avant le déploiement de l’application :

Arborescence des détails de l’application Argo CD montrant que l’application snyk-demo est en bon état et synchronisée, avec la tâche snyk-iac-scan mise en évidence en rouge.

Vous pouvez également voir le pod snyk-iac-scan en cours d’exécution :

➜ 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

Enfin, l’interface Argo CD affiche une tâche snyk-iac-scan :

Les journaux d’Argo CD pour la tâche snyk-iac-scan indiquent que l’analyse Snyk Infrastructure as Code est terminée et a détecté cinq problèmes de faible gravité.

Étape 7 : Intégrez Kubernetes

Snyk s’intègre à Kubernetes pour vous permettre d’importer et de tester vos charges de travail en cours d’exécution, afin de détecter les vulnérabilités dans les images associées et les configurations susceptibles de réduire leur sécurité. Une fois importées, Snyk surveille en continu ces charges de travail et détecte les problèmes de sécurité, qu’il hiérarchise, à mesure que de nouvelles images sont déployées et que la configuration des charges de travail évolue.

L’un des avantages est que vous n’avez pas besoin de modifier vos fichiers YAML de déploiement : tout se fait automatiquement avec Snyk Controller, si vous activez l’importation automatique (comme expliqué dans la documentation Snyk). Snyk prend en charge les charges de travail suivantes :

  • Déploiements

  • ReplicaSets

  • DaemonSets

  • StatefulSets

  • Tâches

  • Tâches planifiées (CronJobs)

  • ReplicationControllers

  • Pods

D’autres articles du blog Snyk expliquent comment installer plusieurs clusters Kubernetes Snyk dans un seul cluster et comment utiliser Pulumi pour automatiser l’intégration de Snyk à Kubernetes.

Une fois votre application déployée par Argo CD, l’intégration Kubernetes de Snyk importe automatiquement l’analyse de cette charge de travail dans la plateforme, sans aucune intervention manuelle :

Tableau de bord des projets Snyk présentant les charges de travail Kubernetes et le nombre de problèmes de sécurité, avec le projet polling-app mis en évidence par un ovale rouge.
Tableau de bord de projet Snyk pour une application de sondage Kubernetes, affichant les détails de l’image et des recommandations pour mettre à niveau l’image de base Python.

En résumé

Cette démonstration utilise le hook de ressource d’Argo CD pour déclencher une analyse Snyk IaC à chaque détection d’une modification de configuration. Ainsi, il est possible d’imposer des exigences de sécurité dans un workflow GitOps : Snyk détecte les vulnérabilités et interrompt le workflow dès qu’une vulnérabilité dépasse le seuil de gravité défini. Le code vulnérable n’atteint ainsi jamais l’environnement de production.

Pour en savoir plus

Maintenant que vous savez configurer un test Snyk IaC avec Argo CD et surveiller les charges de travail sur Kubernetes, consultez ces ressources pour découvrir comment renforcer davantage la sécurité du cycle de vie du développement logiciel :

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.