Aller au contenu

12. Zero Trust : Architecture avancée

12. Zero Trust : Architecture avancée

MTLS (mutual TLS) : Authentification mutuelle

mTLS étend le protocole TLS classique : non seulement le client vérifie l’identité du serveur, mais le serveur vérifie également l’identité du client via un certificat. Les deux parties s’authentifient mutuellement avant l’établissement de la connexion chiffrée.

Cas d’usagePourquoi utiliser mTLS
Service à serviceAuthentifier les workloads et chiffrer les échanges internes, notamment dans
Kubernetes ou un service mesh.
APIs partenairesAutoriser uniquement les clients disposant d’un certificat valide à appeler une API
sensible.
Machine à machineSécuriser les échanges entre systèmes sans utilisateur humain : agents, jobs,
passerelles, IoT.
Zero Trust interneSupprimer la confiance implicite dans le réseau : chaque connexion doit prouver les
deux identités.
Environnements
réglementés
Renforcer la maîtrise des flux dans des contextes sensibles : finance, santé, défense,
industrie.
Workloads hybridesSécuriser les échanges entre Kubernetes, VM, cloud et environnements hors cluster
avec une CA commune.

Slide 361

SPIFFE/SPIRE : Identité des workloads

ÉlémentMessage clé
SPIFFE (Secure Production
Identity Framework For
Everyone)
Standard open source qui définit une identité cryptographique uniforme pour les workloads : services,
pods, conteneurs, VM ou processus.
SPIFFE IDIdentité unique du workload, exprimée sous forme d’URI.
Exemple : spiffe://prod.example.com/ns/paiement/sa/api-paiement.
SVID (SPIFFE Verifiable
Identity Document)
Document d’identité vérifiable, sous forme de certificat X.509 ou de jeton JWT, utilisé pour prouver
l’identité du workload.
SPIRE (SPIFFE Runtime
Environment)
Implémentation de référence de SPIFFE : elle atteste les workloads, émet les SVID et les renouvelle
automatiquement.
Lien avec mTLSLes certificats X.509-SVID peuvent être utilisés pour authentifier deux workloads et établir un canal mTLS.
Bénéfice sécuritéRemplacer la confiance réseau et les secrets statiques par des identités courtes durées, vérifiables et
automatiquement renouvelées.

Fonctionnement de spiffe/spire

Slide 333

Informations générales

  • Falco intercepte les syscalls Linux via eBPF → compare aux règles → émet des alertes en temps réel (< 1ms de latence)
  • De 80 à 120 règles natives
  • Les règles sont écritent en YAML

Slide 365

Ecrire une alerte

StructureExemple : Détection d’un shell dans un conteneur
- rule: Nom de la règle
desc: Description de la détection
condition: condition logique
output: Message affiché lors du déclenchement
priority: Niveau de criticité
tags: [catégorie]
- rule: Shell dans un conteneur
desc: Détecte l’exécution d’un shell interactif dans un conteneur
condition: container and proc.name in (bash, sh, zsh)
output: Shell détecté dans le conteneur
(user=%user.name container=%container.id
cmd=%proc.cmdline)
priority: WARNING
tags: [container, runtime]

Priorité des alertes

PrioritéDescriptionExemple concret
EMERGENCYCompromission critiqueExécution d’un ransomware sur plusieurs conteneurs Kubernetes
ALERTMenace majeureReverse shell détecté depuis un pod vers une IP externe
CRITICALActivité dangereuseLecture du fichier /etc/shadow dans un conteneur
ERRORErreur de sécuritéDésactivation d’un agent de sécurité ou modification suspecte d’un binaire système
WARNINGComportement suspectExécution inattendue de bash dans un conteneur nginx
NOTICEÉvénement notableNouveau pod privilégié créé dans Kubernetes
INFOInformationNouveau conteneur démarré dans le cluster
DEBUGDebug / diagnosticLogs détaillés Falco pour analyse technique ou troubleshooting

