Le RBAC Kubernetes est le premier mécanisme de défense contre les compromissions de cluster — et la principale source de misconfiguration en 2026. Des permissions trop larges accordées aux service accounts ou aux utilisateurs permettent une escalade de privilèges jusqu'au niveau cluster-admin depuis n'importe quel pod compromis. Ce guide détaille les 10 erreurs les plus critiques et comment les corriger.

En 2026, Kubernetes pilote plus de 80 % des déploiements conteneurisés en entreprise, et le contrôle d'accès basé sur les rôles — RBAC — reste le premier rempart contre les attaques internes et externes sur les clusters cloud-native. Pourtant, une étude récente de la Cloud Native Computing Foundation révèle que plus de 60 % des clusters Kubernetes en production présentent au moins une mauvaise configuration RBAC critique. Les conséquences sont directes : escalade de privilèges depuis un pod compromis, exfiltration de secrets Kubernetes, prise de contrôle complète du plan de contrôle. Les erreurs de configuration kubernetes rbac constituent aujourd'hui la principale surface d'attaque dans les infrastructures conteneurisées, devançant même les vulnérabilités des images de conteneur. Ce guide pratique passe en revue les 10 erreurs les plus fréquentes et les plus dangereuses, avec les commandes kubectl pour les détecter et les configurations YAML sécurisées pour les corriger définitivement. Que vous gériez un cluster EKS, GKE, AKS ou on-premise, ces vecteurs d'attaque s'appliquent à tous les environnements Kubernetes en production.

À retenir

  • Wildcard permissions : verbs: ["*"] et resources: ["*"] accordent un accès équivalent à cluster-admin — à bannir absolument en production sous peine de compromettre l'intégralité du cluster.
  • cluster-admin : Moins de 3 comptes humains devraient porter ce binding dans un cluster de production ; auditez avec kubectl get clusterrolebindings filtré sur le roleRef cluster-admin.
  • Service accounts tokens : Le montage automatique de tokens doit être désactivé par défaut (automountServiceAccountToken: false) et activé explicitement uniquement pour les workloads qui en ont besoin, avec des tokens projetés à courte durée de vie.
  • Escalade de privilèges : Les verbes bind, escalate et la permission create pods sont des vecteurs d'escalade directe vers le niveau nœud — à supprimer des rôles non-administrateurs sans exception.
  • Audit et outillage : kube-bench, rbac-lookup et Falco forment la triade de détection minimale pour surveiller en continu les anomalies RBAC et détecter les dérives de configuration.

Pourquoi le RBAC Kubernetes est-il si souvent mal configuré ?

Le système RBAC de Kubernetes, introduit en version stable avec Kubernetes 1.8, est un mécanisme puissant mais complexe. Il repose sur quatre primitives principales : Role, ClusterRole, RoleBinding et ClusterRoleBinding. La confusion entre ces objets, combinée à la pression opérationnelle de livrer rapidement des fonctionnalités, conduit à des configurations permissives que personne ne corrige ensuite.

Trois facteurs aggravent la situation. Premièrement, le principe de least privilege est difficile à appliquer sans une connaissance fine des API Kubernetes : il existe plus de 50 groupes d'API et plusieurs centaines de ressources. Deuxièmement, les erreurs de configuration RBAC ne produisent aucune erreur visible — un service account sur-privilégié fonctionne parfaitement jusqu'au jour où un attaquant en tire profit. Troisièmement, la dette technique s'accumule : des ClusterRoles créés pour déboguer un problème en urgence restent actifs des mois après l'incident.

Selon le CIS Kubernetes Benchmark, les sections 5.1 à 5.4 couvrent exclusivement les contrôles RBAC et représentent 40 % des vérifications de sécurité totales. Ce chiffre illustre à lui seul l'importance critique de ce vecteur. L'outil kube-bench d'Aqua Security permet d'automatiser ces vérifications. Voyons les 10 erreurs les plus courantes, du plus fréquent au plus dangereux.

Erreur #1 : Les wildcard permissions, le cluster-admin déguisé

La première erreur, et la plus répandue, consiste à utiliser des wildcards dans la définition des rôles RBAC. Un ClusterRole contenant verbs: ["*"] et resources: ["*"] est strictement équivalent au rôle cluster-admin : il permet toutes les opérations sur toutes les ressources, y compris les actions destructrices comme DELETE, EXEC et IMPERSONATE. On retrouve ce pattern dans des charts Helm mal écrits, des opérateurs tiers peu soigneux, ou des configurations héritées de tutoriels datés.

