En la primera parte de este artículo sobre Kubernetes: Gestionar políticas de seguridad "Like a Boss" vimos cómo configurar el plugin CNI Cilium en un minikube para después comenzar en la segunda parte a configurar las políticas de seguridad de red en las diferentes comunicaciones. Al final de la entrada anterior terminábamos con el primer ejemplo y con una nueva pregunta.
En este momento, tras la configuración hecha en la parte 2 de esta serie, sólo los pods con la etiqueta app=client del espacio de nombres default, pero ¿qué ocurre si el equipo cyberhades desde su espacio de nombres cyberhades necesitan conectarse a nuestra base de datos?
Para ello creemos un espacio de nombres nuevo llamada cyberhades, al que además le añadimos la etiqueta team=cyberhades:
Y esta vez deberíamos de poder conectarnos tanto de el espacio de nombres de cyberhades como default, como puede verse en el siguiente vídeo:
Para interactuar con las políticas de red podemos hacerlo a través del comando kubectl [verbo] networkpolicy. Un comando muy útil es el comando kubectl describe networkpolicy. Este nos muestra cómo Kubernetes interpreta nuestra política. Es importante prestar mucha atención a cómo definimos nuestros ingress y egress, porque un simple guión fuera de lugar a la hora de definir nuestro array en el fichero YAML, puede cambiar por completo el significado de las restricciones aplicadas.
Fijémonos en el from de la última política que hemos creado:
Ahora supongamos que el namespaceSelector tuviera un guion al principio:
Veamos como kubectl describe mostraría esos ejemplos.
Para terminar, hay que añadir que es una buena práctica de seguridad el denegar por defecto todo el tráfico, tanto ingress como egress, y partir de ahí ir creando políticas para ir permitiendo el tráfico que vayas necesitando. De esta forma si un pod es comprometido, se lo ponemos más difícil al atacante a la hora de moverse lateralmente por nuestra red.
El fichero que deniega todo el tráfico tendría un contenido como este:
Cómo hemos visto a través de los ejemplos sólo hemos jugado con el tráfico entrante (ingress), pero de la misma forma podemos hacerlo con el tráfico saliente (egress), nuestro objetivo debería ser controlar y limitar el tráfico de red. Esperamos que estos ejemplos os sirvan de ayuda a la hora de construir vuestra infraestructura con Kubernetes.
Happy Hacking Hackers!!!
*********************************************************************************************
- Kubernetes: Gestionar políticas de seguridad de red “Like a Boss” (1 de 3)
- Kubernetes: Gestionar políticas de seguridad de red “Like a Boss” (2 de 3)
- Kubernetes: Gestionar políticas de seguridad de red “Like a Boss” (3 de 3)
*********************************************************************************************
Autores:
Fran Ramírez, (@cyberhadesblog) es investigador de seguridad y miembro del equipo de Ideas Locas en CDO en Telefónica, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps", también de "Machine Learning aplicado a la Ciberseguridad” además del blog CyberHades. Puedes contactar con Fran Ramirez en MyPublicInbox.
Rafael Troncoso (@tuxotron) es Senior Software Engineer en SAP Concur, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps" además del blog CyberHades. Puedes contactar con Rafael Troncoso en MyPublicInbox.
Figura 11: Kubernetes: Gestionar políticas de seguridad de red “Like a Boss” (3 de 3) |
En este momento, tras la configuración hecha en la parte 2 de esta serie, sólo los pods con la etiqueta app=client del espacio de nombres default, pero ¿qué ocurre si el equipo cyberhades desde su espacio de nombres cyberhades necesitan conectarse a nuestra base de datos?
Para ello creemos un espacio de nombres nuevo llamada cyberhades, al que además le añadimos la etiqueta team=cyberhades:
kubectl create namespace cyberhades kubectl label namespace cyberhades team=cyberhadesAhora ejecutamos nuestro cliente de mysql, pero le decimos a Kubernetes que los queremos en el espacio de nombres de cyberhades, para ello le añadimos la opción -n cyberhades:
kubectl run -it --rm --image=mysql:5.6 --restart=Never --labels="app=client" -n cyberhades mysql-client -- mysql -h IP -ppasswordKubernetes, o mejor dicho Cilium, no nos debería dejar conectarnos. Para poder hacerlo, creamos una política nueva, igual que la anterior, pero además de permitir acceso a los pods con la etiqueta app=client, vamos también añadir el espacio de nombres cyberhades, y para ello haremos uso de la etiqueta team=cyberhades (allow-from-client-cyberhades.yaml):
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-client-cyberhades spec: podSelector: matchLabels: app: mysql policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: client namespaceSelector: matchLabels: team: cyberhadesCreamos la nueva política:
kubectl apply -f allow-from-client-cyberhades.yamlProbamos de nuevo el comando anterior:
kubectl run -it --rm --image=mysql:5.6 --restart=Never --labels="app=client" -n cyberhades mysql-client -- mysql -h IP -ppassword
Figura 12: Misma situación anterior, pero ahora también client desde el espaciode nombres cyberhades también se puede conectar con mysql en el espacio de nombres default |
Y esta vez deberíamos de poder conectarnos tanto de el espacio de nombres de cyberhades como default, como puede verse en el siguiente vídeo:
Figura 13: Configuración de pruebas de Cilium en minikube
Para interactuar con las políticas de red podemos hacerlo a través del comando kubectl [verbo] networkpolicy. Un comando muy útil es el comando kubectl describe networkpolicy
Fijémonos en el from de la última política que hemos creado:
... - from: - podSelector: matchLabels: app: client namespaceSelector: matchLabels: team: cyberhades ...Esto se traduce a: permitir conexiones de los pods con la etiqueta app=client “Y” (“and”) de los espacios de nombre con la etiqueta team=cyberhades.
Ahora supongamos que el namespaceSelector tuviera un guion al principio:
... - from: - podSelector: matchLabels: app: client - namespaceSelector: matchLabels: team: cyberhades ...Ese simple guión demás nos cambia por completo la condición de ingress, en este caso en vez de un “Y” (“and”) sería un “O” (or) es decir, permitir conexiones de los pods con la etiqueta app=client “o” desde el o los espacios de nombre con la etiqueta team=cyberhades. Por lo tanto, cualquier pod en el espacio de nombres con etiqueta team=cyberhades podría conectar a nuestro servidor.
Veamos como kubectl describe mostraría esos ejemplos.
kubectl describe networkpolicy allow-from-client-cyberhades ... ... Allowing ingress traffic: To Port:Vemos como en el primer ejemplo tenemos un from y en el segundo dos.(traffic allowed to all ports) From: NamespaceSelector: team=cyberhades PodSelector: app=client ... kubectl describe networkpolicy allow-from-client-o-cyberhades ... ... Allowing ingress traffic: To Port: (traffic allowed to all ports) From: PodSelector: app=client From: NamespaceSelector: team=cyberhades ...
Para terminar, hay que añadir que es una buena práctica de seguridad el denegar por defecto todo el tráfico, tanto ingress como egress, y partir de ahí ir creando políticas para ir permitiendo el tráfico que vayas necesitando. De esta forma si un pod es comprometido, se lo ponemos más difícil al atacante a la hora de moverse lateralmente por nuestra red.
El fichero que deniega todo el tráfico tendría un contenido como este:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress - EgressFinalmente, en este enlace tenéis un buen números de políticas comunes. Todos los ejemplos usados se pueden encontrar en el repositorio de GitHub que tenemos para estos menesteres: https://github.com/cyberhades/network-policy-examples
Figura 14: Scripts de ejemplos utilizados en este artículo |
Cómo hemos visto a través de los ejemplos sólo hemos jugado con el tráfico entrante (ingress), pero de la misma forma podemos hacerlo con el tráfico saliente (egress), nuestro objetivo debería ser controlar y limitar el tráfico de red. Esperamos que estos ejemplos os sirvan de ayuda a la hora de construir vuestra infraestructura con Kubernetes.
Happy Hacking Hackers!!!
*********************************************************************************************
- Kubernetes: Gestionar políticas de seguridad de red “Like a Boss” (1 de 3)
- Kubernetes: Gestionar políticas de seguridad de red “Like a Boss” (2 de 3)
- Kubernetes: Gestionar políticas de seguridad de red “Like a Boss” (3 de 3)
*********************************************************************************************
Autores:
Fran Ramírez, (@cyberhadesblog) es investigador de seguridad y miembro del equipo de Ideas Locas en CDO en Telefónica, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps", también de "Machine Learning aplicado a la Ciberseguridad” además del blog CyberHades. Puedes contactar con Fran Ramirez en MyPublicInbox.
Rafael Troncoso (@tuxotron) es Senior Software Engineer en SAP Concur, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps" además del blog CyberHades. Puedes contactar con Rafael Troncoso en MyPublicInbox.
No hay comentarios:
Publicar un comentario