Chapitre 9.1 - RBAC (Role-Based Access Control)
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Comprendre ce qu'est RBAC et pourquoi l'utiliser
- Créer des Roles et ClusterRoles
- Créer des RoleBindings et ClusterRoleBindings
- Comprendre les verbs et resources
- Gérer les permissions des utilisateurs et Service Accounts
- Appliquer le principe du moindre privilège
Introduction
RBAC (Role-Based Access Control) est le mécanisme d'autorisation de Kubernetes qui permet de contrôler qui peut faire quoi dans le cluster. Il est essentiel pour la sécurité et la conformité.
Concepts Clés
Roles vs ClusterRoles
Role: Permissions dans un namespace spécifique
ClusterRole: Permissions au niveau du cluster (tous les namespaces)
RoleBindings vs ClusterRoleBindings
RoleBinding: Lie un Role à des utilisateurs dans un namespace
ClusterRoleBinding: Lie un ClusterRole à des utilisateurs au niveau du cluster
Création d'un Role
Role Basique
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # Groupe API core (pas de préfixe)
resources: ["pods"]
verbs: ["get", "watch", "list"]
Résultat: Permet de lire les Pods dans le namespace default.
Role avec Plusieurs Ressources
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: app-manager
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
Création d'un ClusterRole
ClusterRole pour Nodes
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "watch", "list"]
Résultat: Permet de lire les nodes dans tout le cluster.
ClusterRole avec ResourceNames
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["my-secret", "another-secret"]
verbs: ["get", "list"]
Résultat: Accès seulement aux secrets spécifiés.
Verbs (Actions)
Les verbs définissent les actions autorisées:
| Verb | Description |
|---|---|
get | Lire une ressource |
list | Lister des ressources |
watch | Surveiller des ressources |
create | Créer une ressource |
update | Mettre à jour une ressource |
patch | Modifier partiellement une ressource |
delete | Supprimer une ressource |
deletecollection | Supprimer plusieurs ressources |
Wildcard: * pour toutes les actions.
Resources
Les resources sont les objets Kubernetes:
pods,services,configmaps,secretsdeployments,replicasets,statefulsetsnodes,namespaces,persistentvolumes- Etc.
Wildcard: * pour toutes les ressources.
RoleBinding
Lier un Role à un Utilisateur
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Lier un Role à un ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: my-app-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Lier un ClusterRole à un Utilisateur (Namespace Scope)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-nodes
namespace: default
subjects:
- kind: User
name: bob
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io
Résultat: Bob peut lire les nodes, mais seulement dans le namespace default.
ClusterRoleBinding
Lier un ClusterRole au Niveau du Cluster
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding
subjects:
- kind: User
name: admin
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
Résultat: L'utilisateur admin a les permissions de cluster-admin dans tout le cluster.
Roles Prédéfinis
Kubernetes fournit des ClusterRoles prédéfinis:
cluster-admin
Accès complet au cluster:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- nonResourceURLs: ["*"]
verbs: ["*"]
admin
Accès complet dans un namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
edit
Peut modifier les ressources (sauf RBAC):
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: edit
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["*"]
verbs: [] # Pas d'accès RBAC
view
Lecture seule:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: view
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list", "watch"]
Exemple Complet: Développeur
Étape 1: Créer le Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: development
name: developer
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
Étape 2: Créer le RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-binding
namespace: development
subjects:
- kind: User
name: developer1
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.io
Résultat: developer1 peut gérer les applications dans le namespace development.
Commandes Utiles
Vérification
# Voir les Roles
kubectl get roles
kubectl get rolebinding
# Voir les ClusterRoles
kubectl get clusterroles
kubectl get clusterrolebinding
# Détails
kubectl describe role pod-reader
kubectl describe rolebinding read-pods
# Vérifier les permissions
kubectl auth can-i create pods --namespace=default
kubectl auth can-i delete deployments --namespace=production
Test des Permissions
# Tester en tant qu'utilisateur
kubectl get pods --as=developer1
# Voir les permissions d'un utilisateur
kubectl auth can-i --list --as=developer1 --namespace=development
Bonnes Pratiques
1. Principe du Moindre Privilège
Donner seulement les permissions nécessaires.
2. Roles Spécifiques
Créer des roles spécifiques plutôt que d'utiliser cluster-admin.
3. Namespace Isolation
Utiliser des namespaces pour isoler les environnements.
4. Service Accounts
Utiliser des Service Accounts pour les applications plutôt que des utilisateurs.
5. Audit
Activer l'audit logging pour tracer les accès.
Résumé
Dans ce chapitre, vous avez appris:
RBAC: Contrôle d'accès basé sur les rôles
Roles: Permissions dans un namespace
ClusterRoles: Permissions au niveau du cluster
RoleBindings: Lier des rôles à des utilisateurs/ServiceAccounts
Verbs: Actions autorisées (get, list, create, update, delete, etc.)
Resources: Objets Kubernetes (pods, services, deployments, etc.)
Roles prédéfinis: cluster-admin, admin, edit, view
Bonnes pratiques: Moindre privilège, roles spécifiques, isolation
Prochaines Étapes
Chapitre 9.2: Service Accounts
Chapitre 9.3: Network Policies
Lab 9.1: Configuration de RBAC pour un Utilisateur
Chapitre créé le: Décembre 2024