Analyser les vulnérabilités AWS avec l’intégration Snyk
10 février 2021
0 minutes de lectureSi vous utilisez la suite d’outils AWS liés à Kubernetes, vous serez ravi d’apprendre que vous pouvez intégrer Snyk à vos workflows pour y lancer des analyses, grâce aux intégrations avec Amazon Elastic Container Registry ( ECR ) et Amazon Elastic Kubernetes Service ( EKS ). Voici comment démarrer !
Dans cet article, je vais utiliser l’une de nos applications de test Snyk pour créer et déployer une application. Vous trouverez le code ici. Vous aurez également besoin d’installer quelques dépendances :
C’est parti
Maintenant que tout est prêt, commençons !
Commençons par configurer ECR afin que Snyk puisse accéder à nos dépôts. Pour cela, nous devons attribuer une stratégie et un rôle dans AWS Identity and Access Management, afin d’accorder au backend Snyk les autorisations nécessaires pour, par exemple, répertorier les images et les extraire de nos dépôts ECR.
Les étapes de configuration de l’intégration sont détaillées dans la documentation Snyk, mais nous pouvons accéder à tous les paramètres nécessaires directement depuis l’interface Snyk. Accédez à Settings/Integrations/ECR/Edit Settings. Commencez par créer une stratégie à l’aide du JSON affiché dans l’interface :
- oriCela accordera à Snyk les autorisations définies dans la section Action du JSON pour tous les dépôts et toutes les images de notre compte ECR. Il s’agit du minimum d’autorisations nécessaire pour répertorier les dépôts et les images, et pour extraire les images des dépôts. Suivez les instructions pour ajouter ce JSON à la configuration de votre stratégie IAM dans AWS.
Nous devons ensuite ajouter un rôle et lui attribuer la stratégie, comme indiqué dans les instructions :

Nous devons également définir la portée du rôle en précisant les ID d’organisation Snyk autorisés à l’utiliser. Pour cela, modifiez les relations de confiance du rôle nouvellement créé à l’aide du JSON fourni dans la documentation. La chaîne sts:ExternalId correspond à l’ID de votre organisation Snyk. Cet extrait JSON permet au principal AWS d’assumer le rôle si l’ExternalId fourni correspond à l’ID de notre organisation Snyk.
Comme indiqué dans les instructions, si vous devez ajouter plusieurs organisations Snyk à cette stratégie, ajoutez-les sous forme de tableau JSON, entre crochets :
Pour trouver l’ID de votre organisation Snyk, accédez à Settings > General.

La dernière étape consiste à configurer l’interface Snyk pour utiliser ce rôle afin de se connecter à ECR. De retour dans Settings/Integrations/ECR/Edit Settings, indiquez la région dans laquelle ECR est configuré ainsi que le rôle créé précédemment :

L’intégration ECR devrait maintenant être entièrement configurée. Passons aux tests.
Commençons par créer un dépôt dans ECR à l’aide d’AWS CLI :
Maintenant que nous avons un dépôt dans ECR, configurons Docker pour pouvoir y envoyer des images :
Cette commande affiche votre mot de passe de connexion, puis le transmet à Docker CLI pour authentifier votre accès au registre AWS ECR. Veillez à définir la bonne région AWS, celle dans laquelle ECR est activé.
Passons maintenant à notre application de test. Il s’agit d’une application Node.js simple qui comporte de nombreuses vulnérabilités, ainsi que la configuration nécessaire pour la créer avec Docker et la déployer sur Kubernetes.
Nous allons d’abord créer l’application à l’aide de Docker.
Une fois l’image créée, elle devrait apparaître dans notre dépôt Docker local :
Avant de l’envoyer vers notre dépôt ECR en amont, nous devons lui attribuer une balise en remplaçant le nom du dépôt par celui que vous avez configuré précédemment dans ECR :
Nous pouvons maintenant l’envoyer vers ECR :
Une fois l’envoi terminé, vérifions dans notre dépôt ECR que l’image est bien présente :
Une fois l’image dans ECR, nous pouvons configurer Snyk pour l’analyser depuis cet emplacement. Dans l’interface Snyk, sélectionnez Add Project, puis accédez à l’icône ECR :

