Chapitre 5.2 - Secrets
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Comprendre ce qu'est un Secret et pourquoi l'utiliser
- Créer des Secrets de différentes manières
- Utiliser des Secrets dans vos Pods de manière sécurisée
- Comprendre les limitations de sécurité des Secrets
- Appliquer les bonnes pratiques pour la gestion des secrets
Introduction
Les Secrets sont similaires aux ConfigMaps mais sont conçus pour stocker des données sensibles comme des mots de passe, tokens d'API, clés privées, et certificats.
Important: Les Secrets Kubernetes ne sont pas chiffrés par défaut. Ils sont seulement encodés en base64.
Qu'est-ce qu'un Secret?
Un Secret est un objet Kubernetes qui stocke des données sensibles. Par défaut, les Secrets sont encodés en base64 (pas de chiffrement).
Types de Secrets
Kubernetes supporte plusieurs types de Secrets:
- Opaque: Données arbitraires (par défaut)
- kubernetes.io/dockerconfigjson: Credentials pour registres Docker
- kubernetes.io/tls: Certificats TLS
- kubernetes.io/service-account-token: Tokens de Service Account
Pourquoi Utiliser des Secrets?
Problèmes Sans Secrets
Problèmes:
- Mots de passe hardcodés dans le code
- Risque d'exposition dans Git
- Difficile de rotation
- Pas de gestion centralisée
Avantages Avec Secrets
Avantages:
- Séparés du code applicatif
- Gestion centralisée
- Rotation facilitée
- Intégration avec outils externes (Vault, etc.)
Création de Secrets
Méthode 1: Depuis des Littéraux
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secretpassword123
Méthode 2: Depuis un Fichier
Créer un fichier password.txt:
mysecretpassword
kubectl create secret generic db-secret \
--from-file=password=password.txt
Méthode 3: Depuis un Fichier YAML
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64 de "admin"
password: cGFzc3dvcmQxMjM= # base64 de "password123"
Important: Les valeurs dans data doivent être encodées en base64.
Pour encoder:
echo -n "admin" | base64
# Résultat: YWRtaW4=
Types de Secrets Spécialisés
Secret Docker Registry
Pour accéder à un registre Docker privé:
kubectl create secret docker-registry regcred \
--docker-server=docker.io \
--docker-username=myuser \
--docker-password=mypassword \
--docker-email=myuser@example.com
Utilisation dans un Pod:
spec:
containers:
- name: app
image: private-registry.io/myapp:1.0
imagePullSecrets:
- name: regcred
Secret TLS
Pour les certificats SSL/TLS:
kubectl create secret tls tls-secret \
--cert=tls.crt \
--key=tls.key
Utilisation dans les Pods
Méthode 1: Variables d'Environnement (Une Clé)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
Méthode 2: Toutes les Clés (envFrom)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
envFrom:
- secretRef:
name: db-secret
Méthode 3: Comme Volume (Fichiers)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: secrets
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secrets
secret:
secretName: db-secret
defaultMode: 0400 # Permissions: lecture seule
Résultat: Chaque clé devient un fichier dans /etc/secrets/ avec la valeur décodée.
Sécurité des Secrets
Limitations Importantes
Important:
- Les Secrets sont encodés en base64, pas chiffrés
- Accessibles à quiconque a accès à etcd
- Visibles avec
kubectl get secret -o yaml - Logs peuvent exposer les secrets
Bonnes Pratiques de Sécurité
- Activer le Chiffrement au Repos
Créer un fichier encryption-config.yaml:
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-secret>
- identity: {} # Permet le déchiffrement
- Utiliser External Secrets Operator
Pour intégrer avec Vault, AWS Secrets Manager, etc.
- RBAC Restrictif
Limiter l'accès aux Secrets avec RBAC:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["db-secret"]
verbs: ["get"]
- Ne Jamais Commiter les Secrets
- Utiliser
.gitignorepour les fichiers de secrets - Utiliser des outils de gestion de secrets
- Rotation régulière
Exemple Complet
Étape 1: Créer le Secret
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
database_url: cG9zdGdyZXNxbDovL3VzZXI6cGFzc0BkYjoxMjM0L215ZGI=
api_key: c2VjcmV0X2FwaV9rZXlfMTIzNDU2
jwt_secret: bXlfanN0X3NlY3JldF9rZXlfZm9yX3NpZ25pbmc=
Étape 2: Utiliser dans un Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: my-app:1.0
envFrom:
- secretRef:
name: app-secrets
volumeMounts:
- name: certs
mountPath: /etc/ssl/certs
readOnly: true
volumes:
- name: certs
secret:
secretName: tls-secret
defaultMode: 0400
Commandes Utiles
Voir un Secret (Encodé)
kubectl get secret db-secret
kubectl describe secret db-secret
kubectl get secret db-secret -o yaml
Décoder un Secret
# Voir la valeur décodée
kubectl get secret db-secret -o jsonpath='{.data.password}' | base64 -d
Modifier un Secret
kubectl edit secret db-secret
Note: Les valeurs doivent être en base64 dans l'éditeur.
Supprimer un Secret
kubectl delete secret db-secret
Rotation des Secrets
Processus de Rotation
Étapes:
- Créer un nouveau Secret avec un nom différent
- Mettre à jour le Deployment pour référencer le nouveau Secret
- Attendre que les Pods redémarrent
- Supprimer l'ancien Secret
External Secrets Operator
Pour une gestion avancée avec des outils externes:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-secret
spec:
secretStoreRef:
name: vault-backend
kind: SecretStore
target:
name: db-secret
data:
- secretKey: password
remoteRef:
key: production/database/password
Résumé
Dans ce chapitre, vous avez appris:
Secret: Objet Kubernetes pour données sensibles (base64, pas chiffré par défaut)
Types: Opaque, docker-registry, TLS, service-account-token
Création: kubectl create, YAML avec valeurs base64
Utilisation: Variables d'environnement ou volumes
Sécurité: Activer chiffrement au repos, RBAC, External Secrets
Limitations: Base64 seulement, visible dans etcd, logs
Rotation: Créer nouveau secret, mettre à jour, supprimer ancien
Prochaines Étapes
Chapitre 5.3: Injection dans les Pods
Chapitre 5.4: Bonnes Pratiques
Lab 5.2: Gestion des Secrets
Chapitre créé le: Décembre 2024