9 bonnes pratiques pour la sécurité des conteneurs dans DevOps
Comprendre la Sécurité des Conteneurs dans un Environnement DevOps
Les conteneurs, piliers du DevOps, ne sont pas une innovation récente. Ils se présentent comme des environnements virtuels isolés, dotés des outils nécessaires pour l'exécution de microservices, incluant des applications de grande envergure.
Imaginez les conteneurs comme des systèmes de conditionnement. Ils permettent aux développeurs de centraliser tout ce qui est essentiel à l'exécution d'une application, des environnements d'exécution aux binaires.
Les conteneurs simplifient le transfert d'applications entre différents environnements (d'une machine locale à un environnement virtuel, ou d'une phase de test à la production), en neutralisant les problèmes liés aux divers logiciels et configurations entre les environnements de développement et de production.
Selon des données, l'orchestration de conteneurs est adoptée par 50% des organisations à l'échelle mondiale. Bien que cette technologie gagne en popularité en raison de ses avantages, les conteneurs mal sécurisés peuvent devenir une porte d'entrée pour des attaques.
CVE Details, source de référence en matière de failles de sécurité, a répertorié 62 vulnérabilités spécifiques à Docker au moment de la rédaction de cet article. Il est donc impératif que les développeurs adoptent des pratiques exemplaires pour garantir la sécurité des conteneurs et le succès des processus DevOps.
Cet article expose le concept de sécurité des conteneurs, identifie les défis et présente des recommandations pour une utilisation sécurisée de cette technologie.
Qu'est-ce que la sécurité des conteneurs?
La sécurité des conteneurs est un processus continu qui applique des protocoles de sécurité (outils et stratégies) pour protéger les conteneurs et leurs environnements contre les menaces.
Les menaces non détectées peuvent compromettre votre application, son infrastructure, ses environnements d'exécution, ses bibliothèques système, son système d'exploitation et son noyau.
Compte tenu de la nature éphémère et dynamique des conteneurs (déploiements et mises à l'échelle), il est crucial d'automatiser la sécurité à chaque étape du cycle de vie du développement logiciel (SDLC).
À lire également : Introduction à Kubernetes Kops pour les débutants
Quels sont les défis de la sécurité des conteneurs ?

Bien que les conteneurs offrent des avantages considérables, comme une livraison plus rapide des logiciels, ils ne sont pas exempts de défis, notamment en raison de leur manque de mécanismes de sécurité intrinsèques. Ils nécessitent une protection proactive.
En effet, les conteneurs accèdent au matériel via un système d'exploitation hébergeur. Un seul conteneur peut ainsi intégrer plusieurs images sous-jacentes, ce qui augmente la surface d'attaque.
Parmi les défis, on note la configuration incorrecte des conteneurs. Les développeurs peuvent oublier de personnaliser les configurations par défaut, ce qui laisse des failles telles que des ports ouverts, des informations d'identification divulguées et des autorisations excessives pour l'exécution (en tant que root). Ces défauts offrent des opportunités aux attaquants.
La vulnérabilité de l'infrastructure est un autre problème. Les packages inclus dans un conteneur (code, bibliothèques, configurations) ou ceux du système d'exploitation peuvent introduire des vulnérabilités. Ces faiblesses peuvent apparaître à différentes étapes du cycle de vie, lors de l'intégration de dépendances externes, de bibliothèques open source ou d'images de conteneurs provenant de registres tiers, et peuvent être exploitées via le réseau et les terminaux.
La visibilité sur les charges de travail des conteneurs est aussi un défi majeur, en raison de leur nature dynamique, ce qui rend difficile la surveillance et l'inspection du comportement. Une meilleure visibilité permettrait de prévenir les intrusions et de réduire le temps de réponse en cas d'incident.
Enfin, la sécurité des conteneurs est compromise si une phase du pipeline CI/CD n'est pas sécurisée. Bien que la sécurité incombe aux développeurs, il est crucial d'assurer la protection à chaque étape du processus de développement pour éviter des problèmes.
Quels outils peuvent résoudre les problèmes de sécurité des conteneurs ?
La sécurité et l'intégrité des solutions d'entreprise peuvent être garanties par l'utilisation d'outils de sécurité dédiés. Ces outils examinent les vulnérabilités et surveillent constamment les systèmes pour détecter les menaces, les erreurs ou toute anomalie.
Qu'ils soient open source ou commerciaux, les outils de sécurité des conteneurs ont un objectif commun : auditer l'infrastructure de conteneurs et rechercher les vulnérabilités et les expositions courantes (CVE).
Voici quelques outils : Pingsafe Editors Choice, Datadog Cloud SIEM, Anchore, Sophos Cloud-Native Security, Bitdefender GravityZone, Sysdig Secure, Aqua Security et RedHat Advanced Cluster Security for Kubernetes.
À lire également : 11 scanners de sécurité des conteneurs pour détecter les vulnérabilités
Les meilleures pratiques pour la sécurité des conteneurs
Malgré les défis mentionnés, voici un aperçu des bonnes pratiques à mettre en œuvre pour optimiser la sécurité des conteneurs à chaque étape du cycle de vie d'une application.
Sécuriser vos images
Les images de conteneurs sont utilisées pour créer des conteneurs. Une configuration erronée ou une action malveillante peut créer des vulnérabilités dans les conteneurs en production. Pour éviter cela, vous pouvez :
- Utiliser des images fiables : Privilégiez les images provenant de sources réputées, en évitant les référentiels publics qui peuvent contenir des logiciels malveillants ou des configurations incorrectes.
- Inclure uniquement les composants nécessaires : Supprimez les composants inutiles à votre application. Par exemple, les binaires "awk" et "sed" présents dans les systèmes UNIX pourraient être supprimés.
- Intégrer votre application dans l'image du conteneur : Incluez l'application dans l'image du conteneur afin de minimiser les menaces potentielles. Une bonne pratique consiste à utiliser un binaire compilé statiquement avec toutes les dépendances nécessaires.
Automatisation des analyses de vulnérabilité et de gestion

L'analyse et la gestion régulières des vulnérabilités des conteneurs et des hôtes aident à détecter les problèmes à toutes les étapes du cycle de vie de l'application.
Il est conseillé d'activer l'analyse du code pour détecter les bugs, ainsi que les tests de sécurité des applications statiques (SAST) pour identifier les vulnérabilités. Une analyse de la composition logicielle (SCA) permet de visualiser les composants open source en générant une nomenclature logicielle qui peut être confrontée aux vulnérabilités connues.
L'analyse d'images permet également de contrôler le contenu et le processus de création des images de conteneurs afin de détecter toute vulnérabilité. Des outils comme Clair permettent de rechercher les vulnérabilités connues. Des tests de sécurité dynamiques (DAST) peuvent également être utilisés pour signaler les risques en fonction du comportement des conteneurs, ainsi que l'analyse de l'hôte pour inspecter les composants (noyau et système d'exploitation) et identifier les configurations incorrectes.
En plus d'intégrer ces mesures dans le cycle de vie continu du conteneur, il est conseillé d'adopter la philosophie du "décalage vers la gauche" en intégrant la sécurité dès le début du cycle de développement. Trivy est un bon outil pour cela.
Sécurisation des registres de conteneurs
Les registres de conteneurs sont une méthode centralisée efficace pour stocker et distribuer des images. Les entreprises peuvent avoir des milliers d'images stockées dans des registres publics ou privés. Plusieurs mesures peuvent être mises en œuvre pour garantir que l'ensemble de l'équipe utilise des images sans vulnérabilité.
Premièrement, le contrôle d'accès utilisateur (pour les registres privés) permet de définir qui peut publier et accéder aux images, empêchant ainsi les modifications et suppressions non autorisées.
Ensuite, la signature des images lie chaque image à son créateur, empêchant toute substitution par une image compromise. Les techniques Docker Content Trust permettent d'ajouter des signatures numériques aux données envoyées et reçues des registres. Enfin, il est important d'analyser régulièrement les images pour détecter toute vulnérabilité.
Surveillance des conteneurs
Des outils d'observabilité sont essentiels pour optimiser la visibilité sur les charges de travail des conteneurs. Ces outils doivent surveiller et tester les vulnérabilités des composants et activer la journalisation en temps réel des événements.
Les outils d'observabilité détectent les menaces en auditant les métriques et les journaux de tous les composants de la pile de conteneurs, et en analysant les anomalies. Ils permettent de corriger rapidement les erreurs de configuration.
Pour collecter les données d'utilisation des ressources, vous pouvez utiliser cAdvisor ou kube-state-metrics. Pour surveiller l'activité des conteneurs et les performances des clusters, Grafana ou Prometheus peuvent être utilisés.
Pour analyser le trafic réseau entre les conteneurs, Wireshark ou tcpdump sont des outils utiles. Si vous utilisez un service Kubernetes géré comme AKS, Azure Monitor est idéal pour suivre les ressources et les menaces.
De plus, Azure Log Analytics peut collecter et analyser vos ressources AKS. Pour Amazon EKS, Amazon CloudTrail est recommandé pour la journalisation et la surveillance, et Amazon Cloud Watch pour la surveillance.
Mise en œuvre de la sécurité réseau
Les mesures de contrôle de la sécurité réseau sont essentielles pour protéger les conteneurs contre les accès non autorisés. La segmentation du réseau permet d'isoler les conteneurs, en limitant leur accès aux seuls services nécessaires.
Si vous exécutez vos applications sur Kubernetes, vous pouvez utiliser les stratégies réseau K8s pour configurer le trafic entrant et sortant dans les clusters, en limitant l'accès à des pods spécifiques en fonction des étiquettes.
La sécurité de la couche de transport (TLS) peut être utilisée pour la communication entre pods. Les techniques TLS ou SSL peuvent être utilisées pour sécuriser les communications entre le serveur API et les autres composants. Les équilibreurs de charge sont utiles pour limiter le trafic entrant dans vos clusters.
Pour les microservices, vous pouvez assurer un trafic sécurisé via des outils de maillage de services tels que Meshery ou Linkerd. Enfin, sécurisez votre réseau si vous utilisez un fournisseur cloud pour héberger vos clusters.
Si vous utilisez Azure Kubernetes Service (AKS), les groupes de sécurité réseau (NSG) sont utilisés pour la gestion du trafic. Pour Amazon Elastic Kubernetes Service (EKS), les groupes de sécurité Amazon Virtual Private Cloud (VPC) sont la meilleure solution.
Réduction des attaques de surface
Minimiser la surface d'attaque augmente la vitesse de service et réduit le risque de failles de sécurité.
En utilisant une construction en plusieurs étapes, il est possible de créer des images légères avec une petite surface d'attaque, améliorant ainsi le temps de démarrage et les performances. Vous pouvez utiliser Alpine Linux, BusyBox ou Tiny Core Linux pour Linux.
Pour Ubuntu, Ubuntu Minimal est une option. Scratch, une image Docker spéciale, peut également être utilisée pour créer des images minimalistes dès le départ.
Limitation des privilèges de conteneur
Le principe est d'accorder le minimum d'autorisations nécessaires pour effectuer une tâche. Lorsque les conteneurs sont exécutés en tant que root, un utilisateur dispose de nombreux privilèges, comme l'installation de packages ou des droits de lecture/écriture sur le système d'exploitation.
En cas de compromission, les attaquants pourraient tirer profit de l'augmentation des privilèges d'exécution du conteneur. Deux solutions sont possibles : exécuter les conteneurs en mode sans racine ou limiter les capacités du noyau LINUX à celles nécessaires à la charge de travail du conteneur.
Gérer les secrets en toute sécurité

Vos fichiers de configuration et de Docker ne doivent pas contenir de secrets, comme les certificats, mots de passe, clés API et jetons. Bien qu'il s'agisse d'une pratique recommandée, ces secrets sont souvent codés en dur dans le processus de génération ou dans les images de code source.
Dans de tels cas, les données sensibles entrent dans les conteneurs et sont mises en cache dans des couches intermédiaires, même après la suppression des conteneurs. Pour éviter cela, il est préférable d'utiliser une solution de gestion des secrets, comme AWS Secrets Manager et Vault, pour stocker et gérer les identifiants.
Responsabiliser votre équipe

Enfin, il est essentiel de former votre équipe aux bonnes pratiques de sécurité, afin qu'elle puisse identifier et répondre aux menaces.
Un bon moyen est d'intégrer la sécurité des conteneurs aux processus d'intégration de votre équipe. La formation pratique, l'apprentissage continu et les évaluations de sécurité régulières permettent à votre équipe DevOps de rester à jour en matière de sécurité.
Dernières pensées
La sécurité des conteneurs est un processus continu et crucial dans le cycle de développement logiciel. Il est important d'intégrer la sécurité dans tous les aspects : code de l'application, environnement d'exécution du conteneur, système d'exploitation hôte et infrastructure réseau.
Cela peut être réalisé en suivant un plan stratégique, en vérifiant les conteneurs et en utilisant uniquement ceux provenant de sources fiables. Le durcissement des conteneurs permet de s'assurer qu'ils ne disposent que des services nécessaires. Il est important de mettre en place des méthodes de journalisation faciles à utiliser via des outils de surveillance. La segmentation du réseau permet de séparer les conteneurs de l'infrastructure globale.
Signez toujours vos images pour valider l'entrée et la sortie des données via vos services. Effectuez des analyses et des tests d'intrusion réguliers pour identifier les vulnérabilités et prenez des mesures correctives immédiates. Enfin, restez toujours à jour avec les dernières pratiques en matière de sécurité.
Ensuite, découvrez comment automatiser la sécurité.