## Introduction

Le contrôle d'accès basé sur les rôles (RBAC, Role-Based Access Control) de Kubernetes est une pierre angulaire de la sécurité du cluster. Parmi ses ressources, le ClusterRoleBinding est particulièrement puissant car il accorde des permissions sur tous les espaces de noms ou sur des ressources de portée cluster. Un ClusterRoleBinding mal configuré peut exposer des données sensibles, permettre une escalade de privilèges ou perturber l'accès des applications. Cet article fournit une liste de contrôle des opérations de production avec des exemples pratiques. Ce n'est pas une introduction conceptuelle au RBAC ; il suppose que vous comprenez déjà les bases de ClusterRole, RoleBinding et ServiceAccount, et se concentre sur les tâches quotidiennes, les commandes et les vérifications nécessaires pour exploiter les ClusterRoleBindings en toute sécurité dans un environnement réel. En suivant cette liste de contrôle, vous réduirez le risque d'accès non intentionnel, pourrez vérifier et auditer efficacement les liaisons et récupérer rapidement des erreurs.

## Inventaire de la version et de l'environnement

Avant d'effectuer toute modification, vous devez connaître votre environnement Kubernetes. Le RBAC est stable dans les versions récentes de Kubernetes, mais il existe des différences subtiles, notamment avec les ClusterRoles agrégés et la découverte d'API. Documentez les éléments suivants :

- Version du serveur Kubernetes : exécutez kubectl version --short . Sortie attendue : Client Version: v1.27.3 et Server Version: v1.27.3 . Si la version du serveur est inférieure à 1.6, le RBAC n'est pas activé par défaut ; la plupart des clusters modernes l'ont.

- Mode d'autorisation du serveur API : vérifiez le manifeste kube-apiserver ou les arguments du processus. Recherchez --authorization-mode=RBAC,Node . Si RBAC n'est pas listé, les ClusterRoleBindings n'ont aucun effet.

- ClusterRoleBindings existants : listez-les avec kubectl get clusterrolebindings . Notez le nombre et les noms personnalisés.

- Inventaire des espaces de noms : kubectl get namespaces pour savoir où les rôles et les utilisateurs sont délimités.

- Inventaire des utilisateurs/ServiceAccounts : si vous utilisez une authentification externe (OIDC, LDAP), notez comment les utilisateurs sont mappés aux groupes. Les ServiceAccounts sont critiques car les liaisons les référencent souvent.

Prérequis pour une exploitation sûre : accès administratif au cluster, un mécanisme de sauvegarde pour les objets RBAC (par exemple, dépôt git ou instantanés etcd), et un espace de noms ou cluster de test pour la validation en dry-run. Pour la production, assurez-vous de pouvoir revenir rapidement en arrière. Une pratique courante consiste à stocker tous les manifestes RBAC dans un système de contrôle de version et à les appliquer via un processus contrôlé.

Exemple : pour capturer l'état actuel, exécutez :

kubectl get clusterrolebindings -o yaml > clusterrolebindings-backup-$(date +%Y%m%d).yaml 
 Cette commande crée un fichier de sauvegarde horodaté. Vérifiez que le fichier a du contenu : wc -l clusterrolebindings-backup-*.yaml doit renvoyer un nombre de lignes supérieur à zéro.

