Control de Accesos a Kubernetes con Teleport

Control de Accesos a Kubernetes con Teleport

¿Como hacemos generar roles con permisos granulares?

Seguimos con la serie, ahora vamos a ir un poco más profundo. Ya tenemos nuestro Teleport listo para usar, vamos a perfilar un poco los accesos. Creo que lo mejor es hacer una prueba, para interiorizarnos en esta arista del producto.

Escenario

Este ejemplo muestro dos grupos, uno que puede listar y ver logs para pod's y otro que además puede abrir sesiones exec en el espacio de nombres app-dominio de nuestro Cluster microk8s. Un requisito fundamental es que tengamos RBAC habilitado.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: dev-exec
  namespace: app-dominio
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - pods/log
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - pods/exec
  verbs:
  - create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: dev-logs
  namespace: app-dominio
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - pods/log
  verbs:
  - get
  - list
  - watch

Aplicamos los roles

kubectl apply -f role.yaml
role.rbac.authorization.k8s.io/dev-exec created
role.rbac.authorization.k8s.io/dev-logs created

Configuracion Role Bindings

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-exec-binding
  namespace: app-dominio
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: dev-exec
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: developer-exec
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-logs-binding
  namespace: app-dominio
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: dev-logs
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: developer-logs

Hacemos el Binding

kubectl apply -f rolebindings.yml
rolebinding.rbac.authorization.k8s.io/dev-exec-binding created
rolebinding.rbac.authorization.k8s.io/dev-logs-binding created

Ahora podemos asignar usuarios o roles con el grupo developer-exec o developer-logs.

kind: role
version: v4
metadata:
  name: developer-exec
spec:
  allow:
    kubernetes_groups: ["developer-exec"]
    kubernetes_labels:
       '*': '*'
kind: role
version: v4
metadata:
  name: developer-logs
spec:
  allow:
    kubernetes_groups: ["developer-logs"]
    kubernetes_labels:
       '*': '*'

Aplicamos los cambios, una vez que ingresamos a Teleport como teleport-admin.

Les dejo el proceso.

tsh login --proxy=teleport.esprueba.com:443 --auth=local --user=teleport-admin teleport.esprueba.com
tctl create -f developer-exec.yaml
tctl create -f developer-logs.yaml

Vamos a revisar Teleport y luego agregar un usuario alguno de estos roles, para ir probando, para ello le agrego a el usuario santiago el rol developer-exec.

tctl users update --set-roles=developer-exec santiago
User santiago has been updated:
    New roles: developer-exec

Ahora vamos a probar si el usuario santiago puede listar en cualquier namespace y que puede hacer dentro del namespace habilitado.

Vamos a revisar los logs un poco a detalle. Acá se puede ver el 200, del request a los Pods y los 403 de los requests no habilitados.

Como pueden ver el acceso al Cluster es extremadamente granular y sencillo de configurar. No dejen de revisar la documentación de Teleport, para hacerlo más fino.

Espero que les sirva.