Análisis de vulnerabilidades en AWS con la integración de Snyk
10 de febrero de 2021
0 minutos de lecturaSi usas el conjunto de herramientas de AWS relacionadas con Kubernetes, te alegrará saber que puedes usar Snyk para analizar directamente tus flujos de trabajo, con integraciones para Amazon Elastic Container Registry ( ECR ) y Amazon Elastic Kubernetes Service ( EKS ). ¡Aquí te explicamos cómo empezar!
En esta publicación usaré una de nuestras aplicaciones de prueba de Snyk para compilar e implementar una aplicación. Puedes encontrar el código aquí. También necesitarás instalar algunas dependencias:
Empecemos
Ahora que ya tienes todo listo, ¡empecemos!
Primero, configuremos ECR para que Snyk pueda acceder a nuestros repositorios. Para ello, debemos asignar una política y un rol en AWS Identity and Access Management que otorguen al backend de Snyk los permisos adecuados para realizar acciones como enumerar imágenes y extraerlas de nuestros repositorios de ECR.
Los pasos para configurar la integración están detallados en la documentación de Snyk, pero podemos encontrar toda la configuración necesaria directamente en la interfaz de Snyk. Ve a Settings/Integrations/ECR/Edit Settings y, primero, configura una política con el JSON que aparece en la interfaz:
- oriEsto otorgará a Snyk los permisos definidos en la sección Action del JSON para cualquier repositorio e imagen que hayamos configurado en nuestra cuenta de ECR. Este es el conjunto mínimo de permisos necesarios para enumerar repositorios e imágenes, y extraer imágenes de los repositorios. Sigue las instrucciones para agregar ese JSON a la configuración de la política de IAM en AWS.
Luego debemos agregar un rol y asignarle la política, tal como se indica en las instrucciones:

También debemos definir el alcance del rol especificando los ID de las organizaciones de Snyk que pueden usarlo. Para ello, edita las relaciones de confianza del rol recién creado usando el JSON de la documentación. La cadena sts:ExternalId será el ID de tu organización de Snyk. Este fragmento de JSON permite que el principal de AWS asuma el rol si el ExternalId proporcionado coincide con el ID de nuestra organización de Snyk.
Como se indica en las instrucciones, si necesitas agregar varias organizaciones de Snyk a esta política, debes incluirlas en un arreglo JSON entre corchetes:
Puedes encontrar el ID de tu organización de Snyk en Settings > General.

El último paso es configurar la interfaz de Snyk para que use ese rol al conectarse a ECR. Vuelve a Settings/Integrations/ECR/Edit Settings e ingresa la región en la que configuraste ECR y el rol que creamos anteriormente:

En este punto, la integración de ECR debería estar completamente configurada. Sigamos adelante y probémosla.
Primero, usemos AWS CLI para crear un repositorio en ECR:
Ahora que tenemos un repositorio en ECR, configuremos Docker para poder enviarle imágenes:
Este comando mostrará tu contraseña de inicio de sesión y luego la pasará a Docker CLI para autenticarte en tu registro de AWS ECR. Asegúrate de configurar correctamente la región de AWS donde habilitaste ECR.
Ahora revisemos nuestra aplicación de prueba. Es una aplicación sencilla de Node.js que contiene muchas vulnerabilidades, junto con la configuración para compilarla en Docker e implementarla en Kubernetes.
Lo primero que haremos es compilar la aplicación con Docker.
Una vez compilada la imagen, deberíamos verla en nuestro repositorio local de Docker:
Antes de enviarla a nuestro repositorio ECR de origen, debemos etiquetarla y reemplazar el nombre del repositorio por el que configuraste anteriormente en ECR:
Ahora podemos enviarla a ECR:
Cuando termine el envío, podemos revisar nuestro repositorio de ECR para ver la imagen que acabamos de enviar:
Una vez que la imagen esté en ECR, podemos configurar Snyk para analizarla desde allí. En la interfaz de Snyk, selecciona Add Project y ve al ícono de ECR:

Si la configuración de ECR es correcta, ahora deberíamos ver una vista con todos los repositorios y las imágenes que contienen y que están disponibles en ECR:

Podemos ver el repositorio goof que creamos anteriormente, con una sola etiqueta de imagen. Selecciona la imagen y luego haz clic en el botón Add selected repositories. En ese momento, Snyk importará el repositorio desde ECR y comenzará a analizarlo y monitorearlo.
Una vez completada la importación, deberíamos verla en la página de proyectos de Snyk:

Podemos ver que Snyk detectó tanto la imagen como el archivo package.json que utiliza la aplicación de Node implementada en ella, y creó proyectos para ambos.
La imagen usa una imagen base antigua y vulnerable. Snyk habrá detectado numerosas vulnerabilidades y recomendado imágenes base que podrían reducir el número total de vulnerabilidades.

El archivo package.json define los paquetes de Node incluidos en la aplicación, tanto directamente, mediante los paquetes especificados en el archivo package.json, como indirectamente, mediante las dependencias. Snyk habrá creado un árbol de dependencias con todos estos paquetes y consultado la base de datos de vulnerabilidades para detectar las que existen en las versiones específicas utilizadas. Verás que hay muchas, ya que esta aplicación está diseñada para usar versiones vulnerables.

