Saltar la navegación

8.1 Seguridad en las imágenes

A lo largo de todos los capítulos  hemos descargado multitud de imágenes desde DockerHub. Estas imágenes son el elemento fundamental sobre el que hemos desarrollado todo el curso pero si no tenemos cuidado pueden representar un posible riesgo de seguridad ya que, normalmente son imágenes realizadas por terceros y, por lo tanto, no tenemos ningún control sobre ellas.

Este aspecto no es tan importante si las usamos únicamente para el desarrollo pero adquiere mucha más relevancia si tenemos pensado llevar esos contenedores a producción.

Para intentar minimizar los riesgos de usar imágenes hay que seguir una serie de pautas generales:

  • Intentar siempre  usar una imagen de un usuario verificado o una imagen publicada por la propia empresa Docker.
  • Verificar la integridad de la imagen que nos descargamos.
  • Intentar usar imágenes que tengan lo mínimo.
  • Restringir los privilegios de los datos a los que pueden acceder los contenedores.
  • En caso de crear nuestras propias imágenes pagar por el servicio de DockerHub "Vulnerability Scanner" o utilizar herramientas que sirve para ese mismo propósito.

USUARIOS VERIFICADOS E IMÁGENES OFICIALES DE LA EMPRESA DOCKER

Aunque no es una garantía al 100%, el hecho de descargar este tipo de imágenes ayuda a reducir los posibles riesgos que puedan existir. Para obtener este tipo de imágenes, cuando hacemos una búsqueda debemos activar los filtros adecuados:

Búsqueda de imágenes oficiales o verificadas
Juan Diego Pérez Jiménez. Búsqueda de imágenes oficiales o verificadas (Dominio público)

VERIFICACIÓN DE LAS IMÁGENES

Docker utiliza un mecanismo de firma digital llamado DCT (Docker's Content Trust) para verificar la INTEGRIDAD y la AUTORÍA de las imágenes que nos descargamos desde DockerHub. Por defecto el mecanismo DCT está deshabilitado  y cuando hacemos docker pull podemos descargar imágenes sin verificar ni la integridad ni la autoría.

Si habilitamos DCT  solo podré hacer PULL / RUN / BUILD con imágenes "Trusted" salvo que explícitamente haga alguna excepción añadiendo el flag ---disable-content-trust a la ejecución de dichas órdenes.

Si quiero habilitarlo tengo que poner la variable de entorno DOCKER_CONTENT_TRUST=1. A partir de entonces no podré descargarme imágenes no firmadas, incluso aunque sean mías.En Linux esto se realiza de la siguiente manera:

# Añado la siguiente línea al final del fichero .bashrc que sirve para añadir esa variable de entorno

export DOCKER_CONTENT_TRUST=1

# Recargo el .bashrc

> source /home/miusuario/.bashrc

IMPORTANTE: El procedimiento en Windows y Mac para establecer variables de entorno es diferente.Si no quiero crear la variable de entorno puedo añadir DOCKER_CONTENT_TRUST=1 delante de la orden docker para conseguir el mismo efecto.

FIRMA DIGITAL DE MIS IMÁGENES

Si quiero firmar digitalmente mis imágenes tengo que seguir los siguientes pasos:

  1. Generar la parejas de claves público/privada. La privada se coloca en ~/.docker/trust/private
  2. Compartir mi clave pública con el servidor Notary asociado a DockerHub. Notary es una herramienta que me permite publicar contenidos confiables asegurando la integridad de dicho contenido y la autoría del mismo. Si utilizara otro registro diferente a DockerHub el hecho de tener un servicio Notary es requisito para poder firmar las imágenes en ese registro.TENGO QUE GENERAR UNA CLAVE PÚBLICA PARA CADA REPOSITORIO (Colección de versiones de la misma imagen).
  3. Firmar la imagen. Este proceso firma y a la vez hace un push.

# 1. Generar la pareja de claves

>  docker trust key generate miclave.pub

# 2. Comparto mi clave pública con el servidor Notary en el repositorio para las imágenes del respositorio usuario/nombreimagen. En nombre del firmante es miclave y miclave.pub es la clave pública generada en el proceso anterior. Recordad que un mismo repositorio puede contener varias versiones (TAGS) de una misma imagen.

> docker trust signer add --key miclave.pub miclave usuario/nombrerepositorio

# 3. Firmo la imagen

> docker trust sign usuario/nombreimagen[:tag]

Si quiero ver las firmas almacenadas para un determinado repositorio debo ejecutar la siguiente orden:

# 1. Obtener las firmantes y las claves de un repositorio

>  docker trust inspect --pretty nombreusuario/nombrerepositorio

Obtendremos una salida similar a la siguiente:

Salida de la orden docker trust inspect
Juan Diego Pérez Jiménez. Salida de la orden docker trust inspect (Dominio público)

Para más opciones de la orden docker trust os dejo el enlace directo a la referencia: https://docs.docker.com/engine/reference/commandline/trust/

IMÁGENES MíNIMAS

Shrink icon
b farias (CC BY)


Cuando estamos construyendo imágenes debemos intentar que sean imágenes de un tamaño mínimo. ¿Qué sentido tiene usar un sistema operativo entero si solo queremos instalar una aplicación o un servicio?.

Cada aplicación nueva que instalamos añade un potencial punto de inseguridad y nos obliga a estar atentos para actualizar a una nueva versión cuando surja una vulnerabilidad.

Dos buenas prácticas en este sentido son:

  • Si estamos construyendo nuestra propia imagen usaremos una imagen de base que sea de tamaño mínimo. Un ejemplo es bitnami/minideb. . También es cierto que a lo largo del curso hemos utilizado imágenes de terceros con un único servicio ya instalado. Normalmente estas imágenes ya están pulidas y no tienen mas que lo necesario.

  • Usar el fichero .dockerignore en nuestro proceso de build. Así evitamos que nuestra imagen tenga más tamaño del necesario.

RESTRICCIÓN DE PRIVILEGIOS

Cuando hablamos  de restricción de privilegios nos referimos a los permisos que el contenedor va a tener en el acceso a los volúmenes montados, bind mounts o a ciertos directorios del propio contenedor.

Si vamos a usar un volumen o un bind mount en el que no queremos que se pueda escribir desde el contenedor podemos hacerlo añadiendo la opción readonly al flag --mount. Por ejemplo:

# Realizo un bind mount evitando que desde el contenedor se pueda escribir en mi carpeta:

>  docker run -it --mount type=bind,src=/home/pekechis/pruebaPHP,dst=/var/www/html,readonly -p 8686:80 php:7.4-apache

Pero si por el contrario quiero evitar que se escriba en una carpeta propia del contenedor tengo que usar el flag --read-only de la orden docker run. El contenedor no podrá realizar ningún tipo de escritura en su sistema de ficheros. Por ejemplo:

# Arranco un contenedor en modo solo lectura.

>  docker run -it --read-only ubuntu:20.04 /bin/bash

SERVICIO "VULNERABILITY SCANNER"

Para cuentas de pago DockerHub proporciona un servicio que escanea las imágenes para encontrar vulnerabilidades  tanto a nivel de sistema operativo como a nivel de las posibles aplicaciones que tengamos instaladas en dichas imágenes. Para activar este servicio tenemos que cambiar de plan y aplicarlo a cada una de las imágenes que queramos escanear desde la sección de administración del repositorio de la imagen:

Habilitar el escaneo de vulnerabilidades
Juan Diego Pérez Jiménez. Habilitar el escaneo de vulnerabilidades (Dominio público)

Creado con eXeLearning (Ventana nueva)