Skip to main content

Docker para desarrolladores de Node.js: 5 cosas que debes saber para no poner en riesgo tu seguridad

Escrito por
docker node

25 de enero de 2021

0 minutos de lectura

Docker ya supera los 50 mil millones de descargas de imágenes de contenedor. Con millones de aplicaciones disponibles en Docker Hub, las aplicaciones basadas en contenedores son populares y ofrecen una forma sencilla de consumir y publicar aplicaciones.

Dicho esto, crear tus propias aplicaciones web de Docker para Node.js de manera ingenua puede implicar muchos riesgos de seguridad. Entonces, ¿cómo hacemos que la seguridad sea una parte esencial de Docker para desarrolladores de Node.js?

Antes de entrar en los detalles de Docker para Node.js y la creación de imágenes de Docker, revisemos algunas preguntas frecuentes sobre el tema.

¿Cómo puedo crear una imagen Docker de aplicaciones Node.js?

Ejecutar tu aplicación Node.js en un contenedor Docker puede ser tan sencillo como copiar el directorio del proyecto e instalar todos los paquetes npm necesarios, pero hay muchos aspectos relacionados con la seguridad y la producción que podrías pasar por alto. En la siguiente guía encontrarás consejos para entornos de producción sobre cómo contenerizar aplicaciones web de Node.js con Docker. Abarca desde elegir la imagen base de Docker adecuada y usar compilaciones de varias etapas hasta administrar secretos de forma segura y habilitar correctamente la configuración del framework para producción.

Este artículo se centra en la información que necesitas para comprender mejor el impacto de elegir la imagen base de Docker adecuada para Node.js y te ayudará a encontrar la imagen de Docker más segura disponible para tu aplicación.

¿Cómo ayuda Docker a los desarrolladores de Node.js?

Al empaquetar tu aplicación Node.js en un contenedor, puedes agrupar la aplicación completa, incluidos el entorno de ejecución, la configuración y las dependencias a nivel de sistema operativo, así como todo lo que necesita tu aplicación web para funcionar en distintas plataformas y arquitecturas de CPU. Estas imágenes se agrupan como artefactos desplegables llamados imágenes de contenedor. Las imágenes de Docker son paquetes de software que permiten reproducir compilaciones fácilmente y ofrecen a los desarrolladores de Node.js una forma de ejecutar el mismo proyecto o producto en todos los entornos.

Por último, los contenedores Docker permiten que los desarrolladores experimenten más fácilmente con nuevas versiones de plataformas u otros cambios sin necesitar permisos especiales ni configurar un entorno dedicado para ejecutar un proyecto.

1. Elige la imagen base de Docker adecuada para tu aplicación Node.js

Al crear una imagen de Docker para un proyecto de Node.js, creamos nuestra propia imagen de aplicación a partir de otra imagen de Docker, que descargamos de Docker Hub. A esto lo llamamos imagen base. La imagen base es el componente fundamental de la nueva imagen de Docker que vas a crear para tu aplicación Node.js.

Elegir la imagen base adecuada es fundamental, porque influye significativamente en aspectos que van desde la velocidad de compilación de la imagen de Docker hasta la seguridad y el rendimiento de tu aplicación web. Es posible que elijas una imagen completa de un sistema operativo basada en Debian o Ubuntu, porque te permite aprovechar todas las herramientas y bibliotecas disponibles en esa imagen.

Sin embargo, esto tiene un costo. Si una imagen base tiene una vulnerabilidad de seguridad, también estará presente en la imagen que acabas de crear. ¿Por qué empezar con el pie izquierdo y elegir una imagen base grande que contiene muchas vulnerabilidades?

Al revisar las imágenes base, observamos que muchas de las vulnerabilidades de seguridad pertenecen a la capa del sistema operativo (SO) que usan. El estudio de Snyk de 2019 Adelantar la seguridad de Docker mostró que las vulnerabilidades que aporta la capa del SO pueden variar mucho según la distribución que elijas.

Gráfico de barras titulado «Vulnerabilidades en imágenes de sistemas operativos», que muestra Debian 55, Debian stretch-slim 42, Ubuntu 31, CentOS 1, Fedora 0 y Alpine 0.

Por cierto, esta es una preocupación válida para todas las imágenes base que consideres usar. Por ejemplo, estas son las principales imágenes de Docker con sus compilaciones más recientes, según el informe State of Open Source Security de 2020. Como se muestra, las imágenes base de Docker contienen vulnerabilidades de seguridad de forma predeterminada.

2. Analiza tu imagen de Docker de Node.js durante el desarrollo

