Aanmaken gebruiker (en groep)

Om taken uit te voeren in een Kubernetes Cluster dien je bepaalde permissies te hebben voor die taken. Als ‘cluster-admin’ kun je het gehele cluster beheren en alle taken uitvoeren maar die rechten wil je niet aan alle gebruikers geven. Er is dus de mogelijkheid om gebruikers aan te maken en in te delen in groepen en zodoende rechten geven aan groepen voor bijvoorbeeld bepaalde namespaces. Een eis hierbij is het gebruik van RBAC, zie deze pagina.

Nu kun je gebruikersnamen met wachtwoorden gebruiken maar veiliger is het om certificaten te gebruiken. Dat werkt alsvolgt:

Aanmaken certificaat

Op een computer (Mac, Windows Subsystem for Linux of een Linux variant als OS) kun je een terminal starten en heb je hiermee toegang geconfigureerd tot het Kubernetes Cluster. Wellicht heb je de admin-configuratie van de master-node als ~/.kube/config opgeslagen en heb je dus cluster-admin rechten. In dit bestand zijn zowel het certificaat als de sleutel aanwezig voor de admin-gebruiker. Geef het volgende commando:

$ kubectl config get-contexts

CURRENT    NAME                        CLUSTER      AUTHINFO          NAMESPACE
*          kubernetes-admin@kubernetes kubernetes   kubernetes-admin

Zoals je ziet is er de ‘kubernetes-admin‘ als gebruiker voor het cluster ‘kubernetes‘. We gaan hier de gebruiker ‘nico’ aan toevoegen en geven deze gebruiker alleen alle rechten in de namespace ‘wordpress’. Als eerste dus een certificaat-request en sleutel aanmaken:

$ openssl genrsa -out nico.key 2048
$ openssl req -new -key nico.key -out nico.csr -subj "/CN=nico/O=digitalinfogroup"

Hier zie je de gebruikersnaamnico‘ en de groepsnaamdigitalinfogroup‘ in het Subject veld van het certificaat-request. Dit is de methode die Kubernetes gebruikt om te bepalen van welke groep deze gebruiker lid is.

Wat je vervolgens nodig hebt is de Certificate Authority (CA) certificate en de bijbehorende key om jouw certificaat-request te ‘ondertekenen’. Deze staan uiteraard op de master node (/etc/kubernetes/pki/ca.*) maar heb je wellicht ook in de ~/.kube/config file staan. Alleen deze laatste zul je dan moeten decoderen met base64.

Ervan uitgaande dat je toegang hebt tot de ca.crt en ca.key bestanden, het volgende commando is om het request-bestand zelf te ondertekenen en er een certificate van te maken:

$ openssl x509 -req -in nico.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out nico.crt

Standaard is het certificaat slechts één maand geldig maar dat kun je wijzigen door de optie -days mee te geven, bv. ‘-days 365’ voor een jaar.

Controle kan met:

$ openssl x509 -in nico.crt -text

Gebruiker toevoegen aan K8S

Gebruik nu het volgende commando om de gebruiker toe te voegen aan het Kubernetes Cluster:

$ kubectl config set-credentials nico --client-certificate=nico.crt --client-key=nico.key --embed-certs=true

En het volgende commando om deze gebruiker toe te voegen aan de context file:

$ kubectl config set-context nico@kubernetes --cluster=kubernetes --user=nico

Wederom controle, met:

$ kubectl config get-contexts
CURRENT NAME                        CLUSTER    AUTHINFO         NAMESPACE
*       kubernetes-admin@kubernetes kubernetes kubernetes-admin
        nico@kubernetes             kubernetes nico

Rechten geven aan groep

Aangezien deze gebruiker alle rechten mag hebben in de namespace ‘wordpress’, geven we een RoleBinding in de namespace ‘wordpress’ voor de ClusterRole ‘cluster-admin’ aan de groep ‘digitalinfogroup’. We maken hier een manifest file genaamd wordpress-admin.yaml voor met de volgende inhoud:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: wordpress-admin
  namespace: wordpress
subjects:
- kind: Group
  name: digitalinfogroup
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

Uitvoeren met:

$ kubectl apply -f wordpress-admin.yaml

Om nu het nieuwe account te gebruiken voor toegang tot het cluster en de namespace ‘wordpress’, geef het volgende commando:

$ kubectl config use-context nico@kubernetes

Ter controle:

$ kubectl get all -n wordpress

Het is nu mogelijk om de gebruiker ‘kubernetes-admin’ uit het config-bestand te verwijderen zodat je verplicht bent een eigen account te gebruiken voor (uitsluitend) de taken op het Kubernetes cluster waartoe je rechten hebt.

Have fun!