Skip to main content

Docker pour les développeurs Node.js : 5 conseils pour ne pas compromettre votre sécurité

Écrit par
docker node

25 janvier 2021

0 minutes de lecture

Docker totalise plus de 50 milliards de téléchargements d’images de conteneurs. Avec des millions d’applications disponibles sur Docker Hub, les applications basées sur des conteneurs sont très populaires et offrent un moyen simple de distribuer et d’utiliser des applications.

Cela dit, créer vos propres applications web avec Docker et Node.js de manière intuitive peut présenter de nombreux risques de sécurité. Alors, comment faire de la sécurité une priorité pour les développeurs Node.js qui utilisent Docker ?

Avant d’aborder les principes essentiels de Docker pour Node.js et la création d’images Docker, examinons quelques questions fréquemment posées sur le sujet.

Comment conteneuriser des applications Node.js avec Docker ?

Exécuter votre application Node.js dans un conteneur Docker peut être aussi simple que de copier le répertoire du projet et d’installer tous les packages npm nécessaires. Mais de nombreux enjeux de sécurité et de production peuvent vous échapper. Le guide suivant présente des conseils pour un environnement de production sur la conteneurisation d’applications web Node.js avec Docker. Il couvre tous les aspects, du choix de l’image de base Docker appropriée et de l’utilisation de builds multiétapes à la gestion sécurisée des secrets et à l’activation correcte de la configuration du framework pour la production.

Cet article présente les informations nécessaires pour mieux comprendre l’impact du choix de l’image de base Docker adaptée à votre application web Node.js et vous aider à trouver l’image Docker la plus sécurisée pour votre application.

En quoi Docker est-il utile aux développeurs Node.js ?

La conteneurisation de votre application Node.js vous permet de regrouper l’application complète, y compris son environnement d’exécution, sa configuration, ses dépendances au niveau du système d’exploitation et tout ce dont elle a besoin pour fonctionner sur différentes plateformes et architectures de processeur. Ces images constituent des artefacts déployables appelés images de conteneurs. Les images Docker sont des bundles logiciels qui permettent de reproduire facilement les builds et offrent aux développeurs Node.js un moyen d’exécuter le même projet ou produit dans tous les environnements.

Enfin, les conteneurs Docker permettent aux développeurs d’expérimenter plus facilement de nouvelles versions de plateformes ou d’autres modifications, sans nécessiter d’autorisations spéciales ni de configuration d’un environnement dédié à l’exécution d’un projet.

1. Choisissez la bonne image de base Docker Node.js pour votre application

Pour créer une image Docker pour un projet Node.js, nous construisons notre propre image d’application à partir d’une autre image Docker que nous récupérons sur Docker Hub. C’est ce que l’on appelle l’image de base. Elle sert de fondation à la nouvelle image Docker que vous allez créer pour votre application Node.js.

Le choix de l’image de base est essentiel, car il a un impact considérable sur la vitesse de création de l’image Docker, ainsi que sur la sécurité et les performances de votre application web. Vous pourriez choisir une image complète de système d’exploitation, basée sur Debian ou Ubuntu, car elle vous donne accès à tous les outils et toutes les bibliothèques qu’elle contient.

Mais cela a un coût. Si une image de base présente une vulnérabilité de sécurité, celle-ci se retrouvera dans l’image que vous venez de créer. Pourquoi partir sur de mauvaises bases en choisissant une image de base volumineuse qui contient de nombreuses vulnérabilités ?

Dans les images de base, de nombreuses vulnérabilités de sécurité se trouvent dans la couche du système d’exploitation (OS) utilisée. L’étude de Snyk publiée en 2019, Déplacer la sécurité Docker vers la gauche, a montré que les vulnérabilités introduites par cette couche peuvent varier considérablement selon la variante choisie.

Graphique en barres intitulé « Vulnérabilités dans les images de systèmes d’exploitation » : Debian 55, Debian stretch-slim 42, Ubuntu 31, CentOS 1, Fedora 0 et Alpine 0.

Cette préoccupation est d’ailleurs légitime pour toutes les images de base que vous envisagez d’utiliser. Voici, par exemple, les principales images Docker et leurs builds les plus récents, tirés du rapport 2020 sur l’état de la sécurité de l’open source : ils montrent que les images de base Docker contiennent systématiquement des vulnérabilités de sécurité par défaut.

2. Analysez votre image Docker Node.js pendant le développement

Créer une image Docker à partir d’autres images, ou reconstruire ces images, peut introduire de nouvelles vulnérabilités. Mais vous pouvez garder la situation sous contrôle.

