Skip to main content

5 bonnes pratiques pour sécuriser les conteneurs

Écrit par

19 juillet 2022

0 minutes de lecture

La sécurité des conteneurs est essentielle, car l’image de conteneur regroupe tous les composants qui finiront par exécuter votre application. Si des vulnérabilités se cachent dans l’image, les risques et les conséquences potentielles des problèmes de sécurité en production augmentent. Il est donc également essentiel de surveiller votre environnement de production. Même si vous créez des images sans vulnérabilités ni privilèges élevés, vous devez continuer à surveiller l’activité à l’exécution.

En résumé, voici cinq étapes clés pour créer une image de conteneur sécurisée :

  1. Sécurisez votre code et ses dépendances

  2. Commencez par une image de base minimale provenant d’une source fiable

  3. Gérez toutes les couches entre votre image de base et votre code

  4. Gérez les accès

  5. Sécurisez l’infrastructure des conteneurs

1. Sécurisez votre code et ses dépendances

La conteneurisation permet de livrer plus rapidement des applications cloud-native, ce qui est probablement l’une des raisons pour lesquelles vous créez des conteneurs. Elle a élargi la notion de code applicatif, mais le code reste l’élément sur lequel les développeurs exercent le contrôle le plus direct. Les dépendances open source peuvent facilement représenter une part bien plus importante que le code propriétaire. Il est donc important de mettre en place l’analyse intégrée avec des outils d’analyse de la composition logicielle (SCA) et de tests statiques de sécurité des applications (SAST) afin d’automatiser l’analyse du code et des dépendances. Vous pouvez également analyser les conteneurs pour détecter les problèmes directement dans les commits et les dépôts Git, une approche qui s’intègre probablement mieux au processus de développement.

2. Commencez par une image de base minimale provenant d’une source fiable

Une taille réduite favorise la portabilité et accélère les téléchargements, tout en limitant le nombre d’éléments susceptibles de contenir des vulnérabilités. Dans l’idéal, chaque image de conteneur ne devrait inclure que votre code et le minimum de paquets supplémentaires nécessaires à l’exécution de l’application. En pratique, vous aurez toutefois un grand nombre d’applications et devrez trouver un compromis pour gérer vos images de conteneurs.

De nombreux fournisseurs fiables hébergent des images de base pour conteneurs. Docker Hub est de loin le plus populaire, avec plus de 3,8 millions d’images disponibles, plus de 7 millions de dépôts et environ 11 milliards de téléchargements par mois. Certaines sont des images officielles Docker, publiées par Docker sous la forme d’une sélection de dépôts open source Docker et de solutions prêtes à l’emploi. Docker propose également des images de haute qualité, directement gérées par des éditeurs vérifiés. Les recommandations de Docker à l’intention de ces éditeurs vérifiés constituent un excellent point de départ pour définir vos propres bonnes pratiques en matière d’images de conteneurs.

Il est facile de trouver sur Docker Hub des images publiques adaptées à vos besoins. Il est toutefois important de vérifier leur provenance : proviennent-elles du programme Docker Official Images, ou pouvez-vous vérifier leur source et leur contenu à l’aide d’un outil comme Notary pour contrôler les signatures numériques et bénéficier ainsi d’un certain niveau d’assurance qualité ?

3. Gérez toutes les couches entre l’image de base et votre code

Les images de base exigent une attention particulière : en créant votre propre image à partir d’elles, vous héritez de tout ce qu’elles contiennent. Même si vous partez d’une image allégée, vous devrez probablement ajouter des outils et des bibliothèques, en plus de votre code et des installations nécessaires au bon fonctionnement de l’application. Tous ces éléments doivent être surveillés afin de détecter les vulnérabilités.

La bonne nouvelle, c’est que vous pouvez contrôler directement ces couches intermédiaires. Il est toutefois important de déterminer où concentrer vos efforts lors du développement, des tests et du déploiement en production. Vous aurez peut-être besoin d’outils différents à chaque étape, mais à mesure que les images se rapprochent de la production, supprimez tout ce qui n’est pas absolument nécessaire.

En partant d’une image de base minimale et en ajoutant uniquement les outils nécessaires, vous pourrez facilement les supprimer plus tard : il vous suffira de les retirer du Dockerfile et de reconstruire l’image, ou d’utiliser des compilations en plusieurs étapes pour regrouper toutes ces étapes dans un processus de compilation automatisé. Vous pourriez également découvrir des vulnérabilités dans les outils et les paquets de prise en charge installés dans une couche intermédiaire, mais les ignorer sans risque si les images de production n’incluent pas ces éléments supplémentaires. Consultez notre article de blog pour découvrir d’autres bonnes pratiques en matière de compilations en plusieurs étapes.

4. Gérez les accès

Dans le contexte des conteneurs, l’accès désigne la capacité d’un utilisateur donné à effectuer une opération précise sur une ressource de conteneur donnée. Les activités courantes relèvent généralement des opérations de création, de lecture, de mise à jour ou de suppression (CRUD). Les modalités de gestion des accès dépendent de la plateforme de conteneurs. Dans Kubernetes, par exemple, les utilisateurs se trouvent à l’extérieur du cluster : les administrateurs doivent donc gérer les identités hors du cluster, au moyen de certificats TLS, d’OAuth2 ou d’autres méthodes d’authentification.

Les secrets et les accès réseau doivent respecter le principe du moindre privilège. L’accès administrateur doit être limité à la création de l’infrastructure. Pour éviter qu’un conteneur n’accède à l’ensemble de vos ressources, attribuez des rôles et des responsabilités spécifiques aux conteneurs, puis utilisez des outils pour faciliter, appliquer et surveiller ces rôles.

5. Sécurisez l’infrastructure des conteneurs

En plus de sécuriser l’image de conteneur ou le conteneur en cours d’exécution, vous devez également gérer la pile d’infrastructure nécessaire à leur exécution. Cela commence par un registre de conteneurs comme Docker Hub et va jusqu’à l’orchestration en production avec Kubernetes.

Les registres de conteneurs sont conçus pour favoriser la collaboration en offrant un espace sécurisé où stocker et partager des conteneurs. Ils peuvent néanmoins introduire des vulnérabilités, des logiciels malveillants et des secrets exposés. Ils intègrent souvent des fonctionnalités de sécurité ; vous devez toujours utiliser un protocole de sécurité tel que TLS pour vous connecter à un registre. De même, Kubernetes comprend des outils permettant de créer et d’appliquer des contrôles de sécurité au niveau du cluster et du réseau. Consultez notre article sur la sécurité des registres de conteneurs pour en savoir plus.

Les conteneurs doivent toujours s’exécuter sur un système ou un service cloud sécurisé. Si vous utilisez un service, les contrôles d’accès basés sur les rôles (RBAC) doivent être utilisés pour accéder au registre.

Autre point important : les attaquants concentrent leur attention plus tôt dans le pipeline CI/CD. Ne négligez donc pas la sécurisation des premières étapes du développement. Lorsque vous créez des applications et des conteneurs, il est important d’analyser le code avant de l’utiliser dans une application et avant le déploiement. Enfin, veillez à appliquer le principe du moindre privilège (POLP) et à automatiser les contrôles de sécurité et les mesures de contrôle au sein du pipeline de développement.