CSR (Certificate Signing Requests) en K8

Para mi examen de CKS me falta pensamiento profundo. Felizmente encontre los ejercicios de Killercoda porque tanto simulador me deja un mal gusto.

Asi que primero lo primero

Crear un CSR

Esto requiere de memorizar usar el tonto openssl y crear una llave, y un csr.

Y luego firmarlo con el CRT usando la autoridad del cluster.

Crear una llave:

Esta tan simple como:

openssl genrsa

La ayuda no te va a ayudar a llegar alli, seria bonito una descripcion de cada comando en openssl help. En vez de la lista pero bueno

openssl genrsa –help, si te devuelve informacion. (Aun no dice para que rayos funciona, pero como funciona)

openssl genrsa –out archivo.key 2048

Los numbits, basicamente son, porque no. Mas algo es mejor toda la parte criptografica, realmente no estoy de humor para refrescarlo.

Crear el CSR con la llave

otro lindo comando que le serviria una descripcion en el help general o algunos ejemplos. Se nota cuando una documentacion se hace sin presupuesto y con gatekeepers.

openssl req | openssl req –help

asi que vamos con

openssl req -new -key archivo.key –out archivo.csr

Esto nos va a pedir un grupo de datos, lo mas importante aca es la parte de Common Name (FQDN) que designa el nombre del certificado. Si les piden un nombre de usuario, alli va, lo demas lo pueden dejar en blanco.

si quieren ir mas directos pueden hacer

openssl req -new -key archivo.key –out archivo.csr -subj “CN=usuario”

Okay ahora toca firmar esta tonteria.

Para los pasos no doy mucho porque estoy canasdo, se que existe un CSR object en kubernetes, y podemos crearlo pasando el valor en B64

La pagina de K8: https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/

Despues de toda la documentacion de ellos que he leido, puedo decir en mi opinion que es una de las mas vagas. Tiene bastante informacion contextual, que no sirve para firmar el estupido certificado. Al menos no de forma rapida o intuitiva

Despues de directamente buscar el objeto, consegui: https://kubernetes.io/docs/tasks/tls/certificate-issue-client-csr/

Que explica como hacer la tarea, gracias.

Primero queremos el valor b64 del csr

cat archivo.csr | base64 | tr -d "\n"

Felizmente consegui la pagina en K8, porque voy a olvidar tr -d “\n” que sirve para remover los caracteres de salto de linea.

Luego queremos crear esta plantilla:

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: myuser # example
spec:
  # This is an encoded CSR. Change this to the base64-encoded contents of myuser.csr
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400  # one day
  usages:
  - client auth

Algunos puntos importantes:

  • expirationSeconds, esa cantidad es un dia
  • usages: es una lista de acciones para la que se puede usar el certificado, mas informacion en la pagina pero no me interesa de momento
  • requests: Lo copie y pegue del cat en 1 sola linea. el tr -d “\n” ahorra el tiempo de quitar cada linea una por una.

no olvidemos aplicarlo

kubectl apply -f archivo.yaml

y luego approvarlo

kubectl get csr # para verlo

kubectl certificate approve myuser

Firmar Manualmente

Esto es mas sadico, ahora hay que memorizar como firmar el csr con openssl y de donde sacar el serial de la CA de kubernetes.

Bueno de primera mano los certificados de K8 estan en /etc/kubernetes/pki

-rw-r--r-- 1 root root 1123 Apr 24 20:18 apiserver-etcd-client.crt
-rw------- 1 root root 1675 Apr 24 20:18 apiserver-etcd-client.key
-rw-r--r-- 1 root root 1176 Apr 24 20:18 apiserver-kubelet-client.crt
-rw------- 1 root root 1675 Apr 24 20:18 apiserver-kubelet-client.key
-rw-r--r-- 1 root root 1289 Apr 24 20:18 apiserver.crt
-rw------- 1 root root 1675 Apr 24 20:18 apiserver.key
-rw-r--r-- 1 root root 1107 Apr 24 20:18 ca.crt
-rw------- 1 root root 1675 Apr 24 20:18 ca.key
drwxr-xr-x 2 root root 4096 Apr 24 20:18 etcd
-rw-r--r-- 1 root root 1123 Apr 24 20:18 front-proxy-ca.crt
-rw------- 1 root root 1675 Apr 24 20:18 front-proxy-ca.key
-rw-r--r-- 1 root root 1119 Apr 24 20:18 front-proxy-client.crt
-rw------- 1 root root 1675 Apr 24 20:18 front-proxy-client.key
-rw------- 1 root root 1679 Apr 24 20:18 sa.key
-rw------- 1 root root  451 Apr 24 20:18 sa.pub

Asumire que es ca.crt de buenas a primera.

Entonces,

openssl x509 -req -in archivo.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out archivo.crt

Gracias, ahora -req es una opcion, del modulo x509 (no quiero ni saber de donde sacaron ese nombre en este momento) -in asumo que el csr porque si, y los otros datos autodescubiertos.

bien los siguientes comandos para registrar un kubecontext son sacados de la imaginacion

Primero registrar una credencial

kubectl config set-credentials nombre –client-key –client-certificate

Pero hey su ayuda si tiene una ayuda.

Segundo paso setear el context

kubectl config set-context nombre –cluster=kubernetes –user=nombre

Tercer paso validar

kubectl config get-context

Cuarto paso usar

kubectl config use-context nombre

Listo.

Conclusiones

debo memorizar los datos de openssl, aunque consegui esa pagina en la biblioteca de K8 buscado por el nombre del objeto

openssl genrsa

openssl req

openssl x509 -req -in

y una ultima importante

openssl x509 -in cert.crt -noout -subject

que permite extraer el subjet del certificado.