Si notre configuration ECR est correcte, une vue présentant tous les dépôts et les images qu’ils contiennent devrait s’afficher :

Nous voyons le dépôt goof créé précédemment, qui contient une seule balise d’image. Sélectionnez l’image, puis cliquez sur le bouton Add selected repositories. Snyk importera alors le dépôt depuis ECR et commencera à l’analyser et à le surveiller.
Une fois l’importation terminée, le projet importé devrait apparaître sur la page Projects de Snyk :

Snyk a détecté à la fois l’image elle-même et le fichier package.json utilisé par l’application Node et déployé dans l’image, puis a créé un projet pour chacun.
L’image utilise une ancienne image de base vulnérable. Snyk aura détecté de nombreuses vulnérabilités et proposé des images de base qui pourraient réduire le nombre total de vulnérabilités.

Le fichier package.json répertorie les packages Node inclus directement dans l’application, ceux spécifiés dans le fichier package.json, ainsi que les dépendances indirectes. Snyk aura créé un arbre de dépendances pour tous ces packages et interrogé la base de données des vulnérabilités afin de détecter celles présentes dans les versions utilisées. Vous en verrez beaucoup, car cette application est conçue pour utiliser des versions vulnérables.

Vous trouverez également des informations sur chaque vulnérabilité ainsi que des conseils de correction indiquant quels packages mettre à niveau. Prenez le temps d’explorer toutes les informations disponibles dans l’interface Snyk.
Configurer l’intégration Snyk avec EKS
Nous allons maintenant configurer l’intégration Snyk avec Elastic Kubernetes Service. Pour cela, vous aurez besoin d’un essai gratuit de l’une des formules Snyk standard, car l’intégration Kubernetes fait partie de notre offre payante.
Pour cela, créons un cluster Kubernetes avec EKS. Il existe plusieurs façons de procéder, mais l’une des plus simples consiste à utiliser l’outil eksctl.
Je commence par utiliser AWS CLI pour créer une paire de clés que je pourrai utiliser pour me connecter en SSH aux nœuds de mon cluster si nécessaire :
J’utilise ensuite eksctl pour créer un cluster, nommé ici mattjarvis-sko, dans la région us-west-2, avec un groupe de nœuds géré sous Linux et ma paire de clés.
% eksctl create cluster --name mattjarvis-sko --region us-west-2 --with-oidc --ssh-access --ssh-public-key SKO_demo --managed
Cette commande prendra un certain temps, mais une fois terminée, vous disposerez d’un cluster EKS entièrement opérationnel et kubectl sera configuré pour communiquer avec lui.
Maintenant que notre cluster EKS est opérationnel, examinons la configuration Kubernetes permettant de déployer l’application. Dans le dépôt Git de l’application goof, vous trouverez un répertoire manifests contenant deux fichiers YAML Kubernetes.
Le fichier goof-deployment.yaml définit l’application goof ainsi qu’un pod mongodb dont elle dépend. Vous devrez modifier la section image pour utiliser le dépôt ECR configuré précédemment :
Le fichier goof-service.yaml définit le service mongodb, qui fournit une connexion au pod mongodb sur le port 27017. C’est ainsi que notre application goof se connecte à la base de données. Il définit également un service LoadBalancer externe qui sera déployé afin de permettre l’accès externe à l’application en cours d’exécution. L’implémentation de LoadBalancer dépend de la plateforme sur laquelle le cluster est déployé. Dans AWS, elle provisionnera un Elastic Load Balancer, accessible de l’extérieur sur le port 80 et pointant vers le port 3001 de notre pod goof, où s’exécute notre application Node.js.
Déployons maintenant l’application dans notre cluster :
L’URL du champ EXTERNAL-IP est fournie par l’ELB provisionné dans le cadre du service LoadBalancer. Nous pouvons l’utiliser pour consulter notre application en cours d’exécution. Si nous ouvrons cette URL dans un navigateur, l’application goof devrait s’afficher :

