For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/containers-orchestration/managed-kubernetes/rbac-custom-kubeconfig-limited-access.md.

Utiliser le RBAC pour gérer un accès limité à un cluster OVHcloud Managed Kubernetes

Voir en Markdown

Découvrez comment utiliser la puissance du RBAC pour générer un fichier kubeconfig personnalisé avec un accès limité à un cluster OVHcloud Managed Kubernetes

Objectif

Lorsqu'un cluster Kubernetes est créé, via l'espace client OVHcloud, l'API ou le provider Terraform, vous pouvez récupérer son fichier kubeconfig afin d'accéder à votre cluster via la Command Line Interface (CLI) kubectl. Ce fichier kubeconfig est utilisé pour configurer l'accès à un cluster. Par défaut, ce fichier kubeconfig vous donne accès à tout ce qui se trouve dans le cluster.

Dans votre entreprise, vous avez peut-être plusieurs équipes, plusieurs types de personnes avec des droits différents. Vous pouvez avoir besoin de contrôler et de limiter l'accès à vos clusters Kubernetes en fonction des utilisateurs et de leurs rôles.

Chez OVHcloud, nous souhaitons vous proposer les meilleurs produits et services. Pour nous, la sécurité est importante. Ce tutoriel vise à vous aider à créer un fichier kubeconfig personnalisé avec des accès différenciés à votre cluster OVHcloud Managed Kubernetes.

Dans ce tutoriel, vous allez :

  • découvrir ce qu'est le RBAC
  • générer un fichier kubeconfig personnalisé avec un accès limité

RBAC

Le RBAC (Role-Based Access Control) est une méthode permettant de réguler l'accès à des ressources en fonction des rôles de chaque utilisateur.

Cette méthode vous permet de contrôler ce que vos utilisateurs peuvent faire pour quel type de ressources dans votre cluster.