Falco et falcosidekick

Slide 339

Systèmes d’exploitation immuables (sécurité cloud par design)

Un OS immuable ne peut pas être modifié en runtime. Toute configuration est déclarative et versionnée. Le rollback est instantané. Idéal pour les nœuds K8s.

AspectOS TraditionnelOS Immutable
ModificationPossible en runtime (apt install, yum…)Impossible : rootfs en lecture seule
PersistanceChangements permanents sur le systèmeÉtat éphémère (reboot) = état propre
Surface d’attaqueAugmente avec chaque install/configMinimale et fixe : rien à modifier
Mise à jourRolling update risqué : état inconsistantAtomique : basculement A/B instantané
RollbackManuel et difficileAutomatique : version précédente intacte
AuditabilitéDifficile : état peut divergerTotale : infrastructure as code = source de vérité

Focus sur NixOS

  • Distribution Linux basée sur le gestionnaire de paquets Nix.
  • Créateur : Eelco Dolstra
  • Origine : projet de recherche universitaire, débuté vers 2003, Université d’Utrecht (Pays-Bas).
  • Compatible avec : AWS, GCP, Azure, Terraform, Kubernetes, etc.
  • NixOS transforme Linux en plateforme :
    • Déclarative : système où l’on décrit l’état souhaité de l’infrastructure ou du système, sans écrire les étapes détaillées pour y arriver.
    • Reproductible : système pouvant reconstruire exactement le même environnement, à l’identique, sur n’importe quelle machine.
    • Immuable : système qu’on ne modifie pas directement en production.
  • Alternatives : Flatcar Container Linux, Bottlerocket (AWS), Talos Linux, RHCOS (OpenShift).

Checklist de hardening production (CIS K8s Benchmark)

Control Plane & Worker Nodes

API Server :

  • --anonymous-auth=false
  • --authorization-mode=Node,RBAC

etcd :

  • chiffrement au repos (encryption-config)
  • TLS client auth

Controller Manager :

  • --use-service-account-credentials=true

Scheduler :

  • --authorization-mode=RBAC
  • pas de Webhook sans authentification

Kubelet :

  • --anonymous-auth=false
  • --authorization-mode=Webhook
  • droits 600 sur kubelet.conf, ca.crt, etc.
  • pas de ports inutiles ouverts sur les nodes
  • SSH (22) uniquement via bastion

OS :

  • CIS Linux Benchmark niveau 2
  • auditd configuré
  • SELinux/AppArmor activé

Workloads & Réseau

Pod Security Standards :

  • profil Restricted pour les workloads critiques
  • runAsNonRoot: true + runAsUser > 1000
  • ReadOnlyRootFilesystem: true sur tous les containers
  • resources.limits obligatoires (CPU + mémoire)

Réseau :

  • Network Policies : default deny all dans chaque namespace
  • Pas de hostNetwork: true (sauf cas très spécifiques CNI plugins)
  • Services de type LoadBalancer uniquement si nécessaire (préférer Ingress)
  • Ingress avec TLS obligatoire : cert-manager pour rotation automatique

RBAC & Secrets

RBAC & ServiceAccounts :

  • automountServiceAccountToken: false si le pod n’a pas besoin de l’API Kubernetes
  • ServiceAccounts dédiés par application (ne jamais utiliser le ServiceAccount par défaut)
  • Pas de ClusterRoleBinding avec wildcards (* dans verbs ou resources interdit)
  • Revues régulières : kubectl auth can-i --list --as=system:serviceaccount:...

Secrets & Config :

  • Encryption at rest activée pour les secrets etcd (EncryptionConfiguration)
  • Secrets Kubernetes uniquement pour données temporaires — préférer Vault / Secrets Manager
  • ConfigMaps : ne pas stocker de données sensibles (même encodées en Base64)
  • IRSA / Workload Identity pour accès au fournisseur de cloud — pas de clés statiques