# MAUVAIS : permissions wildcard — équivalent cluster-admin de facto
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: too-permissive
rules:
- apiGroups: ["*"]   # Tous les groupes d'API Kubernetes
  resources: ["*"]   # Toutes les ressources sans exception
  verbs: ["*"]       # Toutes les actions : DELETE, EXEC, IMPERSONATE inclus

---
# BON : permissions minimales pour un service de déploiement
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
  name: deployment-manager
rules:
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "update", "patch"]
  # Pas de "delete", pas de "create", aucun accès aux secrets

Pour détecter les rôles avec wildcards dans votre cluster :

# Lister tous les ClusterRoles avec des verbes wildcard
kubectl get clusterroles -o json |   jq -r '.items[] | select(.rules[]?.verbs[]? == "*") | .metadata.name'

# Vérifier les Roles namespacés avec wildcards
kubectl get roles --all-namespaces -o json |   jq -r '.items[] | select(.rules[]?.verbs[]? == "*") |
         "\(.metadata.namespace)/\(.metadata.name)"'

Le correctif consiste à lister explicitement les verbes nécessaires — get, list, watch pour la lecture seule, create, update, patch, delete uniquement si l'application en a réellement besoin. kube-bench automatise cette vérification dans sa règle 5.1.3.

Erreur #2 : L'abus du rôle cluster-admin — qui en a vraiment besoin ?

Le binding cluster-admin accorde un contrôle total et sans restrictions sur l'ensemble du cluster : lecture des secrets de tous les namespaces, suppression de namespaces entiers, impersonation d'autres utilisateurs, modification des ressources du plan de contrôle. Dans la plupart des clusters audités, ce rôle est attribué bien trop généreusement : équipes DevOps entières, pipelines CI/CD, opérateurs Helm installés sans ajustement du rôle par défaut.

# Auditer TOUS les sujets ayant le binding cluster-admin
kubectl get clusterrolebindings -o json |   jq -r '.items[] | select(.roleRef.name=="cluster-admin") |
         .subjects[]? | "\(.kind)/\(.name) (ns: \(.namespace // "cluster-wide"))"'

# Résultat typique d'un cluster mal configuré :
# ServiceAccount/tiller-service (ns: kube-system)      <- Helm v2 legacy
# User/jenkins-ci                                       <- CI avec trop de droits
# Group/system:masters                                  <- OK (admin Kubernetes)
# ServiceAccount/prometheus-operator (ns: monitoring)  <- INUTILE, get/list suffit

La règle empirique : en production, cluster-admin ne devrait être attribué qu'à 2 ou 3 comptes d'urgence humains, idéalement protégés par MFA et des sessions à durée limitée. Les pipelines CI/CD ont besoin de créer et mettre à jour des deployments — ils n'ont aucun besoin de lire tous les secrets ou de supprimer des namespaces. Créez des ClusterRoles spécialisés et stricts pour chaque use case opérationnel.

Pour les workloads de monitoring comme Prometheus, le ClusterRole nécessaire se limite à get, list, watch sur les pods, nodes, services et endpoints — aucun accès en écriture n'est requis pour collecter des métriques.

Erreur #3 : Les service account tokens montés automatiquement

Par défaut, Kubernetes monte automatiquement un token de service account dans chaque pod via le volume /var/run/secrets/kubernetes.io/serviceaccount/token. Ce token, valide et signé par le cluster, permet d'appeler l'API Kubernetes avec les permissions du service account associé. Si ce service account dispose de permissions larges — et le service account default en a souvent via des bindings hérités —, un attaquant ayant compromis le pod peut pivoter vers l'API Server et prendre le contrôle du cluster.

# MAUVAIS : montage automatique activé (comportement Kubernetes par défaut)
apiVersion: v1
kind: ServiceAccount
metadata:
  name: myapp
  namespace: production
# automountServiceAccountToken non défini = true par défaut !

---
# BON : désactiver le montage automatique au niveau du service account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: myapp
  namespace: production
automountServiceAccountToken: false  # Désactivé : aucun token monté sans demande explicite