<style>
.eno-quiz-widget{margin:2rem 0;padding:1.5rem;border-radius:12px;background:var(--eno-surface-lowest,#f7f7f8);border:1px solid var(--eno-border-soft,#e2e2e6);font-family:var(--eno-font-body,Inter,sans-serif)}
.eno-quiz-widget .eno-quiz-kicker{font-family:var(--eno-font-label,"JetBrains Mono",monospace);font-size:.75rem;letter-spacing:.05em;text-transform:uppercase;color:var(--eno-text-muted,#5f5f68);margin:0 0 .5rem}
.eno-quiz-widget .eno-quiz-question{font-family:var(--eno-font-heading,"Hanken Grotesk",sans-serif);font-size:1.0625rem;font-weight:600;margin:0 0 1rem;color:var(--eno-text-strong,#1a1a1f)}
.eno-quiz-widget .eno-quiz-options{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}
.eno-quiz-widget .eno-quiz-option{display:block;width:100%;min-height:44px;text-align:left;padding:.625rem .875rem;border-radius:8px;border:1.5px solid var(--eno-border-soft,#e2e2e6);background:#fff;font-size:.9375rem;cursor:pointer;transition:border-color var(--eno-motion-base,180ms ease-out),background var(--eno-motion-base,180ms ease-out)}
.eno-quiz-widget .eno-quiz-option:hover{border-color:var(--eno-primary,#0059bb)}
.eno-quiz-widget .eno-quiz-option:focus-visible{outline:none;box-shadow:0 0 0 3px rgb(0 89 187 / 0.15)}
.eno-quiz-widget .eno-quiz-option[aria-pressed="true"]{border-color:var(--eno-primary,#0059bb);background:rgb(0 89 187 / 0.06)}
.eno-quiz-widget .eno-quiz-option[data-correct="true"].eno-quiz-revealed{border-color:var(--eno-success,#17803a);background:rgb(23 128 58 / 0.08)}
.eno-quiz-widget .eno-quiz-option[data-correct="false"].eno-quiz-revealed.eno-quiz-was-selected{border-color:var(--eno-error,#ba1a1a);background:var(--eno-error-soft,#ffdad6)}
.eno-quiz-widget .eno-quiz-option-icon{display:inline-block;width:1.1em;margin-right:.4em;font-weight:700}
.eno-quiz-widget .eno-quiz-submit{margin-top:1rem;min-height:44px;padding:.5rem 1.25rem;border-radius:8px;border:none;background:var(--eno-primary,#0059bb);color:#fff;font-weight:600;font-size:.9375rem;cursor:pointer;transition:opacity var(--eno-motion-base,180ms ease-out)}
.eno-quiz-widget .eno-quiz-submit:disabled{opacity:.5;cursor:not-allowed}
.eno-quiz-widget .eno-quiz-submit:focus-visible{outline:none;box-shadow:0 0 0 3px rgb(0 89 187 / 0.15)}
.eno-quiz-widget .eno-quiz-explanation{margin-top:1rem;padding:.875rem 1rem;border-radius:8px;font-size:.9375rem;line-height:1.5;display:none}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-visible{display:block}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-correct{background:rgb(23 128 58 / 0.08);color:var(--eno-success,#17803a)}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-incorrect{background:var(--eno-error-soft,#ffdad6);color:var(--eno-error,#ba1a1a)}
@media (prefers-reduced-motion: reduce){.eno-quiz-widget *{transition:none!important}}
</style><div class="eno-quiz-widget" role="group" aria-label="Question rapide">
Question rapide 1 sur 2

Quelle est la différence entre un Role et un ClusterRole dans RBAC ?

- Un Role est de portée cluster, tandis qu'un ClusterRole est de portée namespace
- Un Role est de portée namespace, tandis qu'un ClusterRole est non namespacé
- Les deux sont de portée namespace
- Les deux sont non namespacés

<button type="button" class="eno-quiz-submit" disabled>Valider</button>
<div class="eno-quiz-explanation">Un Role définit toujours des permissions dans un namespace particulier, tandis qu&#39;un ClusterRole est une ressource non namespacée.</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
  document.querySelectorAll('.eno-quiz-widget:not([data-eno-quiz-bound])').forEach(function (widget) {
    widget.setAttribute('data-eno-quiz-bound', '1');
    var options = Array.prototype.slice.call(widget.querySelectorAll('.eno-quiz-option'));
    var submitBtn = widget.querySelector('.eno-quiz-submit');
    var explanation = widget.querySelector('.eno-quiz-explanation');
    var selected = null;
    options.forEach(function (opt) {
      opt.addEventListener('click', function () {
        if (widget.hasAttribute('data-eno-quiz-answered')) return;
        options.forEach(function (o) { o.setAttribute('aria-pressed', 'false'); });
        opt.setAttribute('aria-pressed', 'true');
        selected = opt;
        submitBtn.disabled = false;
      });
    });
    submitBtn.addEventListener('click', function () {
      if (!selected || widget.hasAttribute('data-eno-quiz-answered')) return;
      widget.setAttribute('data-eno-quiz-answered', '1');
      submitBtn.disabled = true;
      var correct = selected.getAttribute('data-correct') === 'true';
      options.forEach(function (o) {
        o.classList.add('eno-quiz-revealed');
        if (o === selected) o.classList.add('eno-quiz-was-selected');
        var icon = o.querySelector('.eno-quiz-option-icon');
        if (o.getAttribute('data-correct') === 'true') icon.textContent = '\u2713';
        else if (o === selected) icon.textContent = '\u2717';
      });
      explanation.classList.add('eno-quiz-visible', correct ? 'eno-quiz-correct' : 'eno-quiz-incorrect');
    });
  });
});
</script>

## Chemin de configuration sûr

Le principe du moindre privilège dicte que les ClusterRoleBindings ne doivent accorder que les permissions nécessaires à une tâche. Évitez de lier à des ClusterRoles larges comme cluster-admin sauf si absolument nécessaire. Préférez les RoleBindings dans un espace de noms lorsque l'accès peut être limité. Si un accès à l'échelle du cluster est nécessaire, créez un ClusterRole dédié avec des règles minimales.

### Choix d'implémentation délimités

- Utilisez le préfixe system: pour les rôles intégrés afin d'éviter les conflits ; les rôles personnalisés ne doivent pas utiliser ce préfixe.

- Pour les comptes de service, utilisez un ServiceAccount séparé par application et liez-le à un ClusterRole spécifique.

- Pour l'accès utilisateur, liez à des groupes plutôt qu'à des utilisateurs individuels lorsque c'est possible, car l'appartenance au groupe est gérée en externe.

### Exemple pas à pas : création d'un ClusterRole à moindre privilège et liaison

- Définissez un ClusterRole qui permet de lire les pods dans tous les espaces de noms (pour la surveillance) :

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
 name: pod-reader
rules:
- apiGroups: [""]
 resources: ["pods"]
 verbs: ["get", "list", "watch"] 
 Appliquez-le : kubectl apply -f pod-reader-clusterrole.yaml . Sortie attendue : clusterrole.rbac.authorization.k8s.io/pod-reader created .

- Créez un ServiceAccount dans l'espace de noms monitoring :

kubectl create serviceaccount monitoring-sa -n monitoring 
 Sortie attendue : serviceaccount/monitoring-sa created .

- Liez le ClusterRole au ServiceAccount :

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
 name: monitoring-sa-pod-reader
subjects:
- kind: ServiceAccount
 name: monitoring-sa
 namespace: monitoring
roleRef:
 kind: ClusterRole
 name: pod-reader
 apiGroup: rbac.authorization.k8s.io 
 Appliquez-le : kubectl apply -f clusterrolebinding.yaml . Sortie attendue : clusterrolebinding.rbac.authorization.k8s.io/monitoring-sa-pod-reader created .

### Dry-run et diff

Testez toujours avec --dry-run=client ou --dry-run=server avant d'appliquer en production. Par exemple :

kubectl apply -f clusterrolebinding.yaml --dry-run=client 
 Sortie attendue : clusterrolebinding.rbac.authorization.k8s.io/monitoring-sa-pod-reader created (dry run) .

Pour un objet existant, utilisez kubectl diff pour voir les changements :

kubectl diff -f clusterrolebinding.yaml 
 Cela montre les différences entre l'objet actuel en direct et le fichier. S'il n'y a pas de différences, il n'y a pas de sortie.

## Vérification et diagnostics

Après avoir créé ou modifié un ClusterRoleBinding, vous devez vérifier que l'accès prévu est accordé et qu'aucun accès non intentionnel n'est introduit.

### Commandes de vérification

- Lister les liaisons : kubectl get clusterrolebindings affiche NOM et RÔLE. Vérifiez que la liaison souhaitée existe.

- Décrire une liaison : kubectl describe clusterrolebinding monitoring-sa-pod-reader donne des détails complets comprenant les sujets, le rôle et les étiquettes.

- Vérifier les permissions effectives : utilisez kubectl auth can-i --list --as=system:serviceaccount:monitoring:monitoring-sa pour lister toutes les permissions de ce compte de service. Vérifiez qu'il inclut get , list , watch sur les pods et exclut les autres.

Exemple :

kubectl auth can-i list pods --as=system:serviceaccount:monitoring:monitoring-sa --all-namespaces 
 Sortie attendue : yes .

Pour tester une action interdite :

kubectl auth can-i delete pods --as=system:serviceaccount:monitoring:monitoring-sa --all-namespaces 
 Sortie attendue : no .

### Audit des liaisons existantes

Auditez régulièrement les liaisons pour détecter les rôles trop permissifs. Utilisez un script pour trouver les liaisons qui référencent cluster-admin :

kubectl get clusterrolebindings -o json | jq -r '.items[] | select(.roleRef.name=="cluster-admin") | .metadata.name' 
 Cela liste tous les ClusterRoleBindings qui accordent cluster-admin . Examinez chacun pour voir s'il est nécessaire.

Vérifiez également les liaisons vers des comptes de service dans kube-system qui peuvent être trop larges. Certains composants système nécessitent certaines permissions, mais les ajouts personnalisés doivent être examinés attentivement.

<style>
.eno-quiz-widget{margin:2rem 0;padding:1.5rem;border-radius:12px;background:var(--eno-surface-lowest,#f7f7f8);border:1px solid var(--eno-border-soft,#e2e2e6);font-family:var(--eno-font-body,Inter,sans-serif)}
.eno-quiz-widget .eno-quiz-kicker{font-family:var(--eno-font-label,"JetBrains Mono",monospace);font-size:.75rem;letter-spacing:.05em;text-transform:uppercase;color:var(--eno-text-muted,#5f5f68);margin:0 0 .5rem}
.eno-quiz-widget .eno-quiz-question{font-family:var(--eno-font-heading,"Hanken Grotesk",sans-serif);font-size:1.0625rem;font-weight:600;margin:0 0 1rem;color:var(--eno-text-strong,#1a1a1f)}
.eno-quiz-widget .eno-quiz-options{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}
.eno-quiz-widget .eno-quiz-option{display:block;width:100%;min-height:44px;text-align:left;padding:.625rem .875rem;border-radius:8px;border:1.5px solid var(--eno-border-soft,#e2e2e6);background:#fff;font-size:.9375rem;cursor:pointer;transition:border-color var(--eno-motion-base,180ms ease-out),background var(--eno-motion-base,180ms ease-out)}
.eno-quiz-widget .eno-quiz-option:hover{border-color:var(--eno-primary,#0059bb)}
.eno-quiz-widget .eno-quiz-option:focus-visible{outline:none;box-shadow:0 0 0 3px rgb(0 89 187 / 0.15)}
.eno-quiz-widget .eno-quiz-option[aria-pressed="true"]{border-color:var(--eno-primary,#0059bb);background:rgb(0 89 187 / 0.06)}
.eno-quiz-widget .eno-quiz-option[data-correct="true"].eno-quiz-revealed{border-color:var(--eno-success,#17803a);background:rgb(23 128 58 / 0.08)}
.eno-quiz-widget .eno-quiz-option[data-correct="false"].eno-quiz-revealed.eno-quiz-was-selected{border-color:var(--eno-error,#ba1a1a);background:var(--eno-error-soft,#ffdad6)}
.eno-quiz-widget .eno-quiz-option-icon{display:inline-block;width:1.1em;margin-right:.4em;font-weight:700}
.eno-quiz-widget .eno-quiz-submit{margin-top:1rem;min-height:44px;padding:.5rem 1.25rem;border-radius:8px;border:none;background:var(--eno-primary,#0059bb);color:#fff;font-weight:600;font-size:.9375rem;cursor:pointer;transition:opacity var(--eno-motion-base,180ms ease-out)}
.eno-quiz-widget .eno-quiz-submit:disabled{opacity:.5;cursor:not-allowed}
.eno-quiz-widget .eno-quiz-submit:focus-visible{outline:none;box-shadow:0 0 0 3px rgb(0 89 187 / 0.15)}
.eno-quiz-widget .eno-quiz-explanation{margin-top:1rem;padding:.875rem 1rem;border-radius:8px;font-size:.9375rem;line-height:1.5;display:none}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-visible{display:block}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-correct{background:rgb(23 128 58 / 0.08);color:var(--eno-success,#17803a)}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-incorrect{background:var(--eno-error-soft,#ffdad6);color:var(--eno-error,#ba1a1a)}
@media (prefers-reduced-motion: reduce){.eno-quiz-widget *{transition:none!important}}
</style><div class="eno-quiz-widget" role="group" aria-label="Question rapide">
Question rapide 2 sur 2

Selon le principe du moindre privilège, que doit-on attribuer aux utilisateurs et aux comptes de service ?

- Des permissions maximales pour plus de flexibilité
- Des droits RBAC minimaux
- Des droits cluster-admin
- Des permissions avec caractères génériques

<button type="button" class="eno-quiz-submit" disabled>Valider</button>
<div class="eno-quiz-explanation">Le principe du moindre privilège stipule que des droits RBAC minimaux doivent être attribués aux utilisateurs et aux comptes de service, uniquement les permissions explicitement requises.</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
  document.querySelectorAll('.eno-quiz-widget:not([data-eno-quiz-bound])').forEach(function (widget) {
    widget.setAttribute('data-eno-quiz-bound', '1');
    var options = Array.prototype.slice.call(widget.querySelectorAll('.eno-quiz-option'));
    var submitBtn = widget.querySelector('.eno-quiz-submit');
    var explanation = widget.querySelector('.eno-quiz-explanation');
    var selected = null;
    options.forEach(function (opt) {
      opt.addEventListener('click', function () {
        if (widget.hasAttribute('data-eno-quiz-answered')) return;
        options.forEach(function (o) { o.setAttribute('aria-pressed', 'false'); });
        opt.setAttribute('aria-pressed', 'true');
        selected = opt;
        submitBtn.disabled = false;
      });
    });
    submitBtn.addEventListener('click', function () {
      if (!selected || widget.hasAttribute('data-eno-quiz-answered')) return;
      widget.setAttribute('data-eno-quiz-answered', '1');
      submitBtn.disabled = true;
      var correct = selected.getAttribute('data-correct') === 'true';
      options.forEach(function (o) {
        o.classList.add('eno-quiz-revealed');
        if (o === selected) o.classList.add('eno-quiz-was-selected');
        var icon = o.querySelector('.eno-quiz-option-icon');
        if (o.getAttribute('data-correct') === 'true') icon.textContent = '\u2713';
        else if (o === selected) icon.textContent = '\u2717';
      });
      explanation.classList.add('eno-quiz-visible', correct ? 'eno-quiz-correct' : 'eno-quiz-incorrect');
    });
  });
});
</script>

## Modes de défaillance et récupération

Les erreurs dans les ClusterRoleBindings peuvent avoir de graves conséquences. Les modes de défaillance courants comprennent :

- Liaison trop permissive : lier accidentellement à cluster-admin donne un contrôle total. Cela peut se produire si un nom de ClusterRole incorrect est utilisé ou si un rôle intégré large est choisi sans examen.

- Liaison manquante : si une liaison nécessaire est supprimée ou non appliquée, les applications peuvent échouer avec des erreurs de permission refusée. Par exemple, un agent de surveillance peut ne pas pouvoir lister les pods.

- Sujet incorrect : lier au mauvais ServiceAccount ou utilisateur signifie que l'entité prévue n'a pas l'accès tandis qu'une entité non prévue l'obtient.

- Liaison vers un ClusterRole inexistant : le serveur API accepte un ClusterRoleBinding même si le ClusterRole référencé n'existe pas. La liaison n'a aucun effet jusqu'à ce que le rôle soit créé, ce qui peut prêter à confusion.

### Étapes de récupération

- Revenir à la sauvegarde : si vous avez une sauvegarde de vos objets RBAC, vous pouvez restaurer un état antérieur. Par exemple, si vous avez sauvegardé tous les ClusterRoleBindings dans un fichier, réappliquez-le :

kubectl apply -f clusterrolebindings-backup-YYYYMMDD.yaml 
 Cela recréera les liaisons telles qu'elles étaient. Assurez-vous de ne pas écraser involontairement des modifications plus récentes.

- Supprimer une liaison trop large : supprimez la liaison problématique et recréez-la avec le moindre privilège :

kubectl delete clusterrolebinding monitoring-sa-pod-reader
kubectl apply -f correct-clusterrolebinding.yaml 
 Sortie attendue pour la suppression : clusterrolebinding.rbac.authorization.k8s.io "monitoring-sa-pod-reader" deleted .

- Corriger un sujet incorrect : utilisez kubectl edit clusterrolebinding <nom> pour modifier les sujets directement, ou appliquez un manifeste corrigé.

- Créer le rôle manquant : si la liaison référence un ClusterRole manquant, créez-le. Vérifiez avec kubectl get clusterrole <nom-du-rôle> .

- Tester après récupération : exécutez des commandes kubectl auth can-i en tant qu'utilisateur/compte de service affecté pour confirmer que les permissions sont correctes.

## Liste de contrôle des opérations

Le tableau suivant résume une liste de contrôle des opérations reproductible pour les ClusterRoleBindings. Elle doit être intégrée dans vos processus de gestion des changements et de revue périodique.

<div class="my-stack-md overflow-x-auto">
<table class="min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Étape</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Tâche</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Commande ou action</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Résultat attendu</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">1</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Sauvegarder les liaisons actuelles</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl get clusterrolebindings -o yaml &gt; backup.yaml</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Fichier créé</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">2</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Examiner l&#39;accès demandé</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Vérifier le moindre privilège</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Aucune permission inutile</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">3</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Tester les modifications en dry-run</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl apply -f file.yaml --dry-run=client</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Aucune erreur affichée</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">4</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Appliquer les modifications</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl apply -f file.yaml</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Objet créé/mis à jour</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">5</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Vérifier l&#39;accès</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl auth can-i --list --as=...</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Permissions attendues présentes</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">6</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Auditer les liaisons à haut risque</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl get clusterrolebindings -o json | jq ...</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Liste examinée</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">7</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Documenter le changement</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Mettre à jour le journal des changements ou le ticket</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Enregistré</td></tr></tbody>
</table>
</div>

### Liste de contrôle de revue périodique

- Chaque trimestre, listez tous les ClusterRoleBindings et identifiez les propriétaires. Supprimez les liaisons qui ne sont plus nécessaires.

- Vérifiez les liaisons vers cluster-admin et exigez une justification.

- Recherchez les ServiceAccounts dans l'espace de noms default qui ont des permissions à l'échelle du cluster ; déplacez-les vers des espaces de noms dédiés.

- Vérifiez que les groupes d'authentification externe sont mappés correctement.

- Exécutez des outils automatisés comme kube-rbac-proxy ou kubectl-who-can pour analyser les permissions.

Exemple d'utilisation de kubectl-who-can (à installer séparément) :

kubectl who-can list pods --all-namespaces 
 Cela liste tous les sujets qui peuvent lister les pods dans tous les espaces de noms. Utilisez-le pour détecter les accès trop larges.

## Conclusion

L'exploitation des ClusterRoleBindings Kubernetes en production nécessite une approche délibérée, pilotée par liste de contrôle. Cet article a fourni une liste de contrôle pratique couvrant l'inventaire des versions, la configuration sûre, la vérification, la récupération en cas de défaillance et les opérations continues. En suivant les étapes et les exemples, vous pouvez maintenir le moindre privilège, auditer efficacement et récupérer rapidement des erreurs. Commencez par un projet pilote étroit, comme la création d'un ClusterRole en lecture seule pour un compte de service de surveillance, et élargissez à mesure que vous gagnez en confiance. Sauvegardez toujours avant les modifications, faites des dry-runs, vérifiez avec kubectl auth can-i et documentez les décisions. Un système RBAC bien géré est fondamental pour la sécurité et la stabilité du cluster.