Guías técnicas
Protección de entornos Docker/Kubernetes
Conceptos Docker
El primer concepto que tenemos que manejar es el de “contenedores”, aunque mucha parte de la comunidad de Internet asemeja los contenedores a la virtualización para poder explicarlos, la realidad se asemeja más a un mecanismo de empaquetado lógico. Un contenedor es un aislamiento de un proceso y, este proceso, contiene todas las librerías necesarias para hacer funcionar la aplicación que contiene
La ventaja de los contenedores reside en que para desplegarlos no necesitamos levantar una máquina virtual sino tener una aplicación que nos permita gestionarlos. Esta forma de trabajo nos permite desplegar un contenedor en mucho menos tiempo y consumir muchos menos recursos de la máquina física (o virtual) que los contiene, además, la portabilidad de los contenedores entre nuestra infraestructura on-premise y cloud es muy sencilla
Existen multitud de herramientas que nos permiten trabajar con contenedores pero en la actualidad “docker” se está convirtiendo en un estándar gracias a su facilidad de uso y a que dispone de un repositorio público para poder descargar contenedores ya desarrollados
Una “imagen” es la aplicación en sí misma, como podría serlo la calculadora de Windows, y un contenedor es la instancia de ese programa. Nosotros podríamos tener ejecutándose a la vez varias “calculadora de Windows” de forma simultánea, la imagen es el propio programa y el contenedor es cada una de esas instancias iguales.
Para instalar Docker en nuestro Linux (a día de hoy todos o la inmensa mayoría de despliegues están montados sobre Linux), simplemente tenemos que instalar la aplicación “docker.io”. Una vez que tenemos la aplicación ya podríamos empezar a desplegar nuestros contenedores
Cabe destacar que también existe una versión de Docker para Windows, en este caso, de forma automática lo que hace Microsoft es levantarnos una máquina virtual Linux sobre hyper-V y allí desplegar los contenedores, por este motivo, aunque es 100% funcional y compatible, sólo debería utilizarse para entornos de prueba, nunca en producción
Conceptos Kubernetes
Si bien hemos visto que con Docker es suficiente para construir nuestros contenedores y pasarlos a producción, se han desarrollado nuevas herramientas que aumentan las capacidades de gestión y orquestación con contenedores. Kubernetes es una de las más populares y se está convirtiendo en un estándar ‘de facto’ dada su fuerte presencia y numerosa comunidad de usuarios y desarrolladores.
Aunque tiene muchas utilidades, a nivel introductorio, vamos a comentar sus conceptos y usos básicos
En primer lugar, Kubernetes (abreviado K8s), realiza una función de monitorización y puede rearrancar contenedores que fallan o detener contenedores que no responden. Un pod se define como la unidad mínima de gestión de K8s, aunque un pod lo normal es que contenga únicamente un container, podríamos decidir que contenga más de uno, de esta forma, todos estos contenedores serían monitorizados, creados y destruidos de forma simultánea al gestionar nuestro pod
A nivel de disponibilidad, K8s se desplegará como un clúster con varios nodos, en donde existen nodos llamados “worker” donde corren nuestros contenedores y “master” donde se gestiona el propio clúster
En segundo lugar, K8s gestiona la escalabilidad de nuestros contenedores. Cuando nuestra aplicación se ve saturada de peticiones, en un despliegue tradicional, tendríamos que crear una nueva máquina virtual y configurarla en nuestro balanceador. Con K8s, el proceso de escalado es automático y gracias a lo que se denomina “servicio”, podemos balancear y gestionar todas las réplicas (contenedores) de nuestra aplicación especificando que nuestro servicio va a estar compuesto por un número de contenedores (iguales), bajo una única IP y puerto
Necesidad de protección
A día de hoy tanto la tendencia como la mayoría de aplicaciones desarrolladas en cloud son aplicaciones web, por lo tanto, la mayoría de aplicaciones que tenemos, independientemente de la estrategia de desarrollo, son susceptibles de ser atacadas aprovechando cualquier vulnerabilidad http/https, esto incluye a nuestros contenedores
Soluciones Fortinet
Para poder proteger cualquier aplicación Web, Fortinet dispone del producto FortiWeb, este producto es un Firewall de Aplicaciones Web y por lo tanto, aplica para proteger cualquier aplicación web que tengamos en producción
Como estrategias principales, podríamos centrarnos en dos topologías
Protección Norte-Sur
En este caso, podemos desplegar un FortiWeb (físico o virtual) a la entrada de nuestra aplicación web, es decir, entre el usuario y la dirección IP/puerto que publica la aplicación independientemente de la arquitectura
Protección Este-Oeste
Para el caso de K8s, Fortinet también ha desarrollado su producto FortiWeb en formato container, por lo tanto, se puede desplegar, escalar e integrar en cualquier aplicación basada en contenedores
De forma similar a como hacemos la microsegmentación en entornos virtuales, utilizamos NSX para decidir el flujo del tráfico y, de esta forma, hacer pasar el tráfico entre dos máquinas virtuales por nuestro FortiGate VMX. En el caso de K8s, en lugar de utilizar NSX, lo que utilizamos es una herramienta llamada ISTIO, esta herramienta nos permite hacer pasar el tráfico por nuestro FortiWeb Container cuando dos contenedores quieren comunicarse entre sí