Aller au contenu principal

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:

VerbDescription
getLire une ressource
listLister des ressources
watchSurveiller des ressources
createCréer une ressource
updateMettre à jour une ressource
patchModifier partiellement une ressource
deleteSupprimer une ressource
deletecollectionSupprimer plusieurs ressources

Wildcard: * pour toutes les actions.


Resources​

Les resources sont les objets Kubernetes:

  • pods, services, configmaps, secrets
  • deployments, replicasets, statefulsets
  • nodes, 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