Dans cet exercice vous allez créer des ressources Role / RoleBinding / ClusterRole / ClusterRoleBinding afin de donner certains droits à un utilisateur du cluster.

Etat des lieux

Nous considérons qu’un utilisateur dont l’identifiant est thomas a le certificat nécessaire pour s’authentifier dans le cluster. Pour le moment aucun droit supplémentaire n’a été donné à cet utilisateur, vous pouvez le vérifier avec la commande suivante qui permet de se faire passer pour thomas et de lister les actions autorisées:

kubectl auth can-i --list --as thomas

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

Resources                                       Non-Resource URLs   Resource Names   Verbs
selfsubjectaccessreviews.authorization.k8s.io   []                  []               [create]
selfsubjectrulesreviews.authorization.k8s.io    []                  []               [create]
                                                [/api/*]            []               [get]
                                                [/api]              []               [get]
                                                [/apis/*]           []               [get]
                                                [/apis]             []               [get]
                                                [/healthz]          []               [get]
                                                [/healthz]          []               [get]
                                                [/livez]            []               [get]
                                                [/livez]            []               [get]
                                                [/openapi/*]        []               [get]
                                                [/openapi]          []               [get]
                                                [/readyz]           []               [get]
                                                [/readyz]           []               [get]
                                                [/version/]         []               [get]
                                                [/version/]         []               [get]
                                                [/version]          []               [get]
                                                [/version]          []               [get]

Ce résultat indique que l’utilisateur est autorisé à accéder à l’état de santé du cluster et quelques informations non sensibles.

Droit de lister les nodes

Vous allez à présent permettre à thomas de lister les nodes du cluster.

  • vérifier que l’utilisateur thomas n’a pas accès à cette action

En utilisant la commande suivante, confirmez que thomas ne peut pas faire cette action:

kubectl auth can-i list nodes --as thomas

Vous devriez obtenir le message suivant:

Warning: resource 'nodes' is not namespace scoped
no
  • Création du ClusterRole

Copiez la spécification suivante dans le fichier list-nodes.yaml, celle-ci définit une ressource ClusterRole permettant de lister les nodes du cluster:

list-nodes.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: list-nodes
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - list

Créez ensuite cette ressource:

kubectl apply -f list-nodes.yaml

Vous pouvez également créer ce ClusterRole avec la commande impérative suivante:

kubectl create clusterrole list-nodes --verb list --resource nodes 
  • Association du ClusterRole à l’utilisateur thomas

Le ClusterRole créé précedemment ne sert à rien s’il n’est pas associé à un utilisateur. Copiez la spécification suivante dans le fichier thomas-list-nodes.yaml, celle-ci définit un ClusterRoleBinding permettant d’associer le ClusterRole à l’utilisateur.

thomas-list-nodes.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: thomas-list-nodes
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: list-nodes
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: thomas

Créez ensuite cette ressource:

kubectl apply -f thomas-list-nodes.yaml

Vous pouvez également créer ce ClusterRoleBinding avec la commande impérative suivante:

kubectl create clusterrolebinding thomas-list-nodes --clusterrole list-nodes --user thomas
  • Vérification

Comme précédemment, la commande suivante permet de vérifier si l’utilisateur thomas peut lister les nodes:

kubectl auth can-i list nodes --as thomas

Vous devriez obtenir le message suivant:

Warning: resource 'nodes' is not namespace scoped
yes

Droit de gérer des Deployment dans le namespace dev

Vous allez à présent permettre à thomas de manipuler (créer, lister, mettre à jour, supprimer) des Deployments dans le namespace dev.

  • Création du namespace

Utilisez la commande suivante pour créer le namespace dev

kubectl create namespace dev
  • vérifier que l’utilisateur thomas ne peux pas créer, lister ou supprimer de Deployment dans ce namespace:
kubectl auth can-i create deployments.apps --as thomas --namespace dev
kubectl auth can-i get deployments.apps --as thomas --namespace dev
kubectl auth can-i list deployments.apps --as thomas --namespace dev
kubectl auth can-i update deployments.app --as thomas --namespace dev
kubectl auth can-i delete deployments.app --as thomas --namespace dev

Chacune des commandes ci-dessus devrait vous retourner le résultat:

no
  • Création du Role

Copiez la spécification suivante dans le fichier manage-deployment.yaml, celle-ci définit une ressource Role permettant de gérer les Deployments au sein du namespace dev:

manage-deployment.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: manage-deployment
  namespace: dev
rules:
- apiGroups:
  - "apps"
  resources:
  - deployments
  verbs:
  - create
  - list
  - get
  - update
  - delete

Créez ensuite cette ressource:

kubectl apply -f manage-deployment.yaml

Vous pouvez également créer ce Role avec la commande impérative suivante:

kubectl create role manage-deployment --verb create,list,get,update,delete --resource deployments.apps --namespace dev 
  • Association du Role à l’utilisateur thomas

Copiez la spécification suivante dans le fichier thomas-manage-deployment.yaml, celle-ci définit un RoleBinding permettant d’associer le Role précédent à thomas:

thomas-manage-deployment.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: thomas-manage-deployment
  namespace: dev
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: manage-deployment
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: thomas

Créez ensuite cette ressource:

kubectl apply -f thomas-manage-deployment.yaml

Vous pouvez également créer ce RoleBinding avec la commande impérative suivante:

kubectl create rolebinding thomas-manage-deployment --role manage-deployment --user thomas --namespace dev
  • Vérification

Comme précédemment, la commande ci-dessous permet de vérifier si l’utilisateur thomas peut faire les différentes actions sur la ressource de type Deployment:

kubectl auth can-i create deployments.apps --as thomas --namespace dev
kubectl auth can-i get deployments.apps --as thomas --namespace dev
kubectl auth can-i list deployments.apps --as thomas --namespace dev
kubectl auth can-i update deployments.app --as thomas --namespace dev
kubectl auth can-i delete deployments.app --as thomas --namespace dev

Cette fois-ci vous devriez obtenir le message suivant pour chacune de ces commandes:

yes

Droits associés à l’utilisateur

Comme vous l’aviez fait au début de l’exercice, vérifier les différentes actions qui sont autorisées pour l’utilisateur thomas dans le namespace dev:

kubectl auth can-i --list --as thomas -n dev

Vous devriez obtenir le résultat suivant:

Resources                                       Non-Resource URLs   Resource Names   Verbs
deployments.apps                                []                  []               [create list get update delete]
selfsubjectaccessreviews.authorization.k8s.io   []                  []               [create]
selfsubjectrulesreviews.authorization.k8s.io    []                  []               [create]
                                                [/api/*]            []               [get]
                                                [/api]              []               [get]
                                                [/apis/*]           []               [get]
                                                [/apis]             []               [get]
                                                [/healthz]          []               [get]
                                                [/healthz]          []               [get]
                                                [/livez]            []               [get]
                                                [/livez]            []               [get]
                                                [/openapi/*]        []               [get]
                                                [/openapi]          []               [get]
                                                [/readyz]           []               [get]
                                                [/readyz]           []               [get]
                                                [/version/]         []               [get]
                                                [/version/]         []               [get]
                                                [/version]          []               [get]
                                                [/version]          []               [get]
nodes                                           []                  []               [list]

Vous retrouvez dans ce résultat les droits de gestion des Deployments dans le namespace dev ainsi que le droit de lister les nodes dans le cluster.