- Ce contenu vise à rappeler l’importance de la sécurité de Kubernetes
- Emplacements de stockage des Secret
- Lorsqu’un utilisateur déclare une ressource via la commande
kubectl, Kubernetes crée le fichier manifeste qui définit cette ressource et le stocke dans etcd
- Lorsqu’un utilisateur déclare une ressource Secret, celle-ci est également stockée dans etcd
- Lorsqu’un utilisateur crée un pod qui lit un Secret via un volume ou une variable d’environnement, le Secret est stocké dans ce pod
- Si l’on compromet etcd, où les Secret sont stockés, ainsi que le pod qui les utilise, il est possible de connaître le mot de passe stocké dans le Secret
- Préparation
- Création d’un cluster avec kubeadm
- Pour l’exercice, création préalable de trois ressources : le Secret
credit-card, le pod app1 et le pod app2
- Piratage d’etcd
- etcd : magasin de données clé-valeur qui stocke l’état du cluster Kubernetes. Toutes les informations déclarées dans Kubernetes y sont stockées. On peut aussi y retrouver les Secret
- 1.1 Retrouver le mot de passe avec
etcdctl
- Consulter le manifeste de
kube-apiserver pour récupérer la certificate authority, la clé publique et la clé privée du serveur etcd
- Retrouver le mot de passe via la commande
etcdctl, qui permet de manipuler etcd plus facilement
- 1.2 Récupération via un accès direct à la base de données etcd
- Identifier le processus où etcd s’exécute, puis parcourir toutes les données de ce processus pour retrouver le mot de passe
ps aux | grep etcd - récupérer le PID d’etcd
ll /proc/<pid>/fd - repérer un fichier lien marqué db
cat /proc/<pid>fd/<db> | grep -A10 -B10 credit-card - retrouver le mot de passe créé au préalable
- Piratage de pod
- Récupération via
kubectl exec
- Avec des permissions appropriées pour interroger Kubernetes, il est possible de récupérer le mot de passe via la commande
kubectl
- Récupération par accès direct au conteneur
- S’il est possible d’utiliser librement les commandes Docker sur le nœud worker, on peut exfiltrer le mot de passe
- Sur le nœud worker où le pod
app1 est planifié, il est possible de trouver le conteneur et d’extraire la liste des variables d’environnement qui y sont enregistrées
crictl pods - trouver l’ID du pod app1
crictl ps - trouver le conteneur correspondant à l’ID du pod
crictl inspect <container id> | grep -A16 env - inspecter le conteneur en détail pour extraire les variables d’environnement
- Récupération avec un ServiceAccount ayant accès au Secret
- Si le ServiceAccount du pod a les droits d’accès au Secret, il est possible de retrouver le mot de passe via un appel API depuis l’intérieur du pod
- Méthodes pour empêcher le piratage décrit ci-dessus
- Suivre le « principe du moindre privilège » et éviter de créer des service accounts avec des permissions inutiles
- Éviter l’exposition des identifiants utilisateur face à des menaces comme l’ingénierie sociale
- Chiffrer etcd via la ressource
EncryptionConfiguration
Aucun commentaire pour le moment.