Crear una imagen de Docker a partir de otras imágenes, así como volver a compilarlas, puede introducir nuevas vulnerabilidades, pero hay una forma de mantenerlas bajo control.

Trata el proceso de compilación de imágenes de Docker como cualquier otra actividad relacionada con el desarrollo. Así como pruebas el código que escribes, también debes probar las imágenes de Docker que creas.

Estas pruebas incluyen análisis estáticos de archivos, también conocidos como linters, para asegurarte de evitar errores de seguridad y otros patrones inadecuados en tu Dockerfile. Describimos algunos en nuestras prácticas recomendadas de seguridad para imágenes de Docker. Si desarrollas aplicaciones Node.js, te recomendamos leer esta guía paso a paso: 10 prácticas recomendadas para contenerizar aplicaciones web de Node.js con Docker.

Conectar tus repositorios de git a Snyk también es una excelente opción. Snyk admite integraciones nativas con GitHub, GitLab, Bitbucket y Azure Repos. Al integrar git, podemos analizar tus pull request y agregarles información de seguridad si encontramos vulnerabilidades. Así, puedes establecer controles y rechazar la combinación de un pull request si introduce nuevas vulnerabilidades.

Si necesitas más flexibilidad para tu integración continua (CI) o una experiencia de desarrollo estrechamente integrada, conoce Snyk CLI.

La CLI te permite probar fácilmente la imagen de tu contenedor Docker. Supongamos que estás creando una imagen de Docker de forma local y la etiquetaste como nodejs:notification-v99.9; puedes probarla así:

  1. Instala Snyk CLI:$ npm install -g snyk

  2. Luego, deja que Snyk CLI obtenga automáticamente un token de API para ti con este comando:$ snyk auth

  3. Analiza la imagen base local:$ snyk container test nodejs:notification-v99.9

Los resultados de la prueba se muestran en pantalla junto con información sobre el CVE y la ruta que introduce la vulnerabilidad, para que sepas qué dependencia del SO es responsable.

A continuación, se muestra un ejemplo del resultado de analizar la imagen base de Docker node:15:

✗ High severity vulnerability found in binutils
  Description: Out-of-Bounds
  Info: https://snyk.io/vuln/SNYK-DEBIAN9-BINUTILS-404153
  Introduced through: dpkg/dpkg-dev@1.18.25, libtool@2.4.6-2
  From: dpkg/dpkg-dev@1.18.25 > binutils@2.28-5
  From: libtool@2.4.6-2 > gcc-defaults/gcc@4:6.3.0-4 > gcc-6@6.3.0-18+deb9u1 > binutils@2.28-5
  Introduced by your base image (node:15)

✗ High severity vulnerability found in binutils
  Description: Integer Overflow or Wraparound
  Info: https://snyk.io/vuln/SNYK-DEBIAN9-BINUTILS-404253
  Introduced through: dpkg/dpkg-dev@1.18.25, libtool@2.4.6-2
  From: dpkg/dpkg-dev@1.18.25 > binutils@2.28-5
  From: libtool@2.4.6-2 > gcc-defaults/gcc@4:6.3.0-4 > gcc-6@6.3.0-18+deb9u1 > binutils@2.28-5
  Introduced by your base image (node:15)

Organization:      snyk-demo-567
Package manager:   deb
Target file:       Dockerfile
Project name:      docker-image|node
Docker image:      node:15
Platform:          linux/amd64
Base image:        node:15
Licenses:          enabled

Tested 412 dependencies for known issues, found 554 issues.

Base Image  Vulnerabilities  Severity
node:15     554              56 high, 63 medium, 435 low

Recommendations for base image upgrade:

Alternative image types
Base Image                Vulnerabilities  Severity
node:current-buster-slim  53               10 high, 4 medium, 39 low
node:15.5-slim            72               18 high, 7 medium, 47 low
node:current-buster       304              33 high, 43 medium, 228 low

Tenemos una hoja de referencia de Snyk CLI que muestra algunas de las funciones que puedes realizar, y también puedes consultar nuestra documentación para obtener más información sobre cómo empezar a usar Snyk Container CLI.

3. Corrige las vulnerabilidades del entorno de ejecución de Node.js en tus imágenes de Docker

Un aspecto que suele pasarse por alto al administrar los riesgos de las imágenes de contenedores Docker es el propio entorno de ejecución de la aplicación. Ya sea que uses Docker para Java o ejecutes aplicaciones web de Docker para Node.js, el entorno de ejecución de Node.js puede tener vulnerabilidades.

Debes estar al tanto de las versiones de seguridad de Node.js y seguir la política de seguridad de Node.js. En lugar de mantenerte al día manualmente, aprovecha Snyk para detectar también las vulnerabilidades de seguridad de Node.js.