Traitez le processus de création d’images Docker comme toute autre activité de développement. Tout comme vous testez le code que vous écrivez, testez les images Docker que vous créez.

Ces tests comprennent des vérifications statiques des fichiers, également appelées linters, afin de vous assurer que vous évitez les failles de sécurité et autres mauvaises pratiques dans votre Dockerfile. Nous en présentons quelques-unes dans nos bonnes pratiques de sécurité pour les images Docker. Si vous développez des applications Node.js, consultez ce guide détaillé : 10 bonnes pratiques pour conteneuriser des applications web Node.js avec Docker.

Connecter vos dépôts Git à Snyk est également une excellente option. Snyk propose des intégrations natives avec GitHub, GitLab, Bitbucket et Azure Repos. L’intégration à Git nous permet d’analyser vos pull requests et de les annoter avec des informations de sécurité en cas de découverte de vulnérabilités. Vous pouvez ainsi définir des règles et empêcher la fusion d’une pull request si elle introduit de nouvelles vulnérabilités.

Si vous avez besoin de plus de flexibilité pour votre intégration continue (CI) ou d’une expérience développeur étroitement intégrée, découvrez la CLI Snyk.

La CLI vous permet de tester facilement votre image de conteneur Docker. Supposons que vous créez une image Docker localement et que vous l’avez étiquetée nodejs:notification-v99.9 : voici comment la tester :

  1. Installez la CLI Snyk :$ npm install -g snyk

  2. Laissez ensuite la CLI Snyk récupérer automatiquement un jeton API pour vous avec :$ snyk auth

  3. Analysez l’image de base locale :$ snyk container test nodejs:notification-v99.9

Les résultats du test s’affichent à l’écran, avec des informations sur la CVE et le chemin qui introduit la vulnérabilité, afin que vous sachiez quelle dépendance du système d’exploitation en est responsable.

Voici un exemple de résultat de test pour l’image de base Docker node:15 :

✗ High severity vulnerability found in binutils
  Description: Out-of-Bounds
  Info: https://snyk.io/vuln/SNYK-DEBIAN9-BINUTILS-404153
  Introduced through: dpkg/dpkg-dev@1.18.25, libtool@2.4.6-2
  From: dpkg/dpkg-dev@1.18.25 > binutils@2.28-5
  From: libtool@2.4.6-2 > gcc-defaults/gcc@4:6.3.0-4 > gcc-6@6.3.0-18+deb9u1 > binutils@2.28-5
  Introduced by your base image (node:15)

✗ High severity vulnerability found in binutils
  Description: Integer Overflow or Wraparound
  Info: https://snyk.io/vuln/SNYK-DEBIAN9-BINUTILS-404253
  Introduced through: dpkg/dpkg-dev@1.18.25, libtool@2.4.6-2
  From: dpkg/dpkg-dev@1.18.25 > binutils@2.28-5
  From: libtool@2.4.6-2 > gcc-defaults/gcc@4:6.3.0-4 > gcc-6@6.3.0-18+deb9u1 > binutils@2.28-5
  Introduced by your base image (node:15)

Organization:      snyk-demo-567
Package manager:   deb
Target file:       Dockerfile
Project name:      docker-image|node
Docker image:      node:15
Platform:          linux/amd64
Base image:        node:15
Licenses:          enabled

Tested 412 dependencies for known issues, found 554 issues.

Base Image  Vulnerabilities  Severity
node:15     554              56 high, 63 medium, 435 low

Recommendations for base image upgrade:

Alternative image types
Base Image                Vulnerabilities  Severity
node:current-buster-slim  53               10 high, 4 medium, 39 low
node:15.5-slim            72               18 high, 7 medium, 47 low
node:current-buster       304              33 high, 43 medium, 228 low

Notre antisèche de la CLI Snyk présente quelques-unes des possibilités qu’elle offre. Vous trouverez également dans notre documentation de plus amples informations pour bien démarrer avec la CLI Snyk Container.

3. Corrigez les vulnérabilités de l’environnement d’exécution Node.js dans vos images Docker

Lorsqu’on gère les risques liés aux images de conteneurs Docker, on oublie souvent un détail : l’environnement d’exécution de l’application. Que vous utilisiez Docker pour Java ou Docker pour des applications web Node.js, l’environnement d’exécution Node.js lui-même peut présenter des vulnérabilités.

Veillez à suivre les mises à jour de sécurité Node.js et à respecter la politique de sécurité Node.js. Plutôt que de suivre manuellement ces informations, utilisez Snyk pour détecter également les vulnérabilités de sécurité Node.js.

