Aller au contenu principal

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é

  1. 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
  1. Utiliser External Secrets Operator

Pour intégrer avec Vault, AWS Secrets Manager, etc.

  1. 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"]
  1. Ne Jamais Commiter les Secrets
  • Utiliser .gitignore pour 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:

  1. Créer un nouveau Secret avec un nom différent
  2. Mettre à jour le Deployment pour référencer le nouveau Secret
  3. Attendre que les Pods redémarrent
  4. 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