Skip to main content

De la sécurité des images à celle des workloads

Écrit par

31 octobre 2019

0 minutes de lecture

Voici la troisième partie d’une série en quatre volets consacrée à la création d’une stratégie AppSec pour Kubernetes. Retrouvez la première partie ici et la deuxième partie ici.


Dans l’un de nos précédents articles, nous avons évoqué le transfert du packaging des applications aux développeurs, à mesure que les entreprises adoptent les conteneurs. Mais le packaging n’est pas le seul domaine qui passe de l’administration système au développement : c’est aussi le cas de la gestion de la configuration.

Kubernetes et les défis de la configuration

L’API Kubernetes est une abstraction puissante pour créer des systèmes cloud natifs. Mais cette API riche a eu pour conséquence inattendue d’amener les développeurs à rédiger manuellement de grandes quantités de configuration, principalement en YAML. Prenons par exemple cette description d’un déploiement Kubernetes :

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

Ces fichiers de configuration sont souvent stockés dans des systèmes de gestion de code source, parfois avec le code de l’application, parfois séparément. À eux seuls, GitHub en héberge publiquement plus de 1,5 million.

Une configuration non sécurisée par défaut

Malheureusement, l’étendue des options de configuration de Kubernetes ouvre la voie à plusieurs problèmes de sécurité. La présentation The Path Less Travelled d’Ian Coldwater et Duffie Cooley résume bien certains problèmes liés aux paramètres par défaut de Kubernetes du point de vue de la sécurité. Voici quelques propriétés de configuration courantes qui restent souvent non configurées : 

Limites de CPU et de mémoire

Définir des limites de CPU et de mémoire adaptées présente des avantages opérationnels et de sécurité. Dans le contexte de la sécurité, il s’agit de limiter l’impact potentiel des attaques par déni de service sur l’application, plutôt que sur le nœud, voire sur l’ensemble du cluster.

runAsNonRoot

Par défaut, les conteneurs s’exécutent en tant qu’utilisateur root. Cette propriété l’empêche au niveau du runtime du conteneur. Ainsi, si un attaquant parvient à exécuter une commande dans le contexte du conteneur, ses permissions restent limitées.

readOnlyRootFilesystem

Par défaut, le système de fichiers monté pour le conteneur est accessible en écriture. Un attaquant qui compromet le conteneur peut donc également écrire sur le disque, ce qui facilite certaines attaques. Si vos conteneurs sont sans état, vous n’avez pas besoin d’un système de fichiers accessible en écriture.

Capacités

Les capacités Linux contrôlent à bas niveau les actions des processus dans le conteneur, de l’écriture sur le disque à la communication sur le réseau. Il est possible de supprimer toutes les capacités, puis d’ajouter celles qui sont nécessaires, mais cela suppose de bien connaître la liste des capacités.

Ces propriétés de configuration ne sont pas des vulnérabilités en soi, mais elles facilitent généralement l’exploitation d’une vulnérabilité dans une image. En cas d’exploitation, elles peuvent amplifier les dégâts. Votre niveau de risque ne dépend pas uniquement des vulnérabilités présentes, mais aussi du contexte dans lequel elles se trouvent.

La configuration tout au long du SDLC

À mesure que les responsabilités en matière de sécurité passent aux développeurs, comme c’est le cas pour les vulnérabilités des images, il est intéressant d’examiner les défis liés à la sécurisation de la configuration à travers le prisme du SDLC. 

Étape

Description

Retour d’information

Exhaustivité

En local

Outils locaux aidant à rédiger une configuration sécurisée, de l’intégration aux workflows de tests unitaires aux suggestions dans les IDE. Ils résolvent toutefois des problèmes individuels plutôt que ceux d’une équipe ou d’une organisation.

Rapide

Faible

CI/CD

Échouer rapidement lors du build si des fichiers de configuration sont potentiellement non sécurisés ou ne respectent pas certaines règles internes. Il faut toutefois mettre en place cette vérification dans tous les pipelines concernés.

Rapide

Variable

Dépôt

La configuration est aujourd’hui principalement stockée dans un système de gestion de code source (à noter toutefois que Helm 3 permet de stocker des images dans des registres OCI compatibles). Comment aider les développeurs à rédiger une configuration sécurisée entre l’envoi des pull requests et la création des branches ?

Moyen

Moyen

Admission

Les contrôleurs d’admission Kubernetes bloquent les requêtes API et permettent d’empêcher les configurations non sécurisées interdites.

Les clusters peuvent toutefois appliquer des règles différentes, et cela concerne les nouvelles requêtes, pas les workloads existants.

Lent

Élevé

Production

L’API Kubernetes représente la configuration en cours d’exécution : c’est là qu’il faut accorder le plus d’attention à la configuration. Mais les problèmes à ce stade peuvent affecter des workloads réels, et les cycles de retour d’information nécessaires pour les corriger peuvent être longs.

Lent

Élevé

Comme pour les tests des images de conteneurs, les compromis varient selon les étapes. Tester à une seule étape peut permettre d’obtenir rapidement un retour d’information, mais avec moins de contrôle, ou inversement. De même, comme pour les vulnérabilités des images, un processus de sécurité moderne et mature implique probablement de tester la configuration à plusieurs étapes.

Conclusion

Nos applications ne se limitent pas aux images utilisées pour les packager : elles comprennent aussi la configuration nécessaire à leur exécution. Jusqu’ici, nous avons considéré ces deux domaines comme distincts en matière de sécurité. Pourtant, dans la plupart des cas, les discussions sur la sécurité des conteneurs pour les développeurs se sont concentrées exclusivement sur les vulnérabilités des images. À mesure que la responsabilité de la sécurité des applications passe aux équipes de développement, il devient de plus en plus important de comprendre le lien entre les vulnérabilités des images et la configuration, et de disposer d’outils pour sécuriser les deux.

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.

Lire la suite

feature insights announcement
Blog

Compromission de la chaîne d’approvisionnement Node-gyp : un ver npm à propagation autonome dissimulé dans binding.gyp

Un nouveau ver npm détourne binding.gyp pour déclencher node-gyp lors de l’installation et permettre à des packages malveillants d’exécuter du code sans scripts de cycle de vie. Il vole des identifiants, s’installe durablement sur GitHub et se propage de mainteneur en mainteneur.

Article

Publication de versions malveillantes de node-ipc sur npm à la suite d’une compromission présumée du compte d’un mainteneur

Le 14 mai 2026, plusieurs versions malveillantes du célèbre package npm node-ipc ont été publiées sur le registre npm. Les informations publiques disponibles identifient actuellement node...

blog feature toolkit
Blog

Publication malveillante du paquet elementary-data sur PyPI : des identifiants cloud dérobés à des ingénieurs data

Des attaquants ont exploité une vulnérabilité d’injection de script dans GitHub Actions pour publier une version malveillante de l’interface de ligne de commande Python elementary-data (v0.23.3). Elle intégrait une porte dérobée volant des identifiants, qui ciblait les profils dbt, les clés des fournisseurs cloud et les secrets SSH dans les environnements d’ingénierie des données.