Notre application est donc déployée et fonctionne dans notre cluster EKS. La dernière étape consiste à configurer l’intégration entre Snyk et notre cluster EKS afin de pouvoir analyser les workloads en cours d’exécution en production. L’intégration Snyk avec Kubernetes repose sur un seul opérateur Kubernetes exécuté dans un pod. Il interroge l’API Kubernetes, analyse les images de conteneurs du cluster et communique avec le backend Snyk.
Si nous utilisions CloudFormation pour déployer le cluster EKS, nous pourrions utiliser les Quick Starts AWS que nous avons créés pour déployer l’intégration Snyk. Comme nous utilisons eksctl pour cette démonstration, procédons à l’installation manuelle.
Commençons par ajouter le dépôt Helm qui contient les charts permettant de déployer le moniteur Kubernetes Snyk :
Nous allons maintenant créer un espace de noms distinct pour le moniteur Snyk. En règle générale, il est recommandé de créer des espaces de noms distincts pour vos applications dans Kubernetes, car cela permet de contrôler plus finement les autorisations.
L’étape suivante consiste à créer un secret dans Kubernetes contenant notre integrationID Snyk. Le processus du moniteur Snyk l’utilisera pour communiquer avec l’API Snyk en amont et transmettre à Snyk des informations sur les pods en cours d’exécution dans le cluster. Si nous utilisions des registres privés nécessitant une authentification pour extraire les images, nous devrions également transmettre ces informations dans la section dockercfg.json. Pour en savoir plus, consultez la documentation du moniteur Snyk.
Une fois le secret créé, nous pouvons utiliser Helm pour installer Snyk Monitor dans l’espace de noms snyk-monitor.
Une fois le chart Helm installé, le pod snyk-monitor devrait être actif dans l’espace de noms snyk-monitor de notre cluster :
Nous pouvons également consulter les journaux et vérifier que snyk-monitor envoie des données à Snyk :
Les workloads peuvent mettre un peu de temps à apparaître dans l’interface Snyk, car le moniteur doit d’abord lui transmettre les données. Mais au bout d’une minute environ, vous devriez pouvoir consulter les workloads en cours d’exécution dans votre cluster en accédant à Add Project/Kubernetes :

Les workloads en cours d’exécution devraient maintenant s’afficher. Pour les ajouter, il suffit de cocher la case afin que Snyk les importe et les teste.

Une fois le projet importé, accédons à la page Projects pour examiner le projet importé. Première constatation : Snyk a détecté la configuration en cours d’exécution du workload et vérifié si elle présentait des problèmes de sécurité. Ici, plusieurs tests de sécurité ont échoué, notamment parce que l’application s’exécute en tant que root et sans limites CPU :

Si nous examinons maintenant le workload lui-même, nous voyons que Snyk a détecté l’image de base et toutes les vulnérabilités qu’elle contient, et a recommandé d’autres images de base moins exposées aux vulnérabilités.

Pour conclure
Cette démonstration montre comment intégrer les tests de sécurité tout au long du cycle de développement logiciel, une stratégie essentielle pour préserver la sécurité de nos workloads et de notre infrastructure dans les environnements cloud natifs.
Snyk s’intègre également à un large éventail d’environnements de développement intégrés, d’outils de gestion du code source et de systèmes CI/CD, afin de couvrir l’ensemble de votre pipeline de déploiement.
Si vous utilisez les services de conteneurs et Kubernetes d’Amazon, intégrer Snyk à ECR et EKS est très simple. Des Quick Starts AWS permettent de tout déployer à l’aide de modèles CloudFormation. Créez un compte Snyk gratuit et essayez !
Lancez-vous dans les compétitions Capture The Flag
Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.



