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