Voyons comment autoriser l'accès à notre cluster kubernetes:
Avec mot de passe et ou tokens
Bien que ca ne soit pas la solution a privilégier, il est possible d'utiliser des fichiers CSV contenant des login/pass pour déclarer des utilisateurs.
Il suffira de passer le chemin du ficher csv en paramètre au démarrage de l'api-server:
- Basic-auth-file
k8s-users.csv
Le format: Password, User Name, User ID, (Group: optionnel)
pass1,user1,u1,group1
pass2,user2,u2,group2
Ensuite, on utilise l'argument --basic-auth-file=k8s-users.csv au lancement de l'apiserver (voir dans /etc/kubernetes/manifest/*yaml)
Et se connecter a l'api-serveur :
curl -v -k https://localhost:6443/api/v1/pods -u "user1:password123"
- Token-auth-file:
Même principe, mais avec des tokens au lieu des mots de passe.
Avec les certificats
Après quelques recherches, on comprend vite que k8s est d'avantage porté sur l'utilisation de certificats pour l'authentification des clients.
A noter que pour k8s, un utilisateur est simplement une valeur dans le champ CN du certificat (/CN=toto ci dessous)
//Creation du certificat pour l'utilisateur "toto"
//Clé privé de toto
openssl genrsa -out toto.key 2048
// Demande de signature (CSR)
openssl req -new -key toto.key -subj "/CN=toto" -out toto.csr
A présent, notre CSR doit être traité par kubernetes pour avoir le certificat final.
Deux solutions: le signer depuis le controlplane 'a la main' ou utiliser les CertificateSingingRequest de k8s.
- Signature manuelle du certificat:
// Signature a la main depuis le controlplane:
// openssl x509 -req -in toto.csr -CA kubernetes-root-ca.crt -CAkey kubernetes-root-ca.key -out toto.crt- Signature via kubernetes
Kubernetes propose un service de signature des CSR via son API et l'objet de CertificateSigningRequest:
// Créer un objet CertificateSigningRequest
// Pensez a mettre à jour le champ request: avec votre CSR encodé en base64
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: toto-csr
spec:
request: xxxxxxxxxxxxxxxxx.....VOTRECSR......yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy=
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 86400 # one day
usages:
- client auth
$ k apply -f myuser-csr.yaml
// On retrouve notre csr, en état pending
$ k get csr NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
toto-csr 33m kubernetes.io/kube-apiserver-client theadmin 24h Pending
// Approbation du certificat
$ k certs approve myuser-csr
// Le CSR a été traité par kubernetes et passe en approved/Issued
$k get csr NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
toto-csr 33m kubernetes.io/kube-apiserver-client theadmin 24h Approved,Issued
// Récupération du certificat signé
k get csr toto -o jsonpath='{.status.certificate}' | base64 -d > toto.crt- Notes
Comme dit précédement, c'est le champ Subject du certificat qui définit le user ou et ses groupes.
On peut dont tout a fait créer un user avec les droits d'admin en précisant le groupe "system:masters" pendant la création du CSR:
-subj "/CN=supertoto/O=system:masters"
- Références
https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#normal-user
https://killercoda.com/chadmcrowell/course/cka/kubernetes-create-user