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/