Zero trust¶
Ne jamais faire confiance par défaut — même à l'intérieur du réseau.
Le modèle traditionnel et ses limites¶
Le modèle traditionnel de sécurité périmètre repose sur l'hypothèse qu'un réseau interne est sur. Un attaquant qui franchit le pare-feu externe trouve des services internes ouverts et communicants sans restriction. Cette hypothèse s'est révélée fausse dans la quasi-totalité des breaches modernes.
Les raisons de cet échec sont structurelles : le périmètre n'existe plus dans un monde de cloud hybride, de SaaS, de travail distant et de supply chain logicielle étendue. Les employes accedent aux ressources depuis des réseaux non maîtrises. Les services communiquent à travers des frontieres organisationnelles. Les attaquants qui penetrent le périmètre se deplacent lateralement sans résistance.
graph TD
subgraph "Modele perimetrique"
A[Client externe] --text--> FW[Pare-feu]
FW --text--> B[Zone interne]
B --> C[Service A]
B --> D[Service B]
C --text--> D
end
subgraph "Zero trust"
E[Client externe] --text--> GW[Gateway]
GW --text--> F[Service A]
F --text--> G[Service B]
G --text--> H[Base de donnees]
end Dans le modèle perimetrique, la confiance est implicite à l'intérieur. Dans le zero trust, chaque fleche représenté une vérification d'identité et d'autorisation — il n'y a pas de zone de confiance implicite.
Les 3 piliers¶
Vérifier l'identité¶
Chaque service et chaque utilisateur doit prouver son identité. En pratique : mTLS entre services, JWT valides pour les utilisateurs, identités de workload (SPIFFE/SPIRE).
L'identité n'est jamais déduite de la position réseau. Une requête venant du réseau interne n'est pas considérée comme de confiance. Un pod Kubernetes dans le même namespace n'est pas automatiquement autorise.
| Acteur | Mécanisme d'identité |
|---|---|
| Utilisateur humain | SSO + MFA, JWT/OIDC avec expiration courte |
| Service interne | mTLS, SPIFFE ID, service account token |
| Workload cloud | Instance identity (IMDSv2), workload identity |
| Device | Certificat device, posture check |
| API externe | API key + mutual authentication |
Vérifier l'autorisation¶
L'identité ne suffit pas. Chaque requête est autorisee en fonction du rôle (RBAC), des attributs (ABAC) ou de la politique courante.
Un service authentifie ne peut accéder qu'aux ressources dont il a explicitement besoin. L'autorisation est évaluée à chaque requête, pas seulement à la connexion initiale. Le contexte compte : qui demande, quoi, quand, depuis ou, avec quel device.
# Politique OPA/Rego simplifiee
allow {
input.method == "GET"
input.path == "/api/orders"
input.user.role == "order-reader"
input.user.mfa_verified == true
time.now_ns() < input.user.token_expiry
}
Minimiser l'accès¶
Le principe du moindre privilege s'applique partout :
- Un service ne reçoit que les permissions nécessaires a sa fonction
- Les tokens ont une durée de vie courte (minutes, pas jours)
- Les accès sont revokes des qu'ils ne sont plus nécessaires
- Les accès élevés sont obtenus par elevation temporaire (just-in-time), pas maintenus en permanence
- Les blast radius sont limites : si un composant est compromis, l'impact est contenu
BeyondCorp — zero trust en pratique¶
BeyondCorp est le modèle zero trust mis en œuvre par Google à partir de 2011. C'est une implémentation concrète des principes zero trust à l'échelle d'une organisation mondiale, documentee dans plusieurs publications academiques.
Principes BeyondCorp¶
L'accès ne dépend pas du réseau — qu'un employe soit au bureau, à la maison ou dans un cafe, l'accès aux ressources passe par le même chemin. Le VPN est supprimé.
L'accès dépend de l'identité et du contexte — chaque requête est évaluée en fonction de l'identité de l'utilisateur, de la posture de sécurité du device, et du niveau de sensibilité de la ressource demandee.
Toutes les ressources sont accessibles via Internet — mais protegees par un proxy d'accès qui vérifié l'identité et le contexte à chaque requête.
graph LR
USER[Utilisateur] --text--> AP[Access Proxy]
AP --text--> IDP[Identity Provider]
AP --text--> DT[Device Trust\nPosture check]
AP --text--> POL[Policy Engine\nRegles d'acces]
POL --text--> ALLOW["Autoriser / Refuser"]
ALLOW --text--> APP[Application interne] Composants clés¶
| Composant | Rôle | Équivalent open source |
|---|---|---|
| Access Proxy | Point d'entree unique, vérifié identité et contexte | Pomerium, Ory Oathkeeper |
| Identity Provider | Authentification, SSO, MFA | Keycloak, Dex, Auth0 |
| Device Trust | Évaluation de la posture sécurité du device | osquery, Fleet |
| Policy Engine | Règles d'accès contextuelles | OPA/Rego, Cedar |
| Inventory | Inventaire des devices et des utilisateurs connus | CMDB, MDM |
ZTNA — Zero Trust Network Access¶
Le ZTNA (Zero Trust Network Access) est l'application du zero trust à l'accès réseau. Il remplacé le VPN traditionnel par un accès applicatif granulaire.
VPN vs ZTNA¶
| Critère | VPN traditionnel | ZTNA |
|---|---|---|
| Granularité | Accès au réseau entier | Accès a une application spécifique |
| Authentification | Une fois à la connexion | Continue, à chaque requête |
| Surface d'attaque | Tout le réseau interne expose | Seules les apps autorisees sont visibles |
| Mouvement lateral | Possible après connexion | Impossible — pas d'accès réseau |
| Posture device | Rarement vérifiée | Vérifiée en continu |
| Expérience utilisateur | Client VPN lourd, latence | Transparent, intégration navigateur |
Architectures ZTNA¶
ZTNA agent-based — un agent sur le device de l'utilisateur etablit un tunnel chiffre vers un broker qui vérifié l'identité et le contexte avant de router vers l'application. Le device ne voit jamais le réseau interne.
ZTNA service-based — pas d'agent nécessaire. L'accès se fait via un proxy web (reverse proxy avec authentification). Adapté aux applications web, moins flexible pour les protocoles non-HTTP.
| Solution | Type | Modèle |
|---|---|---|
| Zscaler Private Access | Commercial | Agent-based, cloud-delivered |
| Cloudflare Access | Commercial | Service-based, intégration CDN |
| Pomerium | Open source | Service-based, identity-aware proxy |
| Tailscale | Hybrid | WireGuard mesh, ACL fine-grained |
| NetBird | Open source | WireGuard mesh, zero trust by design |
Mise en œuvre progressive¶
Le zero trust n'est pas un produit que l'on active — c'est une transformation architecturale. Une migration typique se fait par phases.
Phase 1 — Inventaire et visibilité¶
Cartographier tous les services, flux de données et niveaux de confiance actuels. Sans visibilité, on ne peut pas sécuriser.
- Lister tous les services et leurs dépendances
- Identifier les flux de données sensibles
- Documenter les mécanismes d'authentification existants (ou leur absence)
- Déployer du monitoring sur les communications inter-services
Phase 2 — Identités de workload¶
Déployer mTLS et des identités de workload pour tous les services critiques.
- Déployer une PKI interne (cert-manager, Vault PKI)
- Attribuer une identité SPIFFE à chaque service
- Activer mTLS en mode permissif (accepte les connexions non-mTLS pendant la migration)
Phase 3 — Micro-segmentation¶
Remplacer les règles réseau larges par des politiques fine-grained.
- Network Policies Kubernetes pour limiter les communications pod-to-pod
- Security groups par service (pas par sous-réseau)
- Default deny — tout est bloque sauf ce qui est explicitement autorise
Phase 4 — Autorisation contextuelle¶
Introduire des politiques d'autorisation qui prennent en compte le contexte.
- Déployer OPA ou Cedar comme policy engine
- Définir des politiques basées sur l'identité, le rôle, l'heure, la localisation
- Implémenter le just-in-time access pour les accès privilegies
Phase 5 — Monitoring continu¶
Logger et analyser tous les accès pour détecter les anomalies.
- Centraliser les logs d'accès dans un SIEM
- Configurer des alertes sur les patterns anormaux
- Implémenter l'UEBA (User and Entity Behavior Analytics)
| Phase | Outils typiques | Durée estimée |
|---|---|---|
| Inventaire | Service mesh observability, nmap | 2-4 semaines |
| Identités workload | SPIRE, cert-manager, Vault PKI | 1-2 mois |
| Micro-segmentation | Network Policies, Calico, Cilium | 2-3 mois |
| Autorisation | OPA/Rego, Cedar, Casbin | 2-4 mois |
| Monitoring | Falco, audit logs, SIEM | 1-2 mois |
Erreurs courantes¶
| Erreur | Correction |
|---|---|
| Croire que le zero trust est un produit | C'est un modèle de conception, pas un logiciel |
| Déployer mTLS sans rotation automatique | Automatiser la rotation avant d'activer le mode strict |
| Micro-segmenter sans inventaire | L'inventaire des flux est un prérequis |
| Appliquer le zero trust uniquement au réseau | L'identité, l'autorisation et le monitoring comptent aussi |
| Ignorer l'expérience utilisateur | Un système trop contraignant pousse au contournement |
Tip
Zero trust ne signifie pas "ajouter de l'authentification partout". C'est un modèle de pensee — partez du principe que le réseau est compromis et concevez en conséquence.
Zero trust et Kubernetes¶
Kubernetes est un environnement ou le zero trust prend tout son sens. Par défaut, un cluster Kubernetes est un réseau plat — tous les pods peuvent communiquer entre eux sans restriction. C'est un modèle de confiance implicite qui doit être corrige.
Network Policies¶
La première étape : déployer des Network Policies pour limiter les communications pod-to-pod. La politique par défaut doit être "deny all", avec des exceptions explicites pour chaque flux autorise.
# Default deny all ingress dans un namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
Service mesh et zero trust¶
Le service mesh (Istio, Linkerd) est l'outil le plus complet pour implémenter le zero trust dans Kubernetes. Il fournit :
- mTLS automatique entre tous les services (sans modifier le code)
- Politiques d'autorisation au niveau L7 (qui peut appeler quel endpoint)
- Observabilité de tous les flux inter-services
- Rate limiting par service et par endpoint
Service accounts et RBAC¶
Chaque pod doit utiliser un service account dédié avec des permissions minimales. Le service account par défaut du namespace ne doit jamais être utilisé en production — il hérité souvent de permissions trop larges.
| Pratique | Recommandation |
|---|---|
| Service account par défaut | Désactiver l'automount du token |
| Permissions RBAC | Un rôle par service, pas de cluster-admin |
| Secrets | Montes en volume, pas en variables d'environnement |
| Pod Security Standards | Appliquer le profil "restricted" |
| Image pull | Toujours depuis un registre prive avec signature |
Mesurer la maturité zero trust¶
Le zero trust est une transformation continue. Un modèle de maturité aide à évaluer la progression et a prioriser les efforts.
| Niveau | Description | Critères |
|---|---|---|
| 0 - Périmètre | Confiance implicite dans le réseau interne | Pas de mTLS, pas de segmentation fine |
| 1 - Visibilité | Inventaire des flux, monitoring déployé | Cartographie des services et des communications |
| 2 - Identité | mTLS et identités de workload déployés | Chaque service a une identité cryptographique |
| 3 - Segmentation | Micro-segmentation active, default deny | Network Policies ou service mesh en place |
| 4 - Contextuel | Autorisation basée sur le contexte à chaque requête | Policy engine déployé, accès conditionnel |
| 5 - Continu | Monitoring en temps réel, détection d'anomalies | SIEM, UEBA, réponse automatisee |
La plupart des organisations démarrent au niveau 0 ou 1. L'objectif realiste pour un système en production est d'atteindre le niveau 3 en 6 a 12 mois, puis de progresser vers les niveaux 4 et 5 selon la criticite du système.
Chapitre suivant : Defense en profondeur — empiler les couches de protection pour qu'aucune défaillance unique ne compromette le système.