Introduction
Le contrôle d'accès basé sur les rôles (RBAC) de Kubernetes gère qui peut faire quoi dans un cluster. Les ClusterRoles sont des règles à portée de cluster qui accordent des autorisations sur tous les espaces de noms. Lorsqu'un ClusterRole, un ClusterRoleBinding ou un ServiceAccount associé est mal configuré, les charges de travail échouent avec des erreurs d'autorisation, les déploiements s'arrêtent et le débogage sans chemin clair fait perdre du temps.
Ce guide se concentre sur les erreurs courantes de ClusterRole et les correctifs pratiques. Il s'adresse aux développeurs, aux consultants DevOps et aux équipes techniques de startups qui exploitent des clusters Kubernetes et doivent passer d'une défaillance observée à une résolution vérifiée. Vous apprendrez à inspecter les ressources RBAC, à interpréter les messages d'erreur, à appliquer des corrections minimales et à vérifier que l'accès fonctionne comme prévu.
L'objectif est la sécurité opérationnelle : observer avant de modifier, limiter le rayon d'impact, ne jamais exposer de secrets, vérifier le résultat et documenter les étapes de récupération lorsque l'état attendu n'est pas atteint.
Inventaire de la version et de l'environnement
Avant de modifier toute configuration RBAC, enregistrez les détails de l'environnement et l'état actuel. Cela évite d'aggraver les erreurs et permet une récupération.
Commencez par vérifier la version du serveur Kubernetes, les ressources API disponibles et le mode d'autorisation RBAC. Exécutez les commandes en lecture seule suivantes :
kubectl version --short
kubectl api-versions | grep rbac.authorization.k8s.io
kubectl cluster-info dump | grep authorization-mode
La sortie attendue comprend des lignes similaires à :
Client Version: v1.29.1
Server Version: v1.28.3
rbac.authorization.k8s.io/v1
--authorization-mode=Node,RBAC
Si rbac.authorization.k8s.io/v1 est absent, le cluster n'a pas RBAC activé et les ressources ClusterRole ne fonctionneront pas. Assurez-vous que le serveur API est démarré avec --authorization-mode=RBAC. Il s'agit d'un paramètre du plan de contrôle, pas de quelque chose que l'on corrige avec kubectl.
Ensuite, vérifiez que vous pouvez lister les ClusterRoles et ClusterRoleBindings :
kubectl get clusterroles
kubectl get clusterrolebindings
Si vous recevez Error from server (Forbidden): clusterroles.rbac.authorization.k8s.io is forbidden, votre propre utilisateur ou ServiceAccount n'a pas la permission de voir les objets RBAC. Vous devrez peut-être utiliser un contexte administrateur ou demander l'accès.
Pour inspecter un ClusterRole spécifique et ses liaisons, exécutez :
kubectl describe clusterrole view
kubectl describe clusterrolebinding view-binding
La sortie de description montre les règles, les sujets et les étiquettes. Par exemple, le ClusterRole intégré view a des règles qui autorisent get, list et watch sur la plupart des ressources, mais pas create ni delete.
Prérequis et portée
Ce guide suppose :
- Kubernetes 1.22 ou ultérieur, où
rbac.authorization.k8s.io/v1est stable. kubectlconfiguré avec des permissions suffisantes pour inspecter les objets RBAC.- Une compréhension de base des objets Kubernetes : Pod, Deployment, ServiceAccount, Role, ClusterRole et RoleBinding.
Si vous testez un changement, gardez la portée petite. Appliquez un seul manifeste, inspectez les ressources générées, puis vérifiez l'accès avec kubectl auth can-i avant de déployer en production.
Chemin de configuration sécurisé
Les mauvaises configurations RBAC proviennent souvent de rôles trop permissifs ou de liaisons incorrectes. La voie sûre est d'observer, de planifier, d'appliquer un changement minimal et de vérifier. Ne devinez jamais les permissions et n'appliquez jamais de caractères génériques * sans comprendre le rayon d'impact.
Étape 1 : Observer l'accès actuel
Avant de changer quoi que ce soit, déterminez la défaillance exacte. Utilisez kubectl auth can-i pour tester les permissions en usurpant un ServiceAccount ou un utilisateur :
kubectl auth can-i list pods --as=system:serviceaccount:default:my-sa -n default
Si le résultat est no, le ServiceAccount n'a pas la permission. Inversement, pour voir si un utilisateur peut supprimer des nœuds :
kubectl auth can-i delete nodes --as=alice
Enregistrez ces résultats avec un horodatage.
Étape 2 : Examiner les objets RBAC existants
Exportez le ClusterRole et le ClusterRoleBinding actuels pour le sujet défaillant :
kubectl get clusterrole my-role -o yaml > my-role-backup.yaml
kubectl get clusterrolebinding my-binding -o yaml > my-binding-backup.yaml
Inspectez le YAML pour les règles et les sujets. Recherchez les problèmes courants :
- Champ
apiGroupsmanquant (par défaut au groupe core, qui est généralement"", pas"*"). - Noms de ressources incorrects (par exemple,
podsau lieu depod). - Verbes non inclus (
readn'est pas un verbe valide ; utilisezget,list,watch). - Inadéquation du type de sujet (par exemple, utiliser
Useralors que le sujet est unServiceAccount). - Confusion d'espace de noms : ClusterRole est à l'échelle du cluster, mais un RoleBinding n'accorde l'accès que dans un seul espace de noms.
Étape 3 : Appliquer un correctif minimal
Créez ou corrigez le ClusterRole avec le moindre privilège requis. Par exemple, pour permettre à un ServiceAccount de lire les pods dans tous les espaces de noms, créez un ClusterRole :
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
Ensuite, liez-le au ServiceAccount avec un ClusterRoleBinding :
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: pod-reader-binding
subjects:
- kind: ServiceAccount
name: my-sa
namespace: default
roleRef:
kind: ClusterRole
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Appliquez la liaison :
kubectl apply -f pod-reader-binding.yaml
Étape 4 : Vérifier l'accès
Vérifiez immédiatement avec kubectl auth can-i :
kubectl auth can-i list pods --as=system:serviceaccount:default:my-sa -n kube-system
Sortie attendue : yes (puisque ClusterRole accorde la liste à l'échelle du cluster). Si la sortie est toujours no, revérifiez le type et le nom du sujet.
Gardez toujours le changement limité à un seul ClusterRole ou ClusterRoleBinding. Ne modifiez pas plusieurs objets RBAC en une seule étape.
Vérification et diagnostics
Après avoir appliqué un correctif, vous devez vérifier que l'accès prévu fonctionne. Cette section couvre les commandes de diagnostic, les messages d'erreur courants et leur signification.
Commandes de diagnostic standard
Utilisez ces commandes en lecture seule pour recueillir des informations :
kubectl get clusterrole <name> -o yaml
kubectl get clusterrolebinding <name> -o yaml
kubectl describe clusterrole <name>
kubectl describe clusterrolebinding <name>
kubectl auth can-i --list --as=system:serviceaccount:default:my-sa
L'indicateur --list montre toutes les permissions du sujet. Recherchez des permissions * inattendues ou des entrées manquantes.
Vérifiez les journaux d'audit du serveur API (si activés) pour les décisions d'autorisation :
kubectl logs -n kube-system kube-apiserver-control-plane | grep -i "forbidden"
Les journaux d'audit contiennent souvent la raison exacte du refus, comme RBAC: no rules found ou RBAC: denied by RBAC.
Interpréter les messages d'erreur courants
Lorsqu'un Pod échoue à cause de RBAC, vous pouvez voir des erreurs dans les journaux du Pod ou les événements :
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:my-sa" cannot list resource "pods" in API group "" in the namespace "default"
Cela signifie que le ServiceAccount my-sa dans l'espace de noms default n'a pas la permission list sur pods dans le groupe API core. Le correctif consiste à accorder list sur pods dans le Role ou ClusterRole approprié et à le lier.
Un autre échec typique dans les journaux d'application :
Failed to watch *v1.Pod: failed to list *v1.Pod: pods is forbidden: User "system:serviceaccount:monitoring:prometheus" cannot list resource "pods" in API group "" at the cluster scope
Ici, le ServiceAccount prometheus dans l'espace de noms monitoring tente de lister les pods à l'échelle du cluster. Cela nécessite un ClusterRole avec list sur pods et un ClusterRoleBinding.
Exemple concret de dépannage
Supposons qu'un Deployment app-deploy dans l'espace de noms production commence à échouer avec CrashLoopBackOff. Vérifiez les journaux du Pod :
kubectl logs -n production app-deploy-7d9f8c5b6-abcde --previous
Vous voyez :
Error: configmaps "app-config" is forbidden: User "system:serviceaccount:production:app-sa" cannot get resource "configmaps" in API group "" in the namespace "production"
Le ServiceAccount app-sa n'a pas la permission get sur les ConfigMaps dans l'espace de noms production. Vérifiez avec :
kubectl auth can-i get configmaps --as=system:serviceaccount:production:app-sa -n production
Sortie : no. Maintenant, inspectez les Roles et RoleBindings existants :
kubectl get role,rolebinding -n production
S'il existe un Role nommé config-reader mais pas de liaison pour app-sa, créez un RoleBinding :
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-sa-config-reader
namespace: production
subjects:
- kind: ServiceAccount
name: app-sa
namespace: production
roleRef:
kind: Role
name: config-reader
apiGroup: rbac.authorization.k8s.io
Appliquez et vérifiez :
kubectl apply -f rolebinding.yaml
kubectl auth can-i get configmaps --as=system:serviceaccount:production:app-sa -n production
La sortie devrait être yes. Ensuite, redémarrez le Deployment pour prendre en compte les changements :
kubectl rollout restart deployment/app-deploy -n production
kubectl rollout status deployment/app-deploy -n production
Cet exemple concret montre le cycle complet de diagnostic-correction-vérification.
Modes de défaillance et récupération
Même des changements prudents peuvent introduire des défaillances. Cette section répertorie les modes de défaillance courants des ClusterRoles, leurs signes et les étapes de récupération.
Mode de défaillance 1 : ClusterRole trop large
Un ClusterRole avec verbs: [""] et resources: [""] accorde un pouvoir illimité. Si un tel rôle est lié à un ServiceAccount compromis, le cluster est en danger.
Signe : Un audit de sécurité signale le rôle ; kubectl describe clusterrole <name> montre des caractères génériques.
Récupération : Révoquez immédiatement la liaison ou réduisez le rôle. Par exemple, supprimez le ClusterRoleBinding :
kubectl delete clusterrolebinding <binding-name>
Créez ensuite un rôle à moindre privilège avec des ressources et des verbes spécifiques, et reliez-le uniquement aux sujets requis.
Mode de défaillance 2 : Suppression accidentelle d'un ClusterRole
Si un ClusterRole critique est supprimé, les charges de travail qui en dépendent commencent à échouer avec des erreurs d'interdiction.
Signe : Plusieurs applications dans différents espaces de noms signalent des échecs d'autorisation.
Récupération : Restaurez le ClusterRole à partir d'une sauvegarde ou de la source Kubernetes. De nombreux ClusterRoles intégrés peuvent être recréés en appliquant le manifeste du dépôt Kubernetes. Si vous disposez d'un système GitOps, annulez le commit de suppression.
Pour récupérer manuellement, utilisez kubectl get clusterrole <name> -o yaml à partir d'un cluster de secours ou vérifiez votre outil de gestion de configuration.
Mode de défaillance 3 : Sujet incorrect dans ClusterRoleBinding
Un ClusterRoleBinding peut faire référence à un ServiceAccount inexistant ou à un User au lieu d'un ServiceAccount. La liaison existe mais n'a aucun effet.
Signe : kubectl get clusterrolebinding <name> montre le sujet, mais kubectl auth can-i renvoie toujours no pour ce sujet.
Récupération : Modifiez la liaison pour corriger le type et le nom du sujet :
kubectl edit clusterrolebinding <binding-name>
Modifiez la section subjects pour qu'elle corresponde au ServiceAccount ou à l'utilisateur réel. Vérifiez ensuite à nouveau l'accès.
Mode de défaillance 4 : Confusion entre espace de noms et portée de cluster
Utiliser un RoleBinding (avec espace de noms) avec un ClusterRole n'accorde des permissions que dans l'espace de noms du RoleBinding. Si l'application a besoin d'un accès à l'échelle du cluster, vous devez utiliser un ClusterRoleBinding.
Signe : La charge de travail dans l'espace de noms A fonctionne, mais la même charge de travail dans l'espace de noms B échoue avec une interdiction.
Récupération : Remplacez le RoleBinding par un ClusterRoleBinding :
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: my-cluster-binding
subjects:
- kind: ServiceAccount
name: my-sa
namespace: default
roleRef:
kind: ClusterRole
name: my-cluster-role
apiGroup: rbac.authorization.k8s.io
Appliquez le manifeste et vérifiez l'accès à l'échelle du cluster avec kubectl auth can-i --as=system:serviceaccount:default:my-sa list pods --all-namespaces.
Vérification de la récupération
Après toute récupération, vérifiez toujours :
kubectl auth can-irenvoieyespour les actions requises.- Aucun sujet non intentionnel n'a été ajouté à la liaison.
- Les fichiers de sauvegarde sont stockés dans un endroit sûr.
- Le changement est enregistré dans votre gestion des changements ou l'historique Git.
Si la récupération est impossible, envisagez de recréer les objets RBAC à partir de zéro en suivant le principe du moindre privilège, puis liez et testez.
Liste de contrôle opérationnelle
Utilisez cette liste de contrôle avant et après la modification des ClusterRoles pour éviter les erreurs courantes et assurer le bon fonctionnement.
Liste de contrôle avant changement
- [ ] Confirmer la version du cluster et l'activation de RBAC :
kubectl version,kubectl api-versions | grep rbac. - [ ] Identifier la défaillance exacte des permissions avec
kubectl auth can-i --listet les journaux d'application. - [ ] Exporter les YAML actuels des ClusterRole et ClusterRoleBinding vers des fichiers de sauvegarde avec horodatage.
- [ ] Déterminer les ressources, verbes et groupes API minimaux requis.
- [ ] S'assurer que le changement est limité à un seul objet RBAC.
- [ ] Avoir un plan de retour en arrière : savoir comment restaurer le YAML de sauvegarde.
Pendant le changement
- [ ] Appliquer le changement avec
kubectl apply -f <file>oukubectl edit. - [ ] Ne pas inclure de secrets dans le YAML ; utiliser des références ou des espaces réservés comme
CHANGE_MEuniquement dans les manifestes de test non productifs. - [ ] Pour des tests rapides, utiliser
--dry-run=clientet--dry-run=serverpour valider la syntaxe et l'acceptation par l'API. - [ ] Enregistrer les commandes exactes exécutées et leurs sorties.
Vérification après changement
- [ ] Exécuter
kubectl auth can-ien tant que sujet concerné pour chaque action requise. - [ ] Si applicable, redémarrer le Deployment affecté et vérifier l'état du Pod :
kubectl rollout restart deployment/<name>,kubectl rollout status deployment/<name>. - [ ] Surveiller les journaux pour toute erreur d'interdiction restante :
kubectl logs -f <pod>. - [ ] Examiner l'objet RBAC modifié avec
kubectl describe. - [ ] Confirmer qu'aucune autre application n'a été affectée par le changement.
Audit régulier
- [ ] Lister périodiquement tous les ClusterRoles et ClusterRoleBindings :
kubectl get clusterroles,clusterrolebindings. - [ ] Identifier les rôles inutilisés ou trop larges avec des outils comme
kubectl-who-canourakkess. - [ ] Supprimer les liaisons vers des sujets inexistants.
- [ ] Conserver les fichiers YAML RBAC dans le contrôle de version.
En suivant cette liste de contrôle, vous réduisez le risque de changements d'accès non intentionnels et améliorez la vitesse de récupération.
Conclusion
Les erreurs de ClusterRole dans Kubernetes sont courantes mais résolubles avec une observation systématique, des changements minimaux et une vérification approfondie. Ce guide a couvert la préparation de l'environnement, les étapes de configuration sécurisées, les commandes de diagnostic, les modes de défaillance et une liste de contrôle opérationnelle.
Commencez toujours par kubectl auth can-i pour confirmer l'écart de permission exact. Examinez les objets RBAC existants avant de les modifier. Appliquez le plus petit changement qui accorde l'accès requis. Vérifiez immédiatement avec des contrôles d'accès et des redémarrages de charge de travail. Gardez des sauvegardes et des plans de retour en arrière prêts.
La prochaine fois que vous rencontrerez une erreur Forbidden, utilisez les exemples concrets de ce guide pour diagnostiquer et corriger le problème sans deviner. N'oubliez pas : un flux de travail technique fiable rend la défaillance visible, protège les valeurs sensibles, limite les changements à la ressource prévue et définit la vérification de la récupération avant qu'un incident ne force la décision.