Skip to main content

Usa imágenes UBI para minimizar las vulnerabilidades en contenedores

Escrito por
Headshot of Rags Srinivas

Rags Srinivas

Blog Design Red

27 de marzo de 2020

0 minutos de lectura

En Snyk, nos esforzamos por seguir mejorando las soluciones de seguridad para contenedores y entornos nativos de la nube. Como parte de este esfuerzo, Snyk Container permite que los desarrolladores se hagan plenamente responsables de la seguridad de sus imágenes de contenedor.

Una fuente común de vulnerabilidades en los contenedores es la imagen base que se incorpora como fundamento para crear imágenes personalizadas. En lugar de limitarse a reaccionar ante las nuevas vulnerabilidades, conviene adoptar un enfoque proactivo y comenzar con un conjunto de imágenes base bien seleccionadas y actualizadas continuamente.

En esta publicación, analizamos Red Hat Universal Base Images, que contribuyen a alcanzar el objetivo descrito anteriormente.

¿Qué es Universal Base Image (UBI)?

Anunciadas en Red Hat Summit en 2019, las Universal Base Images de Red Hat se basan en una plataforma de nivel empresarial: Red Hat Enterprise Linux (RHEL). Son imágenes de sistemas operativos base para contenedores que cumplen con OCI e incluyen diversos lenguajes de ejecución y paquetes que se pueden redistribuir libremente. Por ejemplo, las imágenes UBI 8 se actualizan cada vez que se actualizan las imágenes base de RHEL 8 y cuando se corrigen CVE críticos.

Desde una perspectiva técnica, son casi idénticas a las imágenes de Red Hat Enterprise Linux, lo que significa que ofrecen gran seguridad, rendimiento y ciclos de vida. Se publican bajo un Acuerdo de licencia de usuario final diferente. Es posible crear una aplicación en contenedores con UBI, subirla a cualquier servidor de registro y compartirla fácilmente con otras personas; como se puede redistribuir libremente, también se puede implementar en plataformas que no sean de Red Hat.

Encontrarás todos los detalles en la documentación de Red Hat sobre la creación, ejecución y administración de contenedores. Las imágenes de contenedor certificadas también aparecen en el catálogo de contenedores de Red Hat. Las imágenes UBI abarcan una amplia variedad de lenguajes de desarrollo populares, incluidos dotnet, golang, nodejs, Python, PHP y Ruby.

Encontrarás más información sobre las imágenes UBI en las preguntas frecuentes de Red Hat. Como mostramos a continuación, es bastante fácil incorporar imágenes UBI sin cambiar tu flujo de trabajo.

Cómo crear imágenes de contenedor con UBI

Empecemos con un ejemplo de Dockerfile para Python. Es posible usar imágenes UBI para distintos entornos de ejecución de lenguajes siguiendo un enfoque similar.

Este es un Dockerfile generado automáticamente para un ejemplo sencillo de “¡Hola, mundo!” en Python que usa flask.

FROM python
ENV PORT 8080
EXPOSE 8080
WORKDIR /usr/src/app

COPY requirements.txt . 
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["python"] 
CMD ["app.py"]

En lugar de usar python como imagen base, usemos la imagen UBI del registro de Red Hat y modifiquemos el Dockerfile como se muestra a continuación (quizás necesites las credenciales adecuadas para autenticarte y usar las imágenes). Observa que el único cambio está en la primera línea, donde usamos la imagen UBI.

FROM registry.redhat.io/ubi8/python-36
ENV PORT 8080
EXPOSE 8080
WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["python"] 
CMD ["app.py"]

Generar una aplicación en contenedores con UBI como imagen base es igual que hacerlo con una imagen que no sea UBI, como se muestra a continuación:

docker build -t ragsns/example-python-ubi .

Al ejecutar Snyk en la aplicación en contenedores con UBI como imagen base, se genera una lista de vulnerabilidades como la que se muestra a continuación.

snyk test --container ragsns/example-python-ubi --file=Dockerfile          

Testing ragsns/example-python-ubi...

✗ Low severity vulnerability found in npm
  Description: RHEA-2020:0330
  Info: https://snyk.io/vuln/SNYK-RHEL8-NPM-555355
  Introduced through: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  From: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:6.13.4-1.12.14.1.1.module+el8.1.0+5466+30f75629

✗ Low severity vulnerability found in nodejs
  Description: RHEA-2020:0330
  Info: https://snyk.io/vuln/SNYK-RHEL8-NODEJS-555347
  Introduced through: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  From: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:12.14.1-1.module+el8.1.0+5466+30f75629

✗ High severity vulnerability found in systemd-pam
  Description: RHSA-2020:0575
  Info: https://snyk.io/vuln/SNYK-RHEL8-SYSTEMDPAM-552042
  Introduced through: systemd-pam@239-18.el8_1.2
  From: systemd-pam@239-18.el8_1.2
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 0:239-18.el8_1.4

✗ High severity vulnerability found in systemd-libs
  Description: RHSA-2020:0575
  Info: https://snyk.io/vuln/SNYK-RHEL8-SYSTEMDLIBS-552044
  Introduced through: systemd-libs@239-18.el8_1.2
  From: systemd-libs@239-18.el8_1.2
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 0:239-18.el8_1.4