---
# Si le pod a besoin d'un token : utiliser un token projeté avec TTL courte
apiVersion: v1
kind: Pod
spec:
  serviceAccountName: myapp
  automountServiceAccountToken: false   # Renforce la désactivation au niveau pod
  volumes:
  - name: api-token
    projected:
      sources:
      - serviceAccountToken:
          path: token
          expirationSeconds: 3600       # Token valide 1 heure seulement
          audience: "kubernetes"        # Audience restreinte à l'API Server
  containers:
  - name: app
    volumeMounts:
    - name: api-token
      mountPath: /var/run/secrets/token
      readOnly: true

Les tokens projetés (projected service account tokens), disponibles depuis Kubernetes 1.12 et obligatoires depuis 1.21, offrent une solution bien plus sûre : durée de vie limitée, audience spécifique, renouvellement automatique. La documentation officielle Kubernetes sur le RBAC recommande leur adoption systématique pour tout workload nécessitant un accès API.

# Trouver les pods qui montent des tokens de service account automatiquement
kubectl get pods --all-namespaces -o json |   jq -r '.items[] |
         select(.spec.automountServiceAccountToken != false) |
         "\(.metadata.namespace)/\(.metadata.name): SA=\(.spec.serviceAccountName // "default")"'

Erreur #4 : La confusion ClusterRole vs Role et les attaques cross-namespace

Une erreur structurelle fréquente consiste à utiliser un ClusterRole là où un Role namespacé suffirait, et surtout à créer un ClusterRoleBinding à la place d'un RoleBinding. La distinction est fondamentale : un Role s'applique uniquement dans son namespace, tandis qu'un ClusterRole s'applique à l'ensemble du cluster, y compris les ressources sans namespace comme les nodes, PersistentVolumes et ClusterRoleBindings eux-mêmes.

Le scénario d'attaque cross-namespace est classique : un administrateur crée un ClusterRoleBinding pour donner à son équipe l'accès au namespace staging, mais utilise un ClusterRoleBinding au lieu d'un RoleBinding — ce qui donne en réalité un accès à tous les namespaces, y compris kube-system et production.

# MAUVAIS : ClusterRoleBinding donne accès à TOUS les namespaces du cluster
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dev-team-access-INCORRECT
subjects:
- kind: Group
  name: dev-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: edit        # Ce ClusterRole s'applique à TOUS les namespaces !
  apiGroup: rbac.authorization.k8s.io

---
# BON : RoleBinding namespacé, restreint à staging uniquement
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-team-staging
  namespace: staging  # Portée strictement limitée à ce namespace
subjects:
- kind: Group
  name: dev-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole   # On peut référencer un ClusterRole depuis un RoleBinding
  name: edit          # Mais la portée est réduite au namespace du RoleBinding
  apiGroup: rbac.authorization.k8s.io
# Identifier les ClusterRoleBindings non-système avec des sujets utilisateurs
# qui devraient probablement être des RoleBindings namespacés
kubectl get clusterrolebindings -o json |   jq -r '.items[] |
         select(.subjects[]?.kind == "User" or .subjects[]?.kind == "Group") |
         select(.metadata.name | startswith("system:") | not) |
         "\(.metadata.name): \(.roleRef.name) -> \([.subjects[].name] | join(", "))"'

Consultez notre article détaillé sur les techniques offensives RBAC Kubernetes pour comprendre comment les attaquants exploitent ces confusions de périmètre en conditions réelles.

Erreur #5 : L'escalade de privilèges via les verbes bind et escalate

Les verbes bind et escalate sont parmi les plus dangereux du système RBAC Kubernetes, souvent méconnus des administrateurs. Un sujet disposant du verbe bind sur les ressources clusterroles peut créer de nouveaux ClusterRoleBindings vers des rôles plus permissifs que les siens — y compris cluster-admin — sans posséder lui-même ces permissions. Le verbe escalate permet de modifier un rôle pour y ajouter des permissions que l'appelant ne possède pas.

Kubernetes intègre une protection native contre l'escalade : sans le verbe escalate, un sujet ne peut pas créer un rôle contenant des permissions qu'il ne possède pas. Mais si ce verbe lui est accordé, cette protection est intégralement court-circuitée — c'est une backdoor RBAC.

# Détecter les rôles avec les verbes dangereux bind/escalate/impersonate
kubectl get clusterroles -o json |   jq -r '.items[] |
         select(.rules[]?.verbs[]? |
                test("^(bind|escalate|impersonate)$")) |
         .metadata.name'

