Je suis sûr que cela vous est déjà arrivé : vous essayez d’assembler un conteneur pour votre usage personnel, vous voulez le rendre plus sûr en utilisant conteneurs non privilégiés Et soudain, vous vous retrouvez pris au piège d'un labyrinthe d'erreurs d'autorisation. C'est frustrant de passer des heures à configurer des dossiers dans le répertoire personnel de l'utilisateur pour finalement découvrir que le conteneur ne peut pas y écrire, ou que lorsqu'il y parvient, les fichiers résultants sur l'hôte sont corrompus. impossible à gérer car elles appartiennent à un utilisateur fantôme.
En réalité, si la conteneurisation a accéléré le déploiement des logiciels, elle a aussi engendré des risques considérables. Selon des données récentes, la grande majorité des images de production contiennent [incompréhensible - possiblement « incompréhensible » ou « incompréhensible »]. vulnérabilités critiquesLa sécurité est donc un pilier non négociable. Il ne s'agit pas seulement d'empêcher les pirates informatiques de nous attaquer, mais aussi de comprendre le fonctionnement du système. isolation du processus pour que nos infrastructures ne deviennent pas une passoire.
Comprendre l'écosystème de sécurité des conteneurs
Pour éviter de deviner les permissions, il faut d'abord savoir ce que l'on protège. L'architecture d'un conteneur est divisée en plusieurs couches critiques. Premièrement, nous avons le image du conteneurqui constitue le plan initial ; s’il est vulnérable, toutes les instances que vous déployez seront non sécurisées. C’est pourquoi il est vital de l’utiliser images de base de confiance et les tenir à jour.
Ensuite, le temps d'exécutionqui sert d'arbitre entre le système d'exploitation hôte et l'application. Si l'environnement d'exécution est obsolète, le risque de évasion du conteneur augmente de façon spectaculaire. À cela, il faut ajouter l'orchestration, telle que Kubernetes, où le contrôle d'accès basé sur les rôles (RBAC) Il s'agit du seul véritable rempart contre l'accès non autorisé à l'API de gestion.
Nous ne pouvons pas oublier le système d'exploitation hôteSi un attaquant parvient à compromettre le noyau du système hôte, il détient les clés de l'ensemble du domaine. La recommandation est claire : utilisez un système d'exploitation minimal afin de réduire la surface d'attaque. Enfin, le réseau est le point d'entrée le plus fréquent ; près de 30 % des violations sont dues à des pannes de connectivité. segmentation du réseau et chiffrement TLS/SSL sont obligatoires.
Le casse-tête des permissions et de l'utilisateur root
Le problème typique des amateurs réside dans la gestion des volumes. On crée un dossier, on le monte, et là, paf !, une erreur. Autorisation refuséeCela se produit car, par défaut, de nombreux conteneurs démarrent en tant que root. Lorsque vous essayez de forcer le UID et GID à 0 Pour les faire correspondre à votre utilisateur hôte, vous créez un pont dangereux. Si le conteneur ne vous permet pas de configurer ces identifiants, vous risquez de perdre un après-midi à essayer de déterminer quel utilisateur interne l'application utilise pour effectuer une opération. chown manuel.
La solution efficace consiste à appliquer la principe du moindre privilègeIl est déconseillé d'exécuter des commandes en tant que superutilisateur (root) sauf en cas d'absolue nécessité. Pour résoudre le problème des fichiers créés par le conteneur et impossibles à supprimer sur l'hôte, il est indispensable de configurer le Dockerfile avec les instructions suivantes : UTILISATEUR, en définissant un utilisateur sans privilèges avant le démarrage de l'application.
Si vous utilisez Podman, le concept de conteneurs sans racine C'est une fonctionnalité native et très utile, mais elle nécessite de comprendre comment les utilisateurs hôtes sont associés aux utilisateurs du conteneur. Pour éviter toute accumulation de permissions, l'application devrait idéalement être conçue pour écrire sur des routes spécifiques et que… cartographie volumique Cela se fait en tenant compte du véritable UID de l'utilisateur qui lance le processus.
Stratégies pour la construction d'images blindées
Si vous voulez mettre fin à la souffrance, vous devez modifier votre façon de construire vos images mentales. Une technique d'une efficacité redoutable consiste à… constructions en plusieurs étapesEn gros, vous utilisez une image lourde avec tous les outils de construction pour générer le binaire, puis vous copiez uniquement ce fichier dans une image finale. extrêmement léger.
Vous pouvez même aller plus loin en utilisant l'image gratterCela crée un conteneur totalement vide : ni shell, ni gestionnaire de paquets, uniquement votre application. Il devient ainsi pratiquement impossible pour un attaquant d’exécuter des commandes malveillantes s’il parvient à s’y introduire. Il n'existe pas d'interpréteur de commandes. disponibles.
Une autre mesure de sécurité consiste à nettoyer l'image de tout binaire disposant de permissions. setuid ou setgidCes autorisations permettent d'exécuter un fichier avec les privilèges de son propriétaire et non de l'utilisateur qui le lance, ce qui ouvre la porte à... escalade des privilègesUne simple commande permettant de rechercher et de supprimer ces éléments lors de la création de l'image peut vous éviter bien des problèmes.
Les dangers du mode privilégié et les capacités de Linux
Parfois, par désespoir de ne pas parvenir à résoudre un problème d'autorisations, nous cédons à la tentation d'utiliser l'indicateur -privilégiéOubliez ça. Le mode privilégié rompt l'isolation du conteneur et vous donne un accès complet aux périphériques de l'hôte. C'est comme confier les clés de votre maison à un inconnu simplement parce qu'il ne sait pas ouvrir le portail.
Au lieu de cela, vous devriez jouer avec le fonctionnalités LinuxDocker attribue un ensemble de permissions par défaut (telles que CAP_CHOWN ou CAP_NET_RAW). Si votre application n'a pas besoin de manipuler le réseau à un niveau bas, l'approche la plus judicieuse est la suivante : éliminer les capacités inutiles et n'ajouter que ceux strictement nécessaires --cap-add.
Pour ceux qui gèrent des environnements plus complexes, il existe plugins d'autorisation comme opa-docker-authz. Ces outils permettent d'intercepter les appels à l'API du démon Docker et de bloquer toute tentative de lancement d'un conteneur en mode privilégié, garantissant ainsi que personne, même par erreur, ne laisse la porte ouverte à l'hôte.
Optimisation et maintenance de l'environnement
Ne vous focalisez pas sur la taille de l'image de 5 Mo lors de l'utilisation d'Alpine Linux si cela engendre des problèmes de compatibilité avec les bibliothèques. Il est parfois préférable d'utiliser une image Debian légèrement plus volumineuse. stabilisé et connu par l'équipe. Ce qui est crucial, c'est la mise en œuvre d'un analyse des vulnérabilités Pipeline CI/CD automatisé pour détecter les CVE avant que l'image n'atteigne la production.
En ce qui concerne le stockage, il empêche l'application d'écrire sur le système de fichiers racine. Configurez le système de fichiers en lecture seule (rootfs) et définit des volumes spécifiques uniquement pour les données qui doivent être conservées. Ceci est non seulement plus sûr, mais impose également une architecture plus propre et sans patrimoinefaciliter la mise à l'échelle horizontale.
Pour les processus planifiés, ne placez pas de tâche cron à l'intérieur du conteneur du site web. La règle d'or est : un processus par conteneurL'approche la plus propre consiste à utiliser l'image de votre application pour lancer un conteneur éphémère qui exécute la tâche puis se détruit, ou à gérer la tâche cron depuis l'hôte en appelant le moteur de conteneur à l'aide de commandes.
La sécurité des conteneurs est un processus continu qui consiste à supprimer l'accès root, à restreindre les capacités du noyau et à retirer les outils inutiles des images de conteneurs. En combinant des utilisateurs non privilégiés avec un renforcement de la sécurité à l'exécution et une surveillance constante, on obtient un environnement où les fonctionnalités ne compromettent pas l'intégrité du système hôte.
Écrivain passionné par le monde des octets et de la technologie en général. J'aime partager mes connaissances à travers l'écriture, et c'est ce que je vais faire dans ce blog, vous montrer toutes les choses les plus intéressantes sur les gadgets, les logiciels, le matériel, les tendances technologiques et plus encore. Mon objectif est de vous aider à naviguer dans le monde numérique de manière simple et divertissante.