✗ High severity vulnerability found in systemd
  Description: RHSA-2020:0575
  Info: https://snyk.io/vuln/SNYK-RHEL8-SYSTEMD-552048
  Introduced through: systemd@239-18.el8_1.2
  From: systemd@239-18.el8_1.2
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 0:239-18.el8_1.4

✗ High severity vulnerability found in npm
  Description: RHSA-2020:0579
  Info: https://snyk.io/vuln/SNYK-RHEL8-NPM-555375
  Introduced through: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  From: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:6.13.4-1.10.19.0.1.module+el8.1.0+5726+6ed65f8c

✗ High severity vulnerability found in npm
  Description: RHSA-2020:0598
  Info: https://snyk.io/vuln/SNYK-RHEL8-NPM-557042
  Introduced through: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  From: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:6.13.4-1.12.16.1.1.module+el8.1.0+5811+44509afe

✗ High severity vulnerability found in nodejs
  Description: RHSA-2020:0579
  Info: https://snyk.io/vuln/SNYK-RHEL8-NODEJS-555367
  Introduced through: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  From: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:10.19.0-1.module+el8.1.0+5726+6ed65f8c

✗ High severity vulnerability found in nodejs
  Description: RHSA-2020:0598
  Info: https://snyk.io/vuln/SNYK-RHEL8-NODEJS-557034
  Introduced through: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  From: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:12.16.1-1.module+el8.1.0+5811+44509afe

Organization:      rags
Package manager:   rpm
Target file:       Dockerfile
Project name:      docker-image|ragsns/example-python-ubi
Docker image:      ragsns/example-python-ubi
Base image:        registry.redhat.io/ubi8/python-36
Licenses:          enabled

Tested 417 dependencies for known issues, found 9 issues.

Ejecutar la imagen de contenedor basada en UBI también es igual que ejecutar la aplicación basada en una imagen que no sea UBI, como se muestra a continuación.

docker run -it -p8080:8080 ragsns/example-python-ubi

Esto es posible gracias a lo que se explica en la documentación: “Las nuevas Red Hat Universal Base Images te permiten crear tu contenedor UNA SOLA VEZ y redistribuirlo libremente en varias plataformas de implementación”.

O, si prefieres usar el conjunto de herramientas de contenedores de Red Hat para probar o ejecutar la aplicación, puedes usar el siguiente comando.

podman run -p 8080:8080 ragsns/example-python-ubi

Ahora que vimos un ejemplo con Python, en lugar de repasar individualmente cada ejemplo de entorno de ejecución de lenguaje (que quizá requieran algunos cambios menores para adaptarse al entorno correspondiente), veámoslos todos en conjunto.

Imágenes UBI para varios lenguajes

Como mencionamos antes, hay imágenes UBI para varios entornos de ejecución de lenguajes. Al ejecutar Snyk en las distintas imágenes UBI, se obtiene un resultado que se resume en la siguiente tabla.

Imagen UBI

Dependencias

Vulnerabilidades

registry.redhat.io/ubi8/nodejs-10

373

9

registry.redhat.io/ubi8/python-36

417

9

registry.redhat.io/ubi8/ruby-26

481

9

registry.redhat.io/ubi8/php-73

403

9

registry.redhat.io/ubi8/go-toolset

371

13

registry.redhat.io/ubi8/dotnet-21

248

10

La disponibilidad de imágenes UBI para diversos lenguajes y el bajo número de vulnerabilidades se deben a que Red Hat las selecciona y actualiza cuidadosamente. Esto incluye el sistema operativo base, los repositorios yum que se usan para instalar paquetes y herramientas, así como los lenguajes y frameworks. En este artículo de Red Hat se explica el proceso en detalle, que consiste principalmente en mantener una lista de errores de las imágenes UBI y actualizarlas periódicamente, mediante un proceso similar al que se usa para el propio sistema operativo base.

Resumen y próximos pasos

Mostramos lo fácil que es usar imágenes UBI como base para aplicaciones en contenedores con varios entornos de ejecución de lenguajes. Es bastante fácil aplicar los cambios, como obtener la imagen UBI de Red Hat, e incorporarlos a tu flujo de CI/CD o de desarrollo sin dejar de usar tus flujos de trabajo habituales.

Desde el punto de vista de la seguridad, las imágenes UBI son una buena opción para crear contenedores para tus aplicaciones, ya que vimos que siguen un proceso de mantenimiento riguroso, alineado con el proceso consolidado del sistema operativo RHEL. Como hay imágenes UBI para varios entornos de ejecución de lenguajes, usarlas como imágenes base para tus contenedores ayudará a minimizar las vulnerabilidades en tu aplicación.

Snyk protege el desarrollo de tus aplicaciones durante todo el ciclo de vida del desarrollo de software, con integraciones para tu registro de imágenes, repositorio de Dockerfile, pipelines de CI/CD y clústeres de Kubernetes, incluidos los entornos OpenShift 4. Snyk Container es compatible con imágenes UBI y RHEL, además de otras distribuciones populares de Linux.

Seguridad de contenedores centrada en los desarrolladores

Snyk encuentra y corrige automáticamente vulnerabilidades en imágenes de contenedores y cargas de trabajo de Kubernetes.