RBAC Authorisatie

Role-Based Access Control (RBAC) kan gebruikt worden om toegang te geven aan service-accounts, gebruikers en/of groepen binnen Kubernetes om resources te kunnen beheren. Dit wordt geregeld via de rbac.autorization.k8s.io API en daarom dient de API server met de RBAC authorization mode te zijn opgestart. Dit kan gecontroleerd worden in /etc/kubernetes/manifests/kube-apiserver.yaml waarbij de volgende opstart parameter aanwezig dient te zijn:

- --authorization-mode=Node,RBAC

De RBAC API kent 4 objecten die gebruikt (kunnen) worden, te weten:

  • Role
  • ClusterRole
  • RoleBinding
  • ClusterRoleBinding

Roles

Roles geven aan welke permissies gebruikt mogen worden en dienen voorzien te worden van een verwijzing naar een namespace. Bijvoorbeeld een Role om pods te kunnen lezen in de default namespace:

apiVersion: rbac.authorization.k8s.io/v1 
kind: Role 
metadata: 
  namespace: default 
  name: pod-reader 
rules: 
  - apiGroups: [""] 
    resources: ["pods"]
    verbs: ["get", "watch", "list"]

ClusterRole

Een ClusterRole is een set permissies die gelden voor het hele cluster. Bijvoorbeeld een ClusterRole om in alle namespaces de pods te kunnen lezen:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: all-pods-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

Om de Roles en ClusterRoles te kunnen gebruiken dienen deze gekoppeld te worden via binding.

RoleBinding

Hiermee worden de permissies die in een Role zijn vastgeled aan service-accounts, users of aan groups gekoppeld. Een RoleBinding kan dus verwijzen naar de Roles in dezelfde namespace of naar ClusterRoles maar die worden dan alleen geldig voor de namespace waarin de RoleBinding is vastgelegd. Een voorbeeld om gebruiker ‘nico’ de mogelijkheid te geven om pods te lezen in de default namespace:

apiVersion: rbac.authorization.k8s.io/v1 
kind: RoleBinding 
metadata: 
  name: read-pods 
  namespace: default 
subjects: 
- kind: User 
  name: nico  
  apiGroup: rbac.authorization.k8s.io 
roleRef: 
  kind: Role  
  name: pod-reader 
  apiGroup: rbac.authorization.k8s.io

Het is dus ook mogelijk een een ClusterRole te gebruiken in RoleBinding. Deze ClusterRole geldt dan uitsluitend voor de namespace waarin de RoleBinding wordt gedefinieerd!

ClusterRoleBinding

Hiermee worden permissies gegeven aan users of groups en gelden voor het gehele cluster, dus ongeacht de namespace. Bijvoorbeeld om gebruiker ‘nico’ de pods in elke namespace te laten lezen:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-all-pods
subjects:
- kind: User
  name: nico
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: all-pods-reader
  apiGroup: rbac.authorization.k8s.io

Meer informatie over RBAC Authorization vind je hier: https://kubernetes.io/docs/reference/access-authn-authz/rbac/