Para darte más contexto sobre las vulnerabilidades de seguridad en las distintas etiquetas de imágenes base de Node.js, analicé algunas con Snyk CLI y representé los resultados en el siguiente gráfico de escala logarítmica:

Gráfico de barras que compara el total de vulnerabilidades de seguridad con las vulnerabilidades del entorno de ejecución de Node.js en imágenes base de Docker para Node.js y sus variantes de entorno de ejecución.

Puedes ver que:

  1. La etiqueta de imagen base predeterminada node, también conocida como node:latest, incluye más de 500 vulnerabilidades de seguridad y también introduce 2 vulnerabilidades en el propio entorno de ejecución de Node.js. Esto debería preocuparte si actualmente ejecutas Node.js 15 en producción y no lo has actualizado ni corregido.

  2. Puede que la etiqueta de imagen base node:alpine no incluya dependencias vulnerables del SO en la imagen base —por eso no aparece una barra azul—, pero aun así contiene una versión vulnerable del entorno de ejecución más reciente de Node.js (la versión 15).

  3. Si usas una versión de Node.js sin soporte —por ejemplo, Node.js 10—, esta es vulnerable y puedes ver que ya no recibe actualizaciones de seguridad.

Si eligieras Node.js versión 15, que era la versión más reciente al momento de escribir este artículo, te expondrías no solo a 561 vulnerabilidades de seguridad en este contenedor, sino también a dos vulnerabilidades en el propio entorno de ejecución de Node.js.

Puedes consultar los resultados de las pruebas de análisis de Docker en esta URL pública de pruebas de imágenes. Puedes probar otras etiquetas de imágenes base de Node.js que uses con este servicio público y gratuito de análisis de Docker.

Informe de vulnerabilidades de Snyk para Docker node:15.5.0, que muestra 563 vulnerabilidades y problemas relacionados con Node resaltados en la barra lateral.

Si ya tienes una cuenta de usuario de Docker, puedes usarla para conectarte a Snyk e importar rápidamente tus repositorios de Docker Hub.

4. Supervisa las imágenes de Docker desplegadas para tus aplicaciones Node.js

Una vez que hayas creado las imágenes de Docker, probablemente las publiques en un registro de Docker que las almacena para que puedas desplegarlas e iniciarlas como una aplicación de contenedor funcional.

¿Por qué debemos supervisar las imágenes base de Docker?

Si has seguido todas las pautas de seguridad que mencionamos hasta ahora para analizar y corregir imágenes base, ¡excelente! Sin embargo, ten en cuenta que todo el tiempo se descubren nuevas vulnerabilidades de seguridad. Si ahora hay 78 vulnerabilidades de seguridad en tu imagen, eso no significa que mañana por la mañana no habrá 100, cuando se reporten nuevos CVE que afecten a tus contenedores en producción. Por eso es fundamental supervisar tu registro de imágenes de contenedor —las que usas para desplegar contenedores—, para detectar pronto los problemas de seguridad y poder corregirlos.

Puedes integrarte directamente desde la aplicación de Snyk con muchos registros de imágenes de Docker. Por ejemplo, puedes importar imágenes de Docker Hub, ACR, ECR, GCR o Artifactory. Snyk las analizará con regularidad y te avisará por Slack o correo electrónico si encuentra problemas de seguridad:

Panel de Snyk Projects que muestra una lista de proyectos de Docker con búsqueda y recuentos de problemas de gravedad alta, media y baja.

5. Sigue las pautas de seguridad y las recomendaciones para producción para obtener una imagen de Docker de Node.js segura y optimizada

¡Felicidades por seguir todas las pautas de seguridad hasta ahora!

Para concluir, si quieres mantenerte al día con las prácticas recomendadas de seguridad para crear imágenes de Docker optimizadas para aplicaciones de Node.js y Java, consulta estos recursos:

  1. 10 prácticas recomendadas de seguridad para Docker: prácticas de seguridad detalladas que debes seguir al crear imágenes base de Docker y al descargarlas. También presenta la confianza en el contenido de Docker.

  2. ¿Desarrollas en Java? Este recurso te resultará útil: Docker para desarrolladores de Java: 5 cosas que debes saber para no poner en riesgo tu seguridad

  3. 10 prácticas recomendadas para contenerizar aplicaciones web de Node.js con Docker: si desarrollas en Node.js, te encantará esta guía paso a paso que muestra cómo crear imágenes base de Docker seguras y de alto rendimiento para tus aplicaciones Node.js.

Empieza a probar y corregir tus imágenes de contenedor con Snyk.

Empieza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag viendo nuestro taller virtual introductorio a pedido.