7 puntos por ironlung 2023-10-05 | Aún no hay comentarios. | Compartir por WhatsApp
  • 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.

Aún no hay comentarios.