Skip to content

Service Accounts

Un Service Account provee una identidad con la cual ejecutar los procesos de un Pod. Esta identidad funciona mediante permisos que se otorgan dentro del ambiente para poder interactuar con los demás componentes que existen.

Cuando un usuario ingresa al cluster ya sea mediante la Interfaz o mediante comandos (kubectl), este obtiene una identidad mediante la autenticación con ese usuario, por lo que puede acceder e interactuar con el APIServer y sus componentes. Esto mismo sucede con los Service Account, la diferencia consiste que en el caso de un Service Account se limita a ciertas acciones dentro del mismo namespace donde se está ejecutando el proceso en cuestión.

Cada Service Account puede estar asignado a una lista de permisos en específico mediante Roles que definen las acciones permitidas sobre los diferentes grupos de componentes del APIServer, como por ejemplo el grupo asociado a los Deployments con acciones de ver, listar, crear pero no modificar o eliminar.

Laboratorio: Service Accounts

Descripción

La presente guía muestra cómo crear, listar, modificar y eliminar Service Accounts dentro de un namespace.

Objetivos

  • Crear un Service Account personalizado
  • Autenticarse mediante un Token de Service Account
  • Modificar los permisos del Service Account mediante Roles
  • Verificar los permisos del Service Account

Antes de comenzar

  • Contar con el acceso al ambiente de laboratorio

Inicio de laboratorio

  1. Ingrese al CLI del sistema operativo del servidor usado como Bastion con el usuario y la contraseña proporcionados.

  2. Ingresar al cluster de Kubernetes utilizando el archivo kubeconfig

    export KUBECONFIG=~/rke-cluster-users/kube_config_cluster.yml
    

  3. Crear un nuevo namespace llamado example-sa

    kubectl create ns example-sa
    

  4. Establecer el nuevo namespace por defecto con el contexto actual

    kubectl config set-context --current --namespace=example-sa
    

  5. Liste los Service Accounts del namespace actual

    kubectl get sa
    

  6. Obtenga la información del SA default

    kubectl describe sa default
    

  7. Verifique los Secrets del namespace actual

    kubectl get secrets
    
    Nota: El concepto de Secret se verá en otro tópico. Un Secret es un recurso de Kubernetes que permite almacenar datos considerados como credenciales y son utilizados por Aplicaciones y Herramientas, en este caso es utilizado para almacenar el token del ServiceAccount.

  8. Obtenga la información del Secret default-token-hash (cambiar hash por el nombre real de su Secret)

    kubectl describe secret default-token-hash
    
    El Token del ServiceAccount es utilizado para comunicarse contra el APIServer, para mantener el estado y la configuración del recurso.

  9. Obtener los diferentes contextos que se tienen configurados en el archivo kubeconfig

    kubectl config get-contexts
    
    Nota: Anote el nombre del contexto que está utilizando actualmente

  10. Cree una entrada de usuario para kubectl utilizando el contenido descifrado del campo token para autenticarse contra el cluster

    kubectl config set-credentials sa-user --token=$(kubectl get secret default-token-hash -o jsonpath={.data.token} | base64 -d)
    
    Nota: Cambiar default-token-hash con el dato obtenido en el paso 7

  11. Cambie el usuario que utiliza para kubectl (utilice el contexto del paso 9)

    kubectl config set-context local --user=sa-user
    

  12. Verifique los usuarios que tiene para kubectl

    kubectl config get-users
    

  13. Pruebe a obtener los Pods del namespace

    kubectl get pods
    
    Nota: Esta parte debe tirar un error de permisos

  14. Pruebe a obtener los Namespaces del cluster

    kubectl get ns
    
    Nota: Esta parte debe tirar un error de permisos

  15. Configure nuevamente kubectl para ocupar las credenciales de su usuario

    kubectl config set-context local --user=kube-admin-local
    

  16. Cree un Service Account llamado list-only

    kubectl create sa list-only
    

  17. Cree un Role que permita obtener la lista de pods en el namespace actual

    kubectl create role pod-reader --verb=get --verb=list --resource=pods
    

  18. Cree un RoleBinding para el Service Account list-only

    kubectl create rolebinding list-pods-sa-binding --role=pod-reader --serviceaccount=example-sa:list-only
    

  19. Verifique que los recursos Role y RoleBinding existan en el namespace

    kubectl get roles,rolebindings
    

  20. Verifique la información del Service Account list-only

    kubectl describe sa list-only
    

  21. Obtenga el nombre del Secret a utilizar (con nombre list-only-token-<hash>)

    kubectl get secrets
    

  22. Obtener los diferentes contextos que se tienen configurados en el archivo kubeconfig

    kubectl config get-contexts
    
    Nota: Anote el nombre del contexto que está utilizando actualmente

  23. Cree una entrada de usuario para kubectl utilizando el contenido descifrado del campo token para autenticarse contra el cluster

    kubectl config set-credentials sa-user-list-only --token=$(kubectl get secret list-only-token-hash -o jsonpath={.data.token} | base64 -d)
    
    Nota: Cambiar list-only-token-hash por el dato obtenido en el paso 21

  24. Cambie el usuario que utiliza para kubectl (utilice el contexto del paso 9)

    kubectl config set-context <context> --user=sa-user-list-only
    

  25. Verifique que pueda obtener el listado de Pods

    kubectl get pods
    

  26. Verifique que los demás accesos estén restringidos (debe dar error)

    kubectl get ns
    
    kubectl get secrets
    

  27. Configure nuevamente kubectl para ocupar las credenciales de su usuario

    kubectl config set-context local --user=kube-admin-local
    

  28. Limpie el ambiente

    kubectl delete ns example-sa
    

  29. Configure el namespace a utilizar por el contexto de kubectl a default

    kubectl config set-context --current --namespace=default