# Vérifier TOUTES les permissions d'un service account (liste exhaustive)
kubectl auth can-i --list   --as=system:serviceaccount:default:myapp   --namespace=default

# Peut-il créer des ClusterRoleBindings ? (vecteur d'escalade #1)
kubectl auth can-i create clusterrolebindings   --as=system:serviceaccount:production:api-server

# Peut-il escalader des rôles existants ?
kubectl auth can-i escalate clusterroles   --as=system:serviceaccount:ci:deployer

Le MITRE ATT&CK catalogue ces techniques sous T1098 (Account Manipulation) et T1548 (Abuse Elevation Control Mechanism) dans sa matrice dédiée aux environnements Kubernetes. Principe de défense absolu : les verbes bind, escalate et impersonate ne doivent apparaître que dans les rôles des administrateurs de cluster, jamais dans ceux des applications ou pipelines CI/CD.

Erreur #6 : La permission create pods comme vecteur d'évasion de conteneur

La permission de créer des pods — verbs: ["create"] sur resources: ["pods"] — est un vecteur d'escalade souvent sous-estimé mais extrêmement puissant. Un attaquant disposant de cette permission peut créer un pod qui monte le système de fichiers de l'hôte (hostPath: /), qui utilise le réseau de l'hôte (hostNetwork: true), ou qui s'exécute en mode privilégié (privileged: true) — autant de voies directes vers une évasion de conteneur complète avec accès root au nœud sous-jacent.

# Exemple d'attaque : pod créé par un attaquant disposant de "create pods"
# Ce pod monte le filesystem racine du nœud pour une escalade complète
apiVersion: v1
kind: Pod
metadata:
  name: escape-pod
  namespace: default
spec:
  containers:
  - name: attacker
    image: ubuntu:latest
    command: ["chroot", "/host", "/bin/bash", "-c", "cat /etc/shadow; ls /root"]
    volumeMounts:
    - name: host-root
      mountPath: /host
    securityContext:
      privileged: true       # Accès complet au kernel Linux du nœud
  volumes:
  - name: host-root
    hostPath:
      path: /                # Monte le filesystem racine du nœud physique
  nodeName: control-plane-0  # Cibler le plan de contrôle pour accès maximal
# Identifier TOUS les sujets pouvant créer des pods en production
# Nécessite le plugin kubectl who-can : kubectl krew install who-can
kubectl-who-can create pods -n production
kubectl-who-can create pods --all-namespaces

# Vérifier aussi les ressources connexes (exec dans pods existants)
kubectl-who-can create pods/exec -n kube-system
kubectl-who-can get secrets -n production

La mitigation duale : les Pod Security Admission (successeur des PodSecurityPolicies depuis Kubernetes 1.25) permettent d'interdire les pods privilégiés, hostPath et hostNetwork indépendamment du RBAC. Configurez le label pod-security.kubernetes.io/enforce: restricted sur tous vos namespaces de production. Même si un attaquant dispose de create pods, le pod sera rejeté à l'admission. Pour aller plus loin sur l'isolation au niveau noyau, notre article sur les User Namespaces Kubernetes 1.35 détaille les nouvelles protections disponibles.

Erreur #7 : L'absence d'audit logging RBAC

Sans audit logging activé sur l'API Server, les abus RBAC sont totalement indétectables : un attaquant peut lire tous les secrets, modifier des ClusterRoles et créer des backdoors sans laisser la moindre trace dans vos logs applicatifs ou d'infrastructure. Le NIST SP 800-190 classe l'audit des accès API Kubernetes comme contrôle de sécurité fondamental pour tout environnement conteneurisé en production.

# Politique d'audit Kubernetes — /etc/kubernetes/audit-policy.yaml
# À configurer sur le nœud du plan de contrôle (kube-apiserver flag --audit-policy-file)
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  # Loguer TOUTES les modifications RBAC avec le contenu complet (Request+Response)
  - level: RequestResponse
    resources:
    - group: "rbac.authorization.k8s.io"
      resources:
      - "clusterroles"
      - "clusterrolebindings"
      - "roles"
      - "rolebindings"
    verbs: ["create", "update", "patch", "delete"]

  # Loguer les accès aux secrets (métadonnées suffisent pour détecter l'exfiltration)
  - level: Metadata
    resources:
    - group: ""
      resources: ["secrets"]
    verbs: ["get", "list", "watch"]

  # Loguer les créations de pods (vecteur d'évasion de conteneur)
  - level: Request
    resources:
    - group: ""
      resources: ["pods", "pods/exec", "pods/attach"]
    verbs: ["create"]

  # Ignorer les health checks répétitifs pour éviter le bruit
  - level: None
    users: ["system:kube-proxy"]
    verbs: ["watch"]
    resources:
    - group: ""
      resources: ["endpoints", "services"]

  # Niveau par défaut minimal : métadonnées uniquement
  - level: Metadata

