Kubernetes
IntroducciΓ³n
Kubernetes , tambiΓ©n conocido como K8s
, se destaca como una tecnologΓa revolucionaria que ha tenido un impacto significativo en el panorama del desarrollo de software. Esta plataforma ha transformado por completo el proceso de implementaciΓ³n y gestiΓ³n de aplicaciones, brindando un enfoque mΓ‘s eficiente y optimizado. Al ofrecer una arquitectura de cΓ³digo abierto, Kubernetes ha sido diseΓ±ado especΓficamente para facilitar una implementaciΓ³n, escalado y gestiΓ³n mΓ‘s rΓ‘pidos y sencillos de los contenedores de aplicaciones.
Kubernetes, desarrollado por Google, aprovecha mΓ‘s de una dΓ©cada de experiencia en la ejecuciΓ³n de cargas de trabajo complejas. Como resultado, se ha convertido en una herramienta fundamental en el universo DevOps para la orquestaciΓ³n de microservicios. Desde su creaciΓ³n, Kubernetes ha sido donado a la Cloud Native Computing Foundation , donde se ha convertido en el estΓ‘ndar de oro de la industria. Comprender los aspectos de seguridad de los contenedores K8 es crucial. Probablemente podamos acceder a uno de los muchos contenedores durante nuestra prueba de penetraciΓ³n.
Una de las caracterΓsticas clave de Kubernetes es su adaptabilidad y compatibilidad con diversos entornos. Esta plataforma ofrece una amplia gama de funciones que permiten a los desarrolladores y administradores de sistemas configurar, automatizar y escalar fΓ‘cilmente sus implementaciones y aplicaciones. Como resultado, Kubernetes se ha convertido en una soluciΓ³n de referencia para las organizaciones que buscan optimizar sus procesos de desarrollo y mejorar la eficiencia.
Kubernetes es un sistema de orquestaciΓ³n de contenedores que funciona ejecutando todas las aplicaciones en contenedores aislados del sistema host a travΓ©s de multiple layers of protection
. Este enfoque garantiza que las aplicaciones no se vean afectadas por los cambios en el sistema host, como actualizaciones o parches de seguridad. La arquitectura de K8s comprende una master node
y worker nodes
, cada una con funciones especΓficas.
Concepto K8s
Kubernetes gira en torno al concepto de pods, que pueden contener uno o mΓ‘s contenedores estrechamente conectados. Cada pod funciona como una mΓ‘quina virtual independiente en un nodo, con su propia IP, nombre de host y otros detalles. Kubernetes simplifica la gestiΓ³n de varios contenedores al ofrecer herramientas para el equilibrio de carga, el descubrimiento de servicios, la orquestaciΓ³n del almacenamiento, la autorreparaciΓ³n y mΓ‘s. A pesar de los desafΓos en seguridad y gestiΓ³n, K8s continΓΊa creciendo y mejorando con funciones como Role-Based Access Control
( RBAC
), Network Policies
y Security Contexts
, que brindan un entorno mΓ‘s seguro para las aplicaciones.
Diferencias entre K8 y Docker
FunciΓ³n
Estibador
Kubernetes
Primary
Plataforma para contenerizar aplicaciones
Una herramienta de orquestaciΓ³n para gestionar contenedores
Scaling
Escalado manual con Docker Swarm
Escalado automΓ‘tico
Networking
Red ΓΊnica
Red compleja con polΓticas
Storage
VolΓΊmenes
Amplia gama de opciones de almacenamiento
La arquitectura de Kubernetes se divide principalmente en dos tipos de componentes:
Control Plane
(nodo maestro), que es responsable de controlar el clΓΊster de KubernetesWorker Nodes
(minions), donde se ejecutan las aplicaciones en contenedores
Nodos
El nodo maestro aloja el Kubernetes Control Plane
, que administra y coordina todas las actividades dentro del clΓΊster y tambiΓ©n garantiza que se mantenga el estado deseado del clΓΊster. Por otro lado, los Minions
ejecutan las aplicaciones reales y recibe instrucciones del plano de control y garantiza que se alcance el estado deseado.
Ofrece versatilidad para adaptarse a diversas necesidades, como soporte para bases de datos, cargas de trabajo de IA/ML y microservicios nativos de la nube. AdemΓ‘s, es capaz de administrar aplicaciones de alto consumo de recursos en el borde y es compatible con diferentes plataformas. Por lo tanto, se puede utilizar en servicios de nube pΓΊblica como Google Cloud, Azure y AWS o en centros de datos locales privados.
Plano de control
El plano de control funciona como capa de gestiΓ³n y consta de varios componentes cruciales, entre ellos:
Servicio
Puertos TCP
etcd
2379
,2380
API server
6443
Scheduler
10251
Controller Manager
10252
Kubelet API
10250
Read-Only Kubelet API
10255
Estos elementos permiten al Control Plane
tomar decisiones y proporcionar una visiΓ³n integral de todo el clΓΊster.
Minions
En un entorno de contenedores, los Minions
funcionan como la ubicaciΓ³n designada para ejecutar aplicaciones. Es importante tener en cuenta que cada nodo estΓ‘ administrado y regulado por el plano de control, lo que ayuda a garantizar que todos los procesos que se ejecutan dentro de los contenedores funcionen de manera fluida y eficiente.
El Scheduler
, basado en el API server
, comprende el estado del clΓΊster y programa nuevos pods en los nodos segΓΊn corresponda. DespuΓ©s de decidir en quΓ© nodo se debe ejecutar un pod, el servidor API actualiza el etcd
.
Comprender cΓ³mo interactΓΊan estos componentes es fundamental para comprender el funcionamiento de Kubernetes. El servidor API es el punto de entrada para todos los comandos administrativos, ya sea de los usuarios a travΓ©s de kubectl o de los controladores. Este servidor se comunica con etcd para obtener o actualizar el estado del clΓΊster.
Medidas de seguridad de K8
La seguridad de Kubernetes se puede dividir en varios dominios:
Seguridad de la infraestructura del clΓΊster
Seguridad de la configuraciΓ³n del clΓΊster
Seguridad de la aplicaciΓ³n
Seguridad de datos
Cada dominio incluye mΓΊltiples capas y elementos que los desarrolladores y administradores deben proteger y gestionar adecuadamente.
API de Kubernetes
El nΓΊcleo de la arquitectura de Kubernetes es su API, que sirve como el principal punto de contacto para todas las interacciones internas y externas. La API de Kubernetes se ha diseΓ±ado para admitir el control declarativo, lo que permite a los usuarios definir el estado deseado para el sistema. Esto permite que Kubernetes tome las medidas necesarias para implementar el estado deseado.
El kube-apiserver
es responsable de alojar la API, que maneja y verifica las solicitudes RESTful para modificar el estado del sistema. Estas solicitudes pueden implicar la creaciΓ³n, modificaciΓ³n, eliminaciΓ³n y recuperaciΓ³n de informaciΓ³n relacionada con varios recursos dentro del sistema. En general, la API de Kubernetes desempeΓ±a un papel crucial a la hora de facilitar la comunicaciΓ³n y el control sin problemas dentro del clΓΊster de Kubernetes.
Dentro del marco de Kubernetes, un recurso de API funciona como un punto final que alberga una colecciΓ³n especΓfica de objetos de API. Estos objetos pertenecen a una categorΓa particular e incluyen elementos esenciales como pods, servicios e implementaciones, entre otros. Cada recurso ΓΊnico viene equipado con un conjunto distinto de operaciones que se pueden ejecutar, que incluyen, entre otras:
Pedido
DescripciΓ³n
GET
Recupera informaciΓ³n sobre un recurso o una lista de recursos.
POST
Crea un nuevo recurso.
PUT
Actualiza un recurso existente.
PATCH
Aplica actualizaciones parciales a un recurso.
DELETE
Elimina un recurso.
AutenticaciΓ³n
En tΓ©rminos de autenticaciΓ³n, Kubernetes admite varios mΓ©todos, como certificados de cliente, tokens de portador, un proxy de autenticaciΓ³n o autenticaciΓ³n bΓ‘sica HTTP, que sirven para verificar la identidad del usuario. Una vez que el usuario ha sido autenticado, Kubernetes aplica las decisiones de autorizaciΓ³n mediante el control de acceso basado en roles (Role-Based Access Control, RBAC
). Esta tΓ©cnica implica asignar roles especΓficos a usuarios o procesos con los permisos correspondientes para acceder y operar en los recursos. Por lo tanto, el proceso de autenticaciΓ³n y autorizaciΓ³n de Kubernetes es una medida de seguridad integral que garantiza que solo los usuarios autorizados puedan acceder a los recursos y realizar operaciones.
En Kubernetes, se puede configurar Kubelet
para permitir acceso anΓ³nimo
. De forma predeterminada, Kubelet permite el acceso anΓ³nimo. Las solicitudes anΓ³nimas se consideran no autenticadas, lo que implica que cualquier solicitud realizada a Kubelet sin un certificado de cliente vΓ‘lido se tratarΓ‘ como anΓ³nima. Esto puede ser problemΓ‘tico ya que cualquier proceso o usuario que pueda acceder a la API de Kubelet puede realizar solicitudes y recibir respuestas, lo que podrΓa exponer informaciΓ³n confidencial o dar lugar a acciones no autorizadas.
InteracciΓ³n con el servidor API de K8
Por lo general System:anonymous
representa un usuario no autenticado, lo que significa que no hemos proporcionado credenciales vΓ‘lidas o que estamos intentando acceder al servidor API de forma anΓ³nima. En este caso, intentamos acceder a la ruta raΓz, lo que otorgarΓa un control significativo sobre el clΓΊster de Kubernetes si se logra. De forma predeterminada, el acceso a la ruta raΓz generalmente estΓ‘ restringido a usuarios autenticados y autorizados con privilegios administrativos y el servidor API rechazΓ³ la solicitud, respondiendo con un cΓ³digo de estado 403 Forbidden
en consecuencia.
API de Kubelet: ExtracciΓ³n de pods
La informaciΓ³n que se muestra en la salida incluye los names
, namespaces
, creation timestamps
y container images
de los pods. TambiΓ©n muestra los last applied configuration
de cada pod, que pueden contener detalles confidenciales sobre las imΓ‘genes de los contenedores y sus polΓticas de extracciΓ³n.
Comprender las imΓ‘genes de contenedores y sus versiones utilizadas en el clΓΊster nos puede permitir identificar vulnerabilidades conocidas y explotarlas para obtener acceso no autorizado al sistema. La informaciΓ³n del espacio de nombres puede brindar informaciΓ³n sobre cΓ³mo se organizan los pods y los recursos dentro del clΓΊster, que podemos usar para apuntar a espacios de nombres especΓficos con vulnerabilidades conocidas. TambiΓ©n podemos usar metadatos como uid
y resourceVersion
para realizar reconocimientos y reconocer objetivos potenciales para futuros ataques. Revelar la ΓΊltima configuraciΓ³n aplicada puede exponer potencialmente informaciΓ³n confidencial, como contraseΓ±as, secretos o tokens de API, utilizados durante la implementaciΓ³n de los pods.
Kubeletctl - ExtracciΓ³n de pods
Podemos analizar mΓ‘s a fondo los pods con el siguiente comando:
API de Kubelet: comandos disponibles
Para interactuar de manera eficaz con los pods dentro del entorno de Kubernetes, es importante comprender claramente los comandos disponibles. Un enfoque que puede resultar especialmente ΓΊtil es utilizar el comando scan rce
en kubeletctl
. Este comando proporciona informaciΓ³n valiosa y permite una gestiΓ³n eficiente de los pods.
API de Kubelet: EjecuciΓ³n de comandos
TambiΓ©n podemos interactuar con un contenedor de forma interactiva y obtener informaciΓ³n sobre el alcance de nuestros privilegios dentro de Γ©l. Esto nos permite comprender mejor nuestro nivel de acceso y control sobre el contenido del contenedor.
El resultado del comando muestra que el usuario actual que ejecuta el comando id
dentro del contenedor tiene privilegios de root. Esto indica que hemos obtenido acceso administrativo dentro del contenedor, lo que podrΓa generar vulnerabilidades de escalada de privilegios. Si obtenemos acceso a un contenedor con privilegios de root, podemos realizar mΓ‘s acciones en el sistema host o en otros contenedores.
Escalada de privilegios
Para obtener mayores privilegios y acceder al sistema host, podemos utilizar una herramienta llamada kubeletctl para obtener los datos de la cuenta de servicio de Kubernetes token
y certificate
( ca.crt
) del servidor. Para ello, debemos proporcionar la direcciΓ³n IP del servidor, el espacio de nombres y el pod de destino. En caso de que obtengamos este token y certificado, podemos elevar nuestros privilegios aΓΊn mΓ‘s, movernos horizontalmente por todo el clΓΊster o acceder a pods y recursos adicionales.
API de Kubelet: extracciΓ³n de tokens
API de Kubelet: extracciΓ³n de certificados
Ahora que tenemos tanto token
y certificate
, podemos verificar los derechos de acceso en el clΓΊster de Kubernetes. Esto se usa comΓΊnmente para auditorΓa y verificaciΓ³n para garantizar que los usuarios tengan el nivel correcto de acceso y no se les otorguen mΓ‘s privilegios de los que necesitan. Sin embargo, podemos usarlo para nuestros fines y podemos consultar a K8s si tenemos permiso para realizar diferentes acciones en varios recursos.
Lista de privilegios
AquΓ podemos ver informaciΓ³n muy importante. AdemΓ‘s de los recursos selfsubject, podemos ver los pods get
, create
y list
, que son los recursos que representan el contenedor en ejecuciΓ³n en el clΓΊster. A partir de aquΓ, podemos crear un archivo YAML
que podemos usar para crear un nuevo contenedor y montar todo el sistema de archivos raΓz desde el sistema host en el directorio /root
de este contenedor. A partir de ahΓ, podemos acceder a los archivos y directorios de los sistemas host. El archivo YAML
podrΓa verse asΓ:
Pod YAML
Una vez creado, ahora podemos crear el nuevo pod y verificar si se estΓ‘ ejecutando como se espera.
Creando un nuevo Pod
Si el pod se estΓ‘ ejecutando, podemos ejecutar el comando y podrΓamos generar un shell inverso o recuperar datos confidenciales como la clave SSH privada del usuario root.
Extraer la clave SSH de root
Γltima actualizaciΓ³n
ΒΏTe fue ΓΊtil?