- 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 enetcd - 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
etcddonde se almacena el Secret y el pod donde se usa, se puede averiguar la contraseña guardada en el Secret
- Cuando un usuario declara un recurso mediante el comando
- Preparación previa
- Crear un clúster con
kubeadm - Para la práctica, crear de antemano tres recursos: Secret
credit-card, podapp1y podapp2
- Crear un clúster con
- Hackeo de
etcdetcd: 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 consultandoetcd- 1.1 Encontrar la contraseña con
etcdctl- Consultar el manifiesto de
kube-apiserverpara obtener la certificate authority, la clave pública y la clave privada del servidoretcd - Encontrar la contraseña mediante el comando
etcdctl, que permite manipularetcdcon facilidad
- Consultar el manifiesto de
- 1.2 Obtenerla accediendo directamente a la base de datos de
etcd- Encontrar el proceso donde corre
etcdy explorar todos los datos de ese proceso para hallar la contraseñaps aux | grep etcd- obtener el PID deetcdll /proc/<pid>/fd- aparece un archivo link con el nombredbcat /proc/<pid>fd/<db> | grep -A10 -B10 credit-card- con este comando se encuentra la contraseña creada previamente
- Encontrar el proceso donde corre
- 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
- Si se tienen los permisos adecuados para consultar Kubernetes, se puede obtener la contraseña con el comando
- 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 élcrictl pods- encontrar el Pod ID deapp1crictl ps- encontrar el contenedor correspondiente al Pod IDcrictl 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
- Obtenerla mediante
- 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
etcdmediante el recursoEncryptionConfiguration
Aún no hay comentarios.