Pour vous donner plus de contexte sur les vulnérabilités de sécurité des différentes balises d’images de base Node.js, j’en ai analysé plusieurs avec la CLI Snyk et représenté les résultats sur le graphique logarithmique suivant :

Diagramme à barres comparant le nombre total de vulnérabilités de sécurité et de vulnérabilités liées à l’environnement d’exécution Node.js dans les images de base Docker Node.js et les variantes d’environnement d’exécution.

Vous pouvez constater que :

  1. La balise d’image de base node par défaut, également étiquetée node:latest, regroupe plus de 500 vulnérabilités de sécurité et introduit aussi 2 vulnérabilités dans l’environnement d’exécution Node.js lui-même. Si vous utilisez actuellement Node.js 15 en production sans avoir appliqué de correctif, cela devrait vous inquiéter.

  2. La balise d’image de base node:alpine ne regroupe peut-être pas de dépendances système d’exploitation vulnérables dans l’image de base — d’où l’absence de barre bleue —, mais elle comprend tout de même une version vulnérable de l’environnement d’exécution Node.js le plus récent (version 15).

  3. Si vous utilisez une version de Node.js qui n’est plus prise en charge, par exemple Node.js 10, celle-ci est vulnérable et ne reçoit aucune mise à jour de sécurité.

Si vous choisissiez la version 15 de Node.js, la plus récente au moment de la rédaction de cet article, vous vous exposeriez non seulement à 561 vulnérabilités de sécurité au sein de ce conteneur, mais aussi à deux vulnérabilités dans l’environnement d’exécution Node.js lui-même.

Vous pouvez consulter les résultats de l’analyse Docker sur cette URL publique de test d’images. N’hésitez pas à tester d’autres balises d’images de base Node.js que vous utilisez avec ce service public et gratuit d’analyse Docker.

Rapport de vulnérabilités Snyk pour Docker node:15.5.0, affichant 563 vulnérabilités et des problèmes liés à Node mis en évidence dans la barre latérale.

Si vous avez déjà un compte Docker, vous pouvez l’utiliser pour vous connecter à Snyk et importer rapidement vos dépôts Docker Hub.

4. Surveillez les images Docker déployées pour vos applications Node.js

Une fois vos images Docker créées, vous les envoyez probablement vers un registre Docker qui les répertorie, afin qu’elles puissent être déployées et lancées sous forme d’applications en conteneurs fonctionnelles.

Pourquoi surveiller les images de base Docker ?

Si vous appliquez toutes les consignes de sécurité que nous avons abordées jusqu’ici pour analyser et corriger les images de base, c’est très bien. Mais n’oubliez pas que de nouvelles vulnérabilités de sécurité sont découvertes en permanence. Si votre image compte aujourd’hui 78 vulnérabilités de sécurité, cela ne signifie pas qu’elle n’en comptera pas 100 demain matin, lorsque de nouvelles CVE seront signalées et toucheront vos conteneurs en production. C’est pourquoi il est essentiel de surveiller votre registre d’images de conteneurs — celles que vous utilisez pour déployer vos conteneurs — afin de détecter rapidement les problèmes de sécurité et d’y remédier.

Vous pouvez intégrer directement de nombreux registres d’images Docker depuis l’application Snyk. Par exemple, importez des images depuis Docker Hub, ACR, ECR, GCR ou Artifactory : Snyk les analysera régulièrement et vous signalera tout problème de sécurité sur Slack ou par e-mail.

Tableau de bord des projets Snyk affichant une liste consultable de projets Docker, avec le nombre de problèmes de gravité élevée, moyenne et faible.

5. Suivez les consignes de sécurité et les recommandations de production pour créer une image Docker Node.js sécurisée et optimale

Félicitations : vous avez suivi toutes les consignes de sécurité jusqu’ici !

Pour conclure, si vous souhaitez suivre les bonnes pratiques de sécurité pour créer des images Docker optimales pour Node.js et Java, consultez ces ressources :

  1. 10 bonnes pratiques de sécurité Docker — des pratiques de sécurité détaillées à suivre lors de la création d’images de base Docker et de leur téléchargement. Cette ressource présente également la confiance dans le contenu Docker.

  2. Vous développez en Java ? Cette ressource vous sera utile : Docker pour les développeurs Java : 5 conseils pour ne pas compromettre votre sécurité

  3. 10 bonnes pratiques pour conteneuriser des applications web Node.js avec Docker — Si vous développez en Node.js, vous apprécierez ce guide pas à pas qui vous explique comment créer des images de base Docker sécurisées et performantes pour vos applications Node.js.

Commencez à tester et à corriger vos images de conteneurs avec Snyk.

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.