También encontrarás información sobre cada vulnerabilidad y recomendaciones para corregirlas, con indicaciones sobre qué paquetes actualizar. Dedica un tiempo a explorar toda la información que ofrece la interfaz de Snyk.
Configurar la integración de Snyk con EKS
Lo siguiente es configurar la integración de Snyk con Elastic Kubernetes Service. Para hacerlo, necesitarás una prueba gratuita de uno de los planes estándar de Snyk, ya que la integración con Kubernetes forma parte de nuestra oferta de pago.
Para ello, creemos un clúster de Kubernetes con EKS. Hay varias formas de hacerlo, pero una de las más sencillas es usar la herramienta eksctl.
Primero, usaré AWS CLI para crear un keypair que pueda usar para conectarme por SSH a los nodos del clúster si lo necesito:
Luego usaré eksctl para crear un clúster, en este caso llamado mattjarvis-sko, en la región us-west-2, con un grupo de nodos administrado de Linux y mi keypair agregado.
% eksctl create cluster --name mattjarvis-sko --region us-west-2 --with-oidc --ssh-access --ssh-public-key SKO_demo --managed
Este comando tardará un tiempo en completarse, pero cuando termine tendrás un clúster de EKS completamente funcional y kubectl estará configurado para comunicarse con él.
Ahora que nuestro clúster de EKS está en funcionamiento, revisemos la configuración de Kubernetes para implementar la aplicación. En la copia del repositorio Git de la aplicación goof, encontrarás un directorio manifests que contiene dos archivos YAML de Kubernetes.
El archivo goof-deployment.yaml define la aplicación goof y un pod de mongodb, que necesita como dependencia. Debes cambiar la sección de imagen para usar el repositorio de ECR que configuraste anteriormente:
El archivo goof-service.yaml define el servicio para mongodb y proporciona conectividad al pod de mongodb en el puerto 27017. Así se conecta nuestra aplicación goof a la base de datos. También define un servicio externo de LoadBalancer que se implementará para proporcionar conectividad externa a la aplicación en ejecución. La implementación concreta de LoadBalancer depende de la plataforma donde se implemente el clúster. En AWS, aprovisionará un Elastic Load Balancer, con el puerto 80 expuesto al exterior y dirigido al puerto 3001 de nuestro pod goof, donde se ejecuta nuestra aplicación de Node.js.
Implementemos la aplicación en nuestro clúster:
La URL del campo EXTERNAL-IP la proporciona el ELB aprovisionado como parte del servicio LoadBalancer y podemos usarla para ver nuestra aplicación en funcionamiento. Si la abrimos en un navegador, deberíamos ver la aplicación goof en ejecución:

Nuestra aplicación ya está implementada y en ejecución en el clúster de EKS. El último paso es configurar la integración entre Snyk y nuestro clúster de EKS para poder analizar las cargas de trabajo en ejecución en producción. La integración de Snyk con Kubernetes consiste en un único operador de Kubernetes en un pod, que consulta la API de Kubernetes, analiza las imágenes de contenedor dentro del clúster y se comunica con el backend de Snyk.
Si usáramos CloudFormation para implementar el clúster de EKS, podríamos usar los Quick Starts de AWS que creamos para implementar la integración de Snyk. Pero, como en esta demostración usamos eksctl, hagamos la instalación manual paso a paso.
El primer paso es agregar el repositorio de Helm que contiene los gráficos de Helm para implementar Snyk Kubernetes Monitor:
Ahora crearemos un espacio de nombres independiente para ejecutar Snyk Monitor. Por lo general, es recomendable crear espacios de nombres separados para tus aplicaciones en Kubernetes, ya que esto permite un control más detallado de los permisos.
El siguiente paso es crear un secreto en Kubernetes que contenga nuestro integrationID de Snyk. El proceso de Snyk Monitor lo usará para comunicarse con la API de Snyk y enviarle información sobre los pods en ejecución del clúster. Si usáramos registros privados que requieren credenciales para extraer imágenes, también tendríamos que incluir esos datos de autenticación en la sección dockercfg.json. Encontrarás más detalles en la documentación de Snyk Monitor.
Una vez creado el secreto, podemos usar Helm para instalar Snyk Monitor en el espacio de nombres snyk-monitor.
Cuando termine la instalación del gráfico de Helm, deberíamos ver el pod snyk-monitor en ejecución en el espacio de nombres snyk-monitor de nuestro clúster:
También podemos ver los registros y confirmar que snyk-monitor está enviando datos a Snyk:
Es posible que las cargas de trabajo tarden un poco en aparecer en la interfaz de Snyk, ya que el monitor debe enviar los datos a Snyk. Pero en aproximadamente un minuto, deberías poder ver las cargas de trabajo en ejecución en el clúster si vas a Add Project/Kubernetes:

Ahora deberíamos ver las cargas de trabajo en ejecución. Para agregarlas, solo tenemos que seleccionar la casilla correspondiente para que Snyk las importe y analice.

Una vez importado el proyecto, podemos ir a la página Projects y abrir el proyecto importado. Lo primero que debemos notar es que Snyk detectó la configuración de ejecución de la carga de trabajo y verificó si presentaba problemas de seguridad. Aquí vemos que no pasó varias pruebas de seguridad, entre ellas, ejecutar como root y no tener límites de CPU establecidos:

Si ahora revisamos la carga de trabajo, veremos que Snyk detectó la imagen base y todas sus vulnerabilidades, y recomendó imágenes base alternativas con menos exposición a vulnerabilidades.

Para terminar
Esta demostración muestra cómo podemos empezar a integrar pruebas de seguridad en todo el ciclo de vida del desarrollo de software, una estrategia clave para mantener la seguridad de las cargas de trabajo y la infraestructura en entornos nativos de la nube.
Snyk también se integra con una amplia variedad de entornos de desarrollo integrados, herramientas de administración de código fuente y sistemas de CI/CD, para que puedas tener cobertura en todo el flujo de implementación.
Si usas los servicios de contenedores y Kubernetes de Amazon, es muy fácil integrar Snyk con ECR y EKS. Además, hay Quick Starts de AWS disponibles para implementar todo esto con plantillas de CloudFormation. ¡Crea una cuenta gratuita de Snyk y pruébalo!
Comienza con Capture the Flag
Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.
