- El objetivo de este contenido es recordar la importancia de la seguridad en Kubernetes
- Dónde se almacenan los Secret
- Cuando un usuario declara un recurso mediante el comando
kubectl, Kubernetes crea el archivo de manifiesto que define ese recurso y lo guarda en etcd
- Cuando un usuario declara un recurso Secret, ese Secret también se guarda en
etcd
- Cuando un usuario crea un pod que lee un Secret como volumen o variable de entorno, el Secret se guarda en ese pod
- Si se compromete el
etcd donde se almacena el Secret y el pod donde se usa, se puede averiguar la contraseña guardada en el Secret
- Preparación previa
- Crear un clúster con
kubeadm
- Para la práctica, crear de antemano tres recursos: Secret
credit-card, pod app1 y pod app2
- Hackeo de
etcd
etcd: almacén de datos clave-valor que guarda el estado del clúster de Kubernetes. Toda la información declarada en Kubernetes se guarda aquí. Los Secret también se pueden ver consultando etcd
- 1.1 Encontrar la contraseña con
etcdctl
- Consultar el manifiesto de
kube-apiserver para obtener la certificate authority, la clave pública y la clave privada del servidor etcd
- Encontrar la contraseña mediante el comando
etcdctl, que permite manipular etcd con facilidad
- 1.2 Obtenerla accediendo directamente a la base de datos de
etcd
- Encontrar el proceso donde corre
etcd y explorar todos los datos de ese proceso para hallar la contraseña
ps aux | grep etcd - obtener el PID de etcd
ll /proc/<pid>/fd - aparece un archivo link con el nombre db
cat /proc/<pid>fd/<db> | grep -A10 -B10 credit-card - con este comando se encuentra la contraseña creada previamente
- Hackeo de pods
- Obtenerla mediante
kubectl exec
- Si se tienen los permisos adecuados para consultar Kubernetes, se puede obtener la contraseña con el comando
kubectl
- Obtenerla accediendo directamente al contenedor
- Si en el nodo worker se pueden usar libremente comandos de Docker, es posible extraer la contraseña
- En el nodo worker donde fue programado el pod
app1, se puede encontrar el contenedor y extraer la lista de variables de entorno registradas en él
crictl pods - encontrar el Pod ID de app1
crictl ps - encontrar el contenedor correspondiente al Pod ID
crictl inspect <container id> | grep -A16 env - consultar en detalle ese contenedor y extraer las variables de entorno
- Obtenerla con un ServiceAccount que tenga permisos de acceso al Secret
- Si el ServiceAccount del pod tiene permisos para acceder al Secret, se puede encontrar la contraseña llamando a la API desde dentro del pod
- Cómo evitar los ataques descritos arriba
- Seguir el “principio de mínimo privilegio” y no crear service accounts con permisos innecesarios
- Evitar exponer credenciales de usuario y prepararse ante amenazas como la ingeniería social
- Cifrar
etcd mediante el recurso EncryptionConfiguration
Aún no hay comentarios.