Une fois l'audit activé, Falco permet de détecter les comportements anormaux en temps réel via ses règles k8s_audit. Voici une règle utile pour détecter les modifications RBAC suspectes en dehors des heures de maintenance :

# Règle Falco — détecter les modifications RBAC par des comptes non-système
- rule: K8s RBAC Suspicious Modification
  desc: Détecte toute modification de ressources RBAC par un compte non-système
  condition: >
    ka.target.resource in (clusterroles, clusterrolebindings, roles, rolebindings)
    and ka.verb in (create, update, patch, delete)
    and not ka.user.name startswith "system:"
    and not ka.user.name in (known_admin_users)
  output: >
    Modification RBAC suspecte (user=%ka.user.name
    action=%ka.verb resource=%ka.target.resource
    name=%ka.target.name namespace=%ka.target.namespace)
  priority: WARNING
  source: k8s_audit
  tags: [rbac, privilege-escalation, k8s]

Comment auditer votre cluster Kubernetes avec les bons outils ?

L'audit manuel est utile mais insuffisant pour un cluster de production avec des dizaines de namespaces et des centaines de rôles. Plusieurs outils spécialisés automatisent ce travail et s'intègrent dans les pipelines CI/CD.

kube-bench : l'outil de référence pour vérifier la conformité au CIS Kubernetes Benchmark. Il exécute automatiquement toutes les recommandations de sécurité, dont les sections RBAC 5.1 à 5.4. Il peut tourner comme un Job Kubernetes ou en mode CLI local.

# Exécuter kube-bench comme Job dans le cluster (méthode recommandée)
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml
kubectl wait --for=condition=complete job/kube-bench --timeout=120s
kubectl logs job/kube-bench | grep -E "\[FAIL\]|\[WARN\]" | grep -i "5\."

# Nettoyage après audit
kubectl delete job kube-bench

rbac-lookup : outil léger pour visualiser rapidement les permissions d'un sujet ou d'un rôle spécifique, bien plus lisible que le JSON brut de kubectl.

# Installer via krew (gestionnaire de plugins kubectl)
kubectl krew install rbac-lookup

# Lister toutes les permissions d'un utilisateur
kubectl rbac-lookup jenkins -k user

# Permissions d'un service account spécifique
kubectl rbac-lookup default -k serviceaccount -n production

# Vue globale de tous les bindings vers cluster-admin
kubectl rbac-lookup cluster-admin -k role

# Exporter au format wide pour avoir les namespaces
kubectl rbac-lookup myapp -k serviceaccount -o wide

Polaris (Fairwinds) s'intègre comme admission webhook pour bloquer les déploiements non conformes avant qu'ils n'atteignent la production. rbac-audit génère des rapports de conformité détaillés au format JSON ou HTML. Ensemble, ces outils couvrent les phases de développement (Polaris en CI), d'audit ponctuel (kube-bench, rbac-lookup) et de détection en temps réel (Falco).

Outil Type Cas d'usage principal Intégration CI/CD Licence
kube-bench CLI / Job K8s Conformité CIS Benchmark complète (toutes sections) Oui (Job Kubernetes) Apache 2.0
rbac-lookup kubectl plugin Visualisation rapide des permissions par sujet Limité Apache 2.0
kubectl-who-can kubectl plugin Identifier qui peut effectuer une action donnée Non Apache 2.0
Polaris CLI / Webhook Validation manifests YAML + politiques RBAC en CI Oui (admission webhook) Apache 2.0
Falco Runtime security Détection d'anomalies RBAC en temps réel Oui (alerting Slack/PD) Apache 2.0

Quelles sont les meilleures pratiques RBAC pour sécuriser votre cluster en 2026 ?

Au-delà de la correction des erreurs individuelles, une stratégie RBAC robuste repose sur six principes fondamentaux qui s'appliquent à toutes les infrastructures Kubernetes, qu'elles soient on-premise ou managées dans le cloud.

1. Principe de moindre privilège strict. Commencez avec zéro permission et ajoutez uniquement ce qui est prouvé nécessaire. Utilisez kubectl auth can-i --list pour inventorier les permissions actuelles d'un compte, puis supprimez celles qui n'ont pas été utilisées depuis 30 jours — les audit logs vous permettront de le vérifier.

2. Namespaces comme frontières de sécurité. Utilisez des namespaces distincts pour chaque environnement (dev, staging, production) et des Roles namespacés plutôt que des ClusterRoles quand c'est possible. Appliquez les labels Pod Security Admission sur chaque namespace de production avec le niveau restricted.

3. Service accounts dédiés par workload. Chaque application doit avoir son propre service account avec ses propres permissions minimales, distinctes du service account default. Cette granularité facilite l'audit et permet de révoquer les permissions d'une seule application sans impacter les autres. Notre livre blanc sécurité Kubernetes fournit un modèle complet de gestion des identités par workload.

4. Rotation des tokens et durée de vie courte. Avec les tokens projetés, configurez une durée de vie maximale de 1 heure pour les workloads standards et de 15 minutes pour les workloads à haut risque (accès à des secrets de production, connexions à des bases de données). L'API Server renouvelle automatiquement ces tokens avant expiration.

5. Review régulière des bindings. Planifiez un audit RBAC mensuel automatisé avec kube-bench et rbac-lookup. Supprimez les bindings orphelins (dont les sujets n'existent plus dans l'IdP) et les bindings créés pour des opérations de maintenance qui n'ont jamais été nettoyés.

6. GitOps et immutabilité des RBAC. Gérez tous vos objets RBAC via GitOps (ArgoCD, Flux). Toute modification RBAC doit passer par une pull request avec au moins une review, ce qui crée une piste d'audit automatique, empêche les modifications manuelles ad hoc et facilite le rollback en cas de problème.

Pour une approche globale, notre article sur les 10 outils de sécurité Kubernetes 2025 complète ce guide RBAC avec les solutions de network policy, image scanning et runtime security.

RBAC sur le cloud public : IRSA AWS et Workload Identity GCP

Sur les clusters managés (EKS, GKE, AKS), les fournisseurs cloud proposent des mécanismes d'identité plus sécurisés que les tokens de service account classiques, basés sur la fédération d'identité OIDC. Ces mécanismes éliminent les problèmes liés aux tokens de longue durée de vie et aux credentials statiques stockés dans le cluster.

IRSA (IAM Roles for Service Accounts) sur AWS EKS permet à un service account Kubernetes d'assumer un rôle IAM AWS via des tokens à courte durée de vie signés par le fournisseur OIDC du cluster. Aucun credential AWS statique n'est jamais stocké dans Kubernetes :

# Créer une association service account Kubernetes <-> rôle IAM AWS
eksctl create iamserviceaccount   --name my-service-account   --namespace production   --cluster my-cluster   --region eu-west-1   --role-name MyAppRole   --attach-policy-arn arn:aws:iam::123456789012:policy/MyAppPolicy   --approve

# Vérifier l'annotation créée sur le service account
kubectl describe serviceaccount my-service-account -n production
# Annotation: eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/MyAppRole

Workload Identity sur GKE fonctionne selon le même principe : un service account Kubernetes est lié à un service account Google Cloud IAM, permettant l'accès aux APIs GCP sans clé de service account statique vulnérable au vol.

# Configurer Workload Identity sur GKE
# 1. Autoriser le KSA à usurper l'identité du GSA
gcloud iam service-accounts add-iam-policy-binding   --role roles/iam.workloadIdentityUser   --member "serviceAccount:MY_PROJECT.svc.id.goog[NAMESPACE/KSA_NAME]"   GSA_NAME@MY_PROJECT.iam.gserviceaccount.com

# 2. Annoter le service account Kubernetes
kubectl annotate serviceaccount KSA_NAME   --namespace NAMESPACE   iam.gke.io/gcp-service-account=GSA_NAME@MY_PROJECT.iam.gserviceaccount.com

# 3. Vérifier que le pod utilise le bon service account
kubectl exec -it my-pod --   curl -H "Metadata-Flavor: Google"   "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email"

