Dans cet article, je vais te présenter plusieurs outils pour améliorer la sécurité de Kubernetes, au niveau de la grappe et des applications encapsulées.
Le 29 octobre 2022, j'ai assisté à une présentation sur la sécurité des installations Kubernetes (prononciation) au Hackfest de Québec, par Magno Logan, qui travaille pour l'entreprise de cybersécurité Trend Micro. Je vais ici te faire un résumé de la présentation accompagné de notes additionnelles. Je veux rendre le sujet le plus accessible possible si tu débutes comme moi !
J'ai commencé à utiliser Kubernetes, plus précisément OpenShift, dans le cadre de mon contrat de professionnel de recherche à l'Université Laval. Notre projet consiste à produire une plateforme d'imagerie médicale sous forme d'un lac de données structurées pour des applications en apprentissage automatique ou en simulation stochastique.
🌘 C'est quoi, justement, Kubernetes ?
Commençons par la base: le conteneur. Un conteneur est un système de fichiers qui représente une version allégie d'un système d'exploitation Linux, mais avec juste ce qu'il faut pour exécuter un seul logiciel. C'est un peu comme une archive Zip tout-en-un, mais pour un logiciel de serveur.
Pour créer et exécuter les conteneurs individuellement, on utilise généralement Docker. Pour en faire fonctionner plusieurs ensemble, on utilise Docker Compose, qui permet de créer un réseau informatique virtuel entre les différents conteneurs. Mais, lorsque vient le temps de mettre plusieurs de ces applications ensemble, ça devient assez complexe.
Imaginons maintenant des certaines d'applications à coordonner ! C'est là qu'intervient Kubernetes.
"Helm" by macieklew is licensed under CC BY-SA 2.0.
Kubernetes, c'est un peu le capitaine d'une flotte de navires. Chaque navire représente un noeud de calcul, ou un serveur. Dans chaque noeud, il y a des déploiements qui contiennent des capsules d'un ou plusieurs conteneurs et des réseaux pour les relier ensemble. Chaque capsule peut aussi avoir ses propres fichiers de configuration, des secrets tels que des clés d'API ou des mots de passe, ainsi que du stockage.
Tous les composantes d'un même projet sont sous un même espace de noms. Les espaces de noms peuvent être sur un ou plusieurs noeuds de calculs. Leur principale propriété est d'être isolés logiquement les uns des autres. C'est à dire que pour utiliser un service qui se trouve dans un autre espace de nom, il faut passer par le réseau Internet. On pourrait associer un espace de nom à un compte client dans un contexte d'hébergement partagé, par exemple.
Une dernière chose que permet Kubernetes, c'est le passage à l'échelle. Lorsqu'il y a des pics de demande, Kubernetes peut déployer de nouvelles copies d'images d'applications automatiquement.
🌘 L'API de Kubernetes
L'ensemble de Kubernetes est contrôlé de deux façons. La première, c'est au travers de fichiers de configuration YAML. La seconde, c'est par une interface de programmation (API). Cette interface est accessible via des utilitaires en ligne de commandes tels que kubectl, ou au travers de divers langages de programmation, tel que Python. Les détails se trouvent sur cette page: https://kubernetes.io/docs/concepts/overview/kubernetes-api/
Le plan de contrôle est essentiellement un serveur d'API entouré de différentes composantes:
-
kube_controler
-
cloud_controler
-
etcd
-
scheduler
Les capsules ont aussi des composantes:
-
kubelet
-
kube_proxy
L'ensemble de ces composantes permettent l'orchestration des différentes applications sur la grappe Kubernetes. Parmi celle-ci, il y a le serveur API et la base de données etcd qui vont être particulièrement ciblées par des attaques.
L'API contient plusieurs objets, qui permettent de manipuler les noeuds, les espaces de noms, les déploiements, les ensembles de réplication, les capsules et les conteneurs. Voici les noms utilisés à l'intérieur:
-
Node
-
Namespace
-
Deployment
-
ReplicaSet
-
Pod
-
Container
🌘 Analyser l'état de la sécurité de Kubernetes
Il existe plusieurs ressources pour évalier l'état de la sécurité de Kubernetes, incluant la grappe de calcul et les applications hébergées dans des capsules.
Voici deux ressources assez complète incluant de la documentation et du matériel de formation:
-
Awesome Kubernetes (K8s) Security: liste assemblée par Magno Logan
-
MITRE ATT&CK® Matrix for Enterprise: Matrice développée
par MITRE, une organisation à but non-lucratif
🌘 Vulnérabilités sur des capsules
Une des principaux moyens d'attaquer une grappe Kubernetes est d'entrer dans une capsule, puis de faire des mouvements latéraux vers d'autres capsules appartenant au même espace de noms. Cette tactique est notamment utilisée pour accéder à des ressources de calcul permettant de miner des cryptoactifs.
Un des moyens utilisés pour identifier des grappes potentiellement vulnérable, c'est le moteur de recherche Shodan. Cet outil spécialisé permet de savoir quels services sont installés et accessibles depuis Internet sur tout serveur qui y est connecté. Les identifiants recherchés sont:
-
Kube API Server
-
Kubernetes
Les types de vulnérabilités recherchées sont au niveau des applications web, ou encore de tableaux de bords exposés publiquement, comme c'est le cas chez les principaux fournisseurs infonuagiques Amazon (EKS), Google (GKS) et Azure (AKS). L'objectif est de réussir à obtenir un accès au terminal de la capsule (shell).
Voici quelques outils qui peuvent détecter ces vulnérabilités:
-
kube-hunter par Aqua Security. Il vérifie 38 vulnérabilités et problèmes de configuration courants
-
Regarder les variables d'environnement:
env | grep -i kube
- Regarder les jetons de comptes de service:
/var/run/secrets/kubernetes.io/
- amicontainerd par Genuine Tools, permet de regarder à l'intérieur des containers pour capturer les appels d'exécution
🌘 Vulnérabilités sur la grappe Kubernetes
Il existe quelques outils pour détecter des vulnérabilités au niveau des grappes Kubernetes:
-
CIS Kubernetes Benchmark (manual)
-
kube-bench par Aqua Security
Il y a aussi plusieurs outils pour scanner les images de conteneurs au repos:
-
Clair Scanner: Va utiliser les capacités de l'outil Clair installé sur les hébergeurs d'images tels que Docker Hub ou Quay.io
-
Docker Scan: Outil natif fourni avec Docker (aussi appelé Docker Scout)
-
SmartCheck: Outil développé par Trend Micro et utilisable via GitHub Actions
-
Snyk: Un outil général pour détecter des vulnérabilités dans des applications infonuagiques, dont les conteneurs.
-
Trivy (Aqua Security)
Les outils précédents ne pourront pas, par contre, détecter les vulnérabilités qui pourraient avoir été insérées après le déploiement de l'image. Nous avons donc aussi besoin d'outils de détection à l'exécution en temps réel:
-
Falco: permet de surveiller les évènements du noyau Linux utilisé depuis un conteneur. C'est un projet initialement créé par Sysdig, une entreprise de suivi de performance de grappes Kubernetes. Il est maintenant accueilli par la CNCF, la fondation responsable de la normalisation des applications conteneurisées.
-
Sigma Rules: Un outil pour définir des règles personnalisées pour les systèmes de suivi d'incidents de sécurité (SIEM)
🌘 Configuration pour améliorer la sécurité de Kubernetes
Je vais lister ici plusiers pistes à valider pour améliorer la sécurité de Kubernetes, autant au niveau des applications que de la grappe.
🌘 Applications
-
Diminuer les ressources demandées par application, autant au niveau de la mémoire que de la capacité de calcul processeur. En plus de diminuer les coûts, ça limite les possibilités d'exploitation de la capsule pour, par exemple, miner des cryptoactifs.
-
Quelques paramètres:
-
Ne pas autoriser l'escalade de privilèges
-
Système de fichier racine en lecture seule
-
Exécution avec un utilisateur non-root
-
-
Mettre en place un outil de sécurité associé aux permissions d'exécution:
-
Mettre en place des contrôleurs d'admission:
- C'est une caractéristique propre à Kubernetes, disponible sous le
nom Admission Controllers
- C'est une caractéristique propre à Kubernetes, disponible sous le
-
Utiliser les niveaux de sécurité pour les capsules (Pod Security Standards):
-
Accès privilégié: permet l'escalade de privilèges
-
Accès de base: niveau par défaut, prévient la plupart des escalades de privilèges
-
Accès restreint: suit les meilleures pratiques actuelles
-
-
Mettre en place une politique d'accès RBAC
- Définir des rôles par espace de noms (Roles ), des rôles pour la grappe (Cluster Roles) et des bindings. Faire attention parce qu'il est possible de donner beaucoup trop de permissions.
🌘 etcd
etcd, C'est la base de données utilisée par Kubernetes. Elle n'est pas chiffrée au repos et son contenu est accessible en format texte. On peut activer le chiffrement au repos, mais elle sera moins performante.
Pour protéger etcd, le meilleur moyen est d'appliquer des règles de réseautique pour restreindre au maximum son accès.
🌘 La réseautique de Kubernetes
On peut sécuriser les communications entre les différentes capsules en utilisant des politiques de réseau. Elles peuvent être configurées lors des déploiements.
-
Éditeur Cilium pour les Network policies
Sans de bonnes politique réseau dans une grappe kubernetes, une seule application attaquée peut donner un accès complet au réseau à l'intérieur de la grappe, y compris au plan de contrôle.
Le service EKS d'Amazon ne permet pas de configurer des Network Policies. Cependant, il offre l'option de créer des groupes de sécurité pour les capsules. C'est aussi possible de configurer une surveillance accrue en utilisant CloudWatch.
🌘 Pour conclure: niaise pas avec la sécurité de Kubernetes
Voici quelques conseils de base pour conclure cet article:
-
Assure-toi de mettre à jour Kubernetes le plus souvent possible
-
N'utilise pas de compte administrateur pour interagir avec Kubernetes
-
Utilise des offres gérées, soit avec des fournisseurs infonuagiques, soit avec des offres de fournisseurs avec service tel que OpenShift ou Rancher.
-
Utilise les CIS Security Benchmarks