Le RBAC introduit 4 objets Kubernetes :

  • Role (définit des permissions au sein d'un namespace donné)
  • ClusterRole (identique à Role mais à l'échelle du cluster, pour tous les namespaces)
  • RoleBinding (accorde les permissions définies dans un Role à un User, un Group (un ensemble d'utilisateurs) ou un ServiceAccount au sein d'un namespace)
  • ClusterRoleBinding (identique à RoleBinding mais pour tous les namespaces)

Lorsque vous créez un Role ou un ClusterRole, plusieurs opérations (verbes) sont autorisées :

  • create
  • get
  • delete
  • list
  • update
  • watch
  • ...

Par défaut dans Kubernetes, chaque namespace contient un ServiceAccount lié à un ClusterRole qui vous permet d'effectuer toutes les opérations souhaitées sur toutes les ressources de ce namespace. La création de nouveaux ServiceAccount, Role/ClusterRole et RoleBinding/ClusterRoleBinding vous permettra de contrôler l'accès à un cluster Kubernetes.

Prérequis

Ce tutoriel présuppose que vous disposez déjà d'un cluster OVHcloud Managed Kubernetes opérationnel, ainsi que de connaissances de base sur son fonctionnement.

Suivez également la documentation Déployer une application Hello World afin d'avoir un exemple d'application fonctionnant sur votre cluster.

À ce stade, vous devriez disposer d'un cluster Kubernetes opérationnel avec le déploiement et le pod hello-world, comme ci-dessous :

$ kubectl get pod,deploy -n hello-app
NAME                                          READY   STATUS    RESTARTS   AGE
pod/hello-world-deployment-5869476bbd-rvtdl   1/1     Running   0          4d2h

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-world-deployment   1/1     1            1           4d22h

L'idée est d'avoir un namespace différent du namespace par défaut et plusieurs ressources y étant exécutées.

En pratique

Dans ce tutoriel, nous souhaitons créer un fichier kubeconfig qui permet à quelqu'un d'accéder uniquement au namespace hello-app et de disposer uniquement de droits de lecture sur les ressources Pods de ce namespace.

Alors, que souhaitons-nous obtenir ?

Que souhaitons-nous obtenir

Pour ce cas d'usage donné, nous devons créer plusieurs ressources :

  • un ServiceAcount
  • un Role
  • un RoleBinding entre le Role et le ServiceAccount

Il est possible de créer les ressources listées ci-dessus en YAML, mais dans ce tutoriel nous allons vous montrer comment les créer directement avec la CLI kubectl.

Créez un ServiceAccount dans le namespace hello-app :

kubectl create serviceaccount sa-pod-reader -n hello-app

Créez un Role pod-reader qui permet aux utilisateurs d'effectuer les actions get, watch et list (actions en lecture uniquement) sur les Pods :

kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods -n hello-app

Créez un RoleBinding qui accorde le Role pod-reader au ServiceAccount sa-pod-reader au sein du namespace hello-app :

kubectl create rolebinding read-pods --role=pod-reader --serviceaccount=hello-app:sa-pod-reader -n hello-app

Il est maintenant temps de créer le fichier kubeconfig pour le ServiceAccount que vous venez de créer, avec les droits demandés, et d'obtenir un fichier kubeconfig pour ce ServiceAccount :

export SA=sa-pod-reader
export NAMESPACE=hello-app
export SECRET_NAME=pod-reader-secret

kubectl apply -f - <<EOF apiVersion: v1
kind: Secret
metadata:
  name: pod-reader-secret
  namespace: hello-app
  annotations:
    kubernetes.io/service-account.name: sa-pod-reader
type: kubernetes.io/service-account-token
EOF

export TOKEN_SA=`kubectl get secret $SECRET_NAME -n $NAMESPACE -ojsonpath='{.data.token}' | base64 -d`
kubectl config view --raw --minify > kubeconfig.txt
kubectl config unset users --kubeconfig=kubeconfig.txt
kubectl config set-credentials ${SECRET_NAME} --kubeconfig=kubeconfig.txt --token=${TOKEN_SA}
kubectl config set-context --current --kubeconfig=kubeconfig.txt --user=${SECRET_NAME}

Vous pouvez désormais utiliser ce fichier kubeconfig restreint pour accéder à votre cluster, et même le tester directement dans la commande kubectl avec l'option --kubeconfig.

Essayez de lister les namespaces de votre cluster :

kubectl get ns --kubeconfig=kubeconfig.txt

Vous devriez obtenir un résultat semblable à celui-ci :

$ kubectl get ns --kubeconfig=kubeconfig.txt
Error from server (Forbidden): namespaces is forbidden: User "system:serviceaccount:hello-app:sa-pod-reader" cannot list resource "namespaces" in API group "" at the cluster scope

Comme vous pouvez le constater, vous avez exécuté la commande kubectl en tant que ServiceAccount que vous avez créé avec un accès limité. Ce comportement est normal puisqu'avec ce fichier kubeconfig vous n'avez pas les droits nécessaires pour effectuer cette opération.

À la place, listez les pods du namespace hello-app :

$ kubectl get pod -n hello-app --kubeconfig=kubeconfig.txt
NAME                                      READY   STATUS    RESTARTS   AGE
hello-world-deployment-5869476bbd-rvtdl   1/1     Running   0          4h43m

Comme vous pouvez le constater, le nouveau fichier kubeconfig dispose d'un accès restreint à votre cluster Kubernetes.

En fonction de vos cas d'usage, vous devrez composer avec les ressources ServiceAcccount, Role, ClusterRole, RoleBinding et ClusterRoleBinding.

Pour plus d'informations, consultez la documentation officielle Using RBAC Authorization. Vous pouvez également utiliser un provider OIDC pour authentifier vos utilisateurs et leur assigner automatiquement des rôles.

Aller plus loin

  • Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.

  • Échangez avec notre communauté d'utilisateurs.

Cette page vous a-t-elle aidé ?