Kubernetes Basics
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Lâauteur original de cette page est Jorge (lisez son article original ici)
Architecture & Notions de base
Que fait Kubernetes ?
- Permet dâexĂ©cuter des conteneurs dans un moteur de conteneurs.
- La planification permet une mission efficace des conteneurs.
- Maintient les conteneurs en vie.
- Permet les communications entre conteneurs.
- Permet des techniques de déploiement.
- GĂšre des volumes dâinformations.
Architecture

- Node : systĂšme dâexploitation avec pod ou pods.
- Pod : enveloppe autour dâun conteneur ou de plusieurs conteneurs. Un pod ne doit contenir quâune seule application (donc gĂ©nĂ©ralement, un pod exĂ©cute juste 1 conteneur). Le pod est la maniĂšre dont Kubernetes abstrait la technologie des conteneurs en cours dâexĂ©cution.
- Service : Chaque pod a 1 adresse IP interne provenant de la plage interne du nĆud. Cependant, il peut Ă©galement ĂȘtre exposĂ© via un service. Le service a Ă©galement une adresse IP et son objectif est de maintenir la communication entre les pods, donc si lâun meurt, le nouveau remplacement (avec une adresse IP interne diffĂ©rente) sera accessible exposĂ© Ă la mĂȘme adresse IP du service. Il peut ĂȘtre configurĂ© comme interne ou externe. Le service agit Ă©galement comme un Ă©quilibreur de charge lorsque 2 pods sont connectĂ©s au mĂȘme service.
Lorsque un service est créé, vous pouvez trouver les points de terminaison de chaque service en exĂ©cutantkubectl get endpoints - Kubelet : agent principal du nĆud. Le composant qui Ă©tablit la communication entre le nĆud et kubectl, et ne peut exĂ©cuter que des pods (via lâAPI server). Le kubelet ne gĂšre pas les conteneurs qui nâont pas Ă©tĂ© créés par Kubernetes.
- Kube-proxy : est le service chargĂ© des communications (services) entre lâapiserver et le nĆud. La base est un IPtables pour les nĆuds. Les utilisateurs les plus expĂ©rimentĂ©s pourraient installer dâautres kube-proxies dâautres fournisseurs.
- Sidecar container : Les conteneurs sidecar sont les conteneurs qui doivent sâexĂ©cuter avec le conteneur principal dans le pod. Ce modĂšle sidecar Ă©tend et amĂ©liore la fonctionnalitĂ© des conteneurs actuels sans les modifier. De nos jours, nous savons que nous utilisons la technologie des conteneurs pour envelopper toutes les dĂ©pendances nĂ©cessaires au fonctionnement de lâapplication partout. Un conteneur ne fait quâune seule chose et le fait trĂšs bien.
- Processus maĂźtre :
- Api Server : Câest la maniĂšre dont les utilisateurs et les pods communiquent avec le processus maĂźtre. Seules les requĂȘtes authentifiĂ©es doivent ĂȘtre autorisĂ©es.
- Scheduler : La planification fait rĂ©fĂ©rence Ă sâassurer que les Pods sont associĂ©s aux NĆuds afin que Kubelet puisse les exĂ©cuter. Il a suffisamment dâintelligence pour dĂ©cider quel nĆud a le plus de ressources disponibles et attribuer le nouveau pod Ă celui-ci. Notez que le planificateur ne dĂ©marre pas de nouveaux pods, il communique simplement avec le processus Kubelet en cours dâexĂ©cution Ă lâintĂ©rieur du nĆud, qui lancera le nouveau pod.
- Kube Controller manager : Il vĂ©rifie les ressources comme les ensembles de rĂ©plicas ou les dĂ©ploiements pour vĂ©rifier si, par exemple, le nombre correct de pods ou de nĆuds est en cours dâexĂ©cution. En cas de pod manquant, il communiquera avec le planificateur pour en dĂ©marrer un nouveau. Il contrĂŽle la rĂ©plication, les jetons et les services de compte pour lâAPI.
- etcd : Stockage de donnĂ©es, persistant, cohĂ©rent et distribuĂ©. Câest la base de donnĂ©es de Kubernetes et le stockage clĂ©-valeur oĂč il conserve lâĂ©tat complet des clusters (chaque changement est enregistrĂ© ici). Des composants comme le Scheduler ou le Controller manager dĂ©pendent de ces donnĂ©es pour savoir quels changements ont eu lieu (ressources disponibles des nĆuds, nombre de pods en cours dâexĂ©cutionâŠ)
- Cloud controller manager : Câest le contrĂŽleur spĂ©cifique pour les contrĂŽles de flux et les applications, câest-Ă -dire : si vous avez des clusters dans AWS ou OpenStack.
Notez quâil peut y avoir plusieurs nĆuds (exĂ©cutant plusieurs pods), il peut Ă©galement y avoir plusieurs processus maĂźtres dont lâaccĂšs Ă lâApi server est Ă©quilibrĂ© et leur etcd synchronisĂ©.
Volumes :
Lorsquâun pod crĂ©e des donnĂ©es qui ne doivent pas ĂȘtre perdues lorsque le pod disparaĂźt, elles doivent ĂȘtre stockĂ©es dans un volume physique. Kubernetes permet dâattacher un volume Ă un pod pour persister les donnĂ©es. Le volume peut ĂȘtre sur la machine locale ou dans un stockage distant. Si vous exĂ©cutez des pods sur diffĂ©rents nĆuds physiques, vous devez utiliser un stockage distant afin que tous les pods puissent y accĂ©der.
Autres configurations :
- ConfigMap : Vous pouvez configurer des URLs pour accĂ©der aux services. Le pod obtiendra des donnĂ©es dâici pour savoir comment communiquer avec le reste des services (pods). Notez que ce nâest pas lâendroit recommandĂ© pour enregistrer des identifiants !
- Secret : Câest lâendroit pour stocker des donnĂ©es secrĂštes comme des mots de passe, des clĂ©s API⊠encodĂ©es en B64. Le pod pourra accĂ©der Ă ces donnĂ©es pour utiliser les identifiants requis.
- Deployments : Câest ici que les composants Ă exĂ©cuter par Kubernetes sont indiquĂ©s. Un utilisateur ne travaillera gĂ©nĂ©ralement pas directement avec des pods, les pods sont abstraits dans des ReplicaSets (nombre de mĂȘmes pods rĂ©pliquĂ©s), qui sont exĂ©cutĂ©s via des dĂ©ploiements. Notez que les dĂ©ploiements sont pour des applications sans Ă©tat. La configuration minimale pour un dĂ©ploiement est le nom et lâimage Ă exĂ©cuter.
- StatefulSet : Ce composant est spĂ©cifiquement destinĂ© aux applications comme les bases de donnĂ©es qui ont besoin dâaccĂ©der au mĂȘme stockage.
- Ingress : Câest la configuration utilisĂ©e pour exposer lâapplication publiquement avec une URL. Notez que cela peut Ă©galement ĂȘtre fait en utilisant des services externes, mais câest la maniĂšre correcte dâexposer lâapplication.
- Si vous implĂ©mentez un Ingress, vous devrez crĂ©er des Ingress Controllers. LâIngress Controller est un pod qui sera le point de terminaison qui recevra les requĂȘtes et les vĂ©rifiera et les Ă©quilibrera vers les services. LâIngress Controller enverra la requĂȘte en fonction des rĂšgles dâingress configurĂ©es. Notez que les rĂšgles dâingress peuvent pointer vers diffĂ©rents chemins ou mĂȘme des sous-domaines vers diffĂ©rents services Kubernetes internes.
- Une meilleure pratique de sĂ©curitĂ© serait dâutiliser un Ă©quilibreur de charge cloud ou un serveur proxy comme point dâentrĂ©e pour ne pas avoir de partie du cluster Kubernetes exposĂ©e.
- Lorsque une requĂȘte qui ne correspond Ă aucune rĂšgle dâingress est reçue, lâIngress Controller la dirigera vers le âDefault backendâ. Vous pouvez
describelâIngress Controller pour obtenir lâadresse de ce paramĂštre. minikube addons enable ingress
Infrastructure PKI - Autorité de certification CA :

- CA est la racine de confiance pour tous les certificats Ă lâintĂ©rieur du cluster.
- Permet aux composants de se valider mutuellement.
- Tous les certificats du cluster sont signés par la CA.
- ETCd a son propre certificat.
- types :
- certificat apiserver.
- certificat kubelet.
- certificat scheduler.
Actions de base
Minikube
Minikube peut ĂȘtre utilisĂ© pour effectuer des tests rapides sur Kubernetes sans avoir besoin de dĂ©ployer un environnement Kubernetes complet. Il exĂ©cutera les processus maĂźtre et nĆud sur une seule machine. Minikube utilisera VirtualBox pour exĂ©cuter le nĆud. Voir ici comment lâinstaller.
$ minikube start
đ minikube v1.19.0 on Ubuntu 20.04
âš Automatically selected the virtualbox driver. Other choices: none, ssh
đż Downloading VM boot image ...
> minikube-v1.19.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
> minikube-v1.19.0.iso: 244.49 MiB / 244.49 MiB 100.00% 1.78 MiB p/s 2m17.
đ Starting control plane node minikube in cluster minikube
đŸ Downloading Kubernetes v1.20.2 preload ...
> preloaded-images-k8s-v10-v1...: 491.71 MiB / 491.71 MiB 100.00% 2.59 MiB
đ„ Creating virtualbox VM (CPUs=2, Memory=3900MB, Disk=20000MB) ...
đł Preparing Kubernetes v1.20.2 on Docker 20.10.4 ...
âȘ Generating certificates and keys ...
âȘ Booting up control plane ...
âȘ Configuring RBAC rules ...
đ Verifying Kubernetes components...
âȘ Using image gcr.io/k8s-minikube/storage-provisioner:v5
đ Enabled addons: storage-provisioner, default-storageclass
đ Done! kubectl is now configured to use "minikube" cluster and "default" namespace by defaul
$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
---- ONCE YOU HAVE A K8 SERVICE RUNNING WITH AN EXTERNAL SERVICE -----
$ minikube service mongo-express-service
(This will open your browser to access the service exposed port)
$ minikube delete
đ„ Deleting "minikube" in virtualbox ...
đ Removed all traces of the "minikube" cluster
Kubectl Basics
Kubectl est lâoutil en ligne de commande pour les clusters kubernetes. Il communique avec le serveur Api du processus maĂźtre pour effectuer des actions dans kubernetes ou pour demander des donnĂ©es.
kubectl version #Get client and server version
kubectl get pod
kubectl get services
kubectl get deployment
kubectl get replicaset
kubectl get secret
kubectl get all
kubectl get ingress
kubectl get endpoints
#kubectl create deployment <deployment-name> --image=<docker image>
kubectl create deployment nginx-deployment --image=nginx
#Access the configuration of the deployment and modify it
#kubectl edit deployment <deployment-name>
kubectl edit deployment nginx-deployment
#Get the logs of the pod for debbugging (the output of the docker container running)
#kubectl logs <replicaset-id/pod-id>
kubectl logs nginx-deployment-84cd76b964
#kubectl describe pod <pod-id>
kubectl describe pod mongo-depl-5fd6b7d4b4-kkt9q
#kubectl exec -it <pod-id> -- bash
kubectl exec -it mongo-depl-5fd6b7d4b4-kkt9q -- bash
#kubectl describe service <service-name>
kubectl describe service mongodb-service
#kubectl delete deployment <deployment-name>
kubectl delete deployment mongo-depl
#Deploy from config file
kubectl apply -f deployment.yml
Minikube Dashboard
Le tableau de bord vous permet de voir plus facilement ce que minikube exĂ©cute, vous pouvez trouver lâURL pour y accĂ©der dans :
minikube dashboard --url
đ Enabling dashboard ...
âȘ Using image kubernetesui/dashboard:v2.3.1
âȘ Using image kubernetesui/metrics-scraper:v1.0.7
đ€ Verifying dashboard health ...
đ Launching proxy ...
đ€ Verifying proxy health ...
http://127.0.0.1:50034/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
Exemples de fichiers de configuration YAML
Chaque fichier de configuration a 3 parties : mĂ©tadonnĂ©es, spĂ©cification (ce qui doit ĂȘtre lancĂ©), Ă©tat (Ă©tat dĂ©sirĂ©).
Ă lâintĂ©rieur de la spĂ©cification du fichier de configuration de dĂ©ploiement, vous pouvez trouver le modĂšle dĂ©fini avec une nouvelle structure de configuration dĂ©finissant lâimage Ă exĂ©cuter :
Exemple de DĂ©ploiement + Service dĂ©clarĂ©s dans le mĂȘme fichier de configuration (de ici)
Comme un service est gĂ©nĂ©ralement liĂ© Ă un dĂ©ploiement, il est possible de dĂ©clarer les deux dans le mĂȘme fichier de configuration (le service dĂ©clarĂ© dans cette configuration nâest accessible quâen interne) :
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-deployment
labels:
app: mongodb
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-username
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-password
---
apiVersion: v1
kind: Service
metadata:
name: mongodb-service
spec:
selector:
app: mongodb
ports:
- protocol: TCP
port: 27017
targetPort: 27017
Exemple de configuration de service externe
Ce service sera accessible de lâextĂ©rieur (vĂ©rifiez les attributs nodePort et type: LoadBlancer):
---
apiVersion: v1
kind: Service
metadata:
name: mongo-express-service
spec:
selector:
app: mongo-express
type: LoadBalancer
ports:
- protocol: TCP
port: 8081
targetPort: 8081
nodePort: 30000
Note
Cela est utile pour les tests, mais pour la production, vous ne devriez avoir que des services internes et un Ingress pour exposer lâapplication.
Exemple de fichier de configuration Ingress
Cela exposera lâapplication Ă http://dashboard.com.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dashboard-ingress
namespace: kubernetes-dashboard
spec:
rules:
- host: dashboard.com
http:
paths:
- backend:
serviceName: kubernetes-dashboard
servicePort: 80
Exemple de fichier de configuration des secrets
Notez comment les mots de passe sont encodĂ©s en B64 (ce qui nâest pas sĂ©curisĂ© !)
apiVersion: v1
kind: Secret
metadata:
name: mongodb-secret
type: Opaque
data:
mongo-root-username: dXNlcm5hbWU=
mongo-root-password: cGFzc3dvcmQ=
Exemple de ConfigMap
Un ConfigMap est la configuration qui est donnĂ©e aux pods afin quâils sachent comment localiser et accĂ©der Ă dâautres services. Dans ce cas, chaque pod saura que le nom mongodb-service est lâadresse dâun pod avec lequel ils peuvent communiquer (ce pod exĂ©cutera un mongodb) :
apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb-configmap
data:
database_url: mongodb-service
Ensuite, Ă lâintĂ©rieur dâune deployment config, cette adresse peut ĂȘtre spĂ©cifiĂ©e de la maniĂšre suivante afin quâelle soit chargĂ©e dans lâenv du pod :
[...]
spec:
[...]
template:
[...]
spec:
containers:
- name: mongo-express
image: mongo-express
ports:
- containerPort: 8081
env:
- name: ME_CONFIG_MONGODB_SERVER
valueFrom:
configMapKeyRef:
name: mongodb-configmap
key: database_url
[...]
Exemple de configuration de volume
Vous pouvez trouver différents exemples de fichiers de configuration de stockage yaml sur https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes.
Notez que les volumes ne sont pas Ă lâintĂ©rieur des namespaces
Namespaces
Kubernetes prend en charge plusieurs clusters virtuels soutenus par le mĂȘme cluster physique. Ces clusters virtuels sont appelĂ©s namespaces. Ils sont destinĂ©s Ă ĂȘtre utilisĂ©s dans des environnements avec de nombreux utilisateurs rĂ©partis sur plusieurs Ă©quipes ou projets. Pour les clusters avec quelques Ă des dizaines dâutilisateurs, vous ne devriez pas avoir besoin de crĂ©er ou de penser aux namespaces. Vous ne devriez commencer Ă utiliser les namespaces que pour avoir un meilleur contrĂŽle et une meilleure organisation de chaque partie de lâapplication dĂ©ployĂ©e dans kubernetes.
Les namespaces fournissent un champ dâapplication pour les noms. Les noms des ressources doivent ĂȘtre uniques au sein dâun namespace, mais pas entre les namespaces. Les namespaces ne peuvent pas ĂȘtre imbriquĂ©s les uns dans les autres et chaque ressource Kubernetes ne peut ĂȘtre que dans un seul namespace.
Il y a 4 namespaces par défaut si vous utilisez minikube :
kubectl get namespace
NAME STATUS AGE
default Active 1d
kube-node-lease Active 1d
kube-public Active 1d
kube-system Active 1d
- kube-system : Il nâest pas destinĂ© Ă lâutilisation des utilisateurs et vous ne devriez pas y toucher. Câest pour les processus master et kubectl.
- kube-public : Données accessibles publiquement. Contient un configmap qui contient des informations sur le cluster.
- kube-node-lease : DĂ©termine la disponibilitĂ© dâun nĆud.
- default : Lâespace de noms que lâutilisateur utilisera pour crĂ©er des ressources.
#Create namespace
kubectl create namespace my-namespace
Note
Notez que la plupart des ressources Kubernetes (par exemple, les pods, les services, les contrĂŽleurs de rĂ©plication, et dâautres) se trouvent dans certains espaces de noms. Cependant, dâautres ressources comme les ressources dâespace de noms et les ressources de bas niveau, telles que les nĆuds et les volumes persistants, ne se trouvent pas dans un espace de noms. Pour voir quelles ressources Kubernetes sont et ne sont pas dans un espace de noms :
kubectl api-resources --namespaced=true #Dans un espace de noms kubectl api-resources --namespaced=false #Pas dans un espace de noms
Vous pouvez enregistrer lâespace de noms pour toutes les commandes kubectl suivantes dans ce contexte.
kubectl config set-context --current --namespace=<insert-namespace-name-here>
Helm
Helm est le gestionnaire de paquets pour Kubernetes. Il permet de regrouper des fichiers YAML et de les distribuer dans des dépÎts publics et privés. Ces paquets sont appelés Helm Charts.
helm search <keyword>
Helm est également un moteur de templates qui permet de générer des fichiers de configuration avec des variables :
Secrets Kubernetes
Un Secret est un objet qui contient des donnĂ©es sensibles telles quâun mot de passe, un jeton ou une clĂ©. De telles informations pourraient autrement ĂȘtre mises dans une spĂ©cification de Pod ou dans une image. Les utilisateurs peuvent crĂ©er des Secrets et le systĂšme crĂ©e Ă©galement des Secrets. Le nom dâun objet Secret doit ĂȘtre un nom de sous-domaine DNS valide. Lisez ici la documentation officielle.
Les Secrets peuvent ĂȘtre des choses comme :
- Clés API, SSH.
- Jetons OAuth.
- Identifiants, mots de passe (texte brut ou b64 + chiffrement).
- Informations ou commentaires.
- Code de connexion à la base de données, chaßnes⊠.
Il existe différents types de secrets dans Kubernetes
| Type intégré | Utilisation |
|---|---|
| Opaque | donnĂ©es arbitraires dĂ©finies par lâutilisateur (par dĂ©faut) |
| kubernetes.io/service-account-token | jeton de compte de service |
| kubernetes.io/dockercfg | fichier ~/.dockercfg sérialisé |
| kubernetes.io/dockerconfigjson | fichier ~/.docker/config.json sérialisé |
| kubernetes.io/basic-auth | identifiants pour lâauthentification de base |
| kubernetes.io/ssh-auth | identifiants pour lâauthentification SSH |
| kubernetes.io/tls | données pour un client ou un serveur TLS |
| bootstrap.kubernetes.io/token | données de jeton de démarrage |
Note
Le type Opaque est celui par défaut, la paire clé-valeur typique définie par les utilisateurs.
Comment fonctionnent les secrets :

Le fichier de configuration suivant dĂ©finit un secret appelĂ© mysecret avec 2 paires clĂ©-valeur username: YWRtaW4= et password: MWYyZDFlMmU2N2Rm. Il dĂ©finit Ă©galement un pod appelĂ© secretpod qui aura le username et le password dĂ©finis dans mysecret exposĂ©s dans les variables dâenvironnement SECRET_USERNAME __ et __ SECRET_PASSWOR. Il montera Ă©galement le secret username Ă lâintĂ©rieur de mysecret dans le chemin /etc/foo/my-group/my-username avec des permissions 0640.
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
---
apiVersion: v1
kind: Pod
metadata:
name: secretpod
spec:
containers:
- name: secretpod
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
volumeMounts:
- name: foo
mountPath: "/etc/foo"
restartPolicy: Never
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
mode: 0640
kubectl apply -f <secretpod.yaml>
kubectl get pods #Wait until the pod secretpod is running
kubectl exec -it secretpod -- bash
env | grep SECRET && cat /etc/foo/my-group/my-username && echo
Secrets dans etcd
etcd est un magasin de valeurs-clés cohérent et hautement disponible utilisé comme magasin de support pour toutes les données du cluster Kubernetes. Accédons aux secrets stockés dans etcd :
cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd
Vous verrez que les certs, les clés et les URL sont situés dans le FS. Une fois que vous les aurez, vous pourrez vous connecter à etcd.
#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] health
ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key --cacert /etc/kubernetes/pki/etcd/etcd/ca.cert endpoint=[127.0.0.1:1234] health
Une fois que vous aurez établi la communication, vous pourrez obtenir les secrets :
#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] get <path/to/secret>
ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key --cacert /etc/kubernetes/pki/etcd/etcd/ca.cert endpoint=[127.0.0.1:1234] get /registry/secrets/default/secret_02
Ajout de chiffrement Ă lâETCD
Par dĂ©faut, tous les secrets sont stockĂ©s en texte clair Ă lâintĂ©rieur dâetcd, Ă moins que vous nâappliquiez une couche de chiffrement. Lâexemple suivant est basĂ© sur https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: cjjPMcWpTPKhAdieVtd+KhG4NN+N6e3NmBPMXJvbfrY= #Any random key
- identity: {}
AprĂšs cela, vous devez dĂ©finir le drapeau --encryption-provider-config sur le kube-apiserver pour pointer vers lâemplacement du fichier de configuration créé. Vous pouvez modifier /etc/kubernetes/manifest/kube-apiserver.yaml et ajouter les lignes suivantes :
containers:
- command:
- kube-apiserver
- --encriyption-provider-config=/etc/kubernetes/etcd/<configFile.yaml>
Faites défiler vers le bas dans les volumeMounts :
- mountPath: /etc/kubernetes/etcd
name: etcd
readOnly: true
Faites dĂ©filer vers le bas dans les volumeMounts jusquâĂ hostPath :
- hostPath:
path: /etc/kubernetes/etcd
type: DirectoryOrCreate
name: etcd
Vérification que les données sont chiffrées
Les donnĂ©es sont chiffrĂ©es lorsquâelles sont Ă©crites dans etcd. AprĂšs avoir redĂ©marrĂ© votre kube-apiserver, tout secret nouvellement créé ou mis Ă jour devrait ĂȘtre chiffrĂ© lors de son stockage. Pour vĂ©rifier, vous pouvez utiliser le programme en ligne de commande etcdctl pour rĂ©cupĂ©rer le contenu de votre secret.
- Créez un nouveau secret appelé
secret1dans lâespace de nomsdefault:
kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
- En utilisant la ligne de commande etcdctl, lisez ce secret Ă partir dâetcd :
ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C
oĂč [...] doit ĂȘtre les arguments supplĂ©mentaires pour se connecter au serveur etcd.
- Vérifiez que le secret stocké est préfixé par
k8s:enc:aescbc:v1:ce qui indique que le fournisseuraescbca chiffrĂ© les donnĂ©es rĂ©sultantes. - VĂ©rifiez que le secret est correctement dĂ©chiffrĂ© lorsquâil est rĂ©cupĂ©rĂ© via lâAPI :
kubectl describe secret secret1 -n default
devrait correspondre Ă mykey: bXlkYXRh, mydata est encodĂ©, consultez dĂ©codage dâun secret pour dĂ©coder complĂštement le secret.
Puisque les secrets sont chiffrĂ©s Ă lâĂ©criture, effectuer une mise Ă jour sur un secret chiffrera ce contenu :
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Conseils finaux :
- Essayez de ne pas garder de secrets dans le FS, obtenez-les dâautres endroits.
- Consultez https://www.vaultproject.io/ pour ajouter plus de protection Ă vos secrets.
- https://kubernetes.io/docs/concepts/configuration/secret/#risks
- https://docs.cyberark.com/Product-Doc/OnlineHelp/AAM-DAP/11.2/en/Content/Integrations/Kubernetes_deployApplicationsConjur-k8s-Secrets.htm
Références
kubesectips v1 | sickrov.github.io
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