Pour les audits de sécurité approfondis sur ces environnements cloud, notre livre blanc pentest cloud AWS/Azure/GCP détaille les vecteurs d'attaque spécifiques à chaque fournisseur, dont l'exploitation des identités de workload mal configurées. Notre équipe peut réaliser un audit de sécurité Kubernetes complet de votre infrastructure, de l'analyse RBAC à la validation des politiques réseau.

Les erreurs de configuration RBAC Kubernetes ne sont pas une fatalité. Avec une stratégie d'audit régulier, des outils adaptés et l'application rigoureuse du principe de moindre privilège, il est possible de réduire drastiquement la surface d'attaque de votre cluster. Pour les organisations souhaitant un accompagnement continu, le recours à un RSSI externalisé spécialisé en cloud-native permet d'intégrer ces bonnes pratiques dans le cycle de développement et d'assurer une veille constante sur les nouvelles techniques d'attaque Kubernetes.

Questions fréquentes

Quelle est la différence entre Role et ClusterRole en Kubernetes RBAC ?

Un Role est scoped à un namespace spécifique — ses règles s'appliquent uniquement aux ressources dans ce namespace. Un ClusterRole est global et s'applique à l'ensemble du cluster, y compris les ressources sans namespace (nodes, PersistentVolumes, ClusterRoleBindings). La bonne pratique est d'utiliser des Roles namespacés par défaut et de réserver les ClusterRoles aux cas strictement nécessaires. Un ClusterRole peut également être référencé depuis un RoleBinding pour en restreindre la portée à un seul namespace.

Comment détecter rapidement si mon cluster présente des problèmes RBAC critiques ?

Trois commandes couvrent 80 % des erreurs critiques : kubectl get clusterrolebindings -o json | jq '.items[] | select(.roleRef.name=="cluster-admin") | .subjects' pour l'abus cluster-admin, kubectl get clusterroles -o json | jq '.items[] | select(.rules[]?.verbs[]? == "*") | .metadata.name' pour les wildcards, et le lancement de kube-bench pour l'analyse CIS Benchmark complète. Ces trois contrôles détectent les configurations les plus exploitées par les attaquants en conditions réelles.

Est-il possible de migrer progressivement vers des permissions RBAC plus strictes sans interrompre la production ?

Oui, en adoptant une approche par étapes éprouvée : activez d'abord l'audit logging pour cartographier l'usage réel des permissions existantes sur 30 jours, puis créez de nouveaux rôles restrictifs en parallèle des anciens, basculez progressivement les workloads en commençant par les environnements non-critiques, et supprimez les anciens rôles une fois la migration validée en production. L'activation du mode dry-run de Polaris permet de simuler l'impact des nouvelles politiques sans affecter le cluster.

Les Pod Security Admission remplacent-ils le RBAC pour sécuriser les pods ?

Non, ce sont deux mécanismes complémentaires et non substituables. Le RBAC contrôle qui peut effectuer des actions sur l'API Kubernetes — créer, modifier, supprimer des ressources. Pod Security Admission contrôle comment les pods peuvent être configurés — interdire les pods privilégiés, les montages hostPath, l'usage du réseau hôte. Un attaquant disposant de la permission create pods est bloqué par le PSA si le namespace est configuré en mode restricted. Les deux couches sont absolument nécessaires en production.

Quels sont les risques RBAC spécifiques aux pipelines CI/CD Kubernetes ?

Les pipelines CI/CD sont des cibles privilégiées car ils nécessitent des permissions étendues (déployer, mettre à jour des images, gérer des ConfigMaps) tout en étant exposés à des dépendances tierces potentiellement compromises. Les bonnes pratiques incluent : un service account dédié par pipeline avec permissions minimales strictes, des tokens à courte durée de vie via IRSA ou Workload Identity, une séparation physique des clusters CI et production, et l'audit systématique de toutes les actions du pipeline dans les logs Kubernetes avec des alertes Falco sur les comportements anormaux.

Les techniques et commandes présentées dans cet article sont à des fins d'audit de sécurité et de sécurisation des infrastructures Kubernetes uniquement. Toute tentative d'exploitation de vulnérabilités RBAC sur des systèmes sans autorisation écrite préalable est illégale et passible de poursuites pénales.

Votre infrastructure Kubernetes présente des risques RBAC ? Nos experts réalisent un audit de sécurité Kubernetes complet avec rapport de remédiation priorisé et accompagnement à la correction. Contactez notre équipe pour un premier échange sans engagement.