Herramientas de usuario

Herramientas del sitio


informatica:sistemas_operativos:cursos:docker_avanzado:distribucion_de_imagenes

¡Esta es una revisión vieja del documento!


Distribución de imágenes (Docker avanzado)

Contenido perteneciente al curso Docker avanzado.

Registro

Para la distribución de imágenes usamos los registros

Podemos usar un registro público o uno privado

El registro público más conocido y usado es Docker Hub

Docker Hub

Para publicar en Docker Hub lo primero que necesitamos es crear una cuenta de usuario: https://hub.docker.com/

Una vez tenemos la cuenta creada, tenemos que ir a la sección de repositorios y nos creamos nuestro propio repositorio: Podemos escoger entre público y privado

Lo siguiente es iniciar sesión con nuestro usuario en nuestro docker cliente:

docker login --username={username}

Ahora ya podemos crear imágenes con nuestro repositorio y subirlas a Docker Hub:

docker build {userName}/{repositoryName}:{tag}

Esto nos genera la imagen de forma local:

docker images

El último paso es subirla al registro:

docker push {userName}/{repositoryName}:{tag}

Docker Hub - Privado

Tenemos la posibilidad de instalar un servidor privado de Docker Hub en nuestra infraestructura

Ejemplo rápido de instalación en un contenedor:

docker run -d -p 5000:5000 --restart always --name registry registry:2

Y lo podríamos usar así:

docker pull ubuntu
docker tag ubuntu localhost:5000/ubuntu
docker push localhost:5000/Ubuntu

Un ejemplo más completo de configuración: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-private- docker-registry-on-ubuntu-18-04-es

Práctica guiada: auditar vulnerabilidades

Al igual que el resto de los componentes software, las imágenes de contenedores Docker, también suelen estar expuestas a vulnerabilidades que podrían desencadenar en una amenaza potencial cuando se ponga el contenedor en ejecución si no se detectan y tratan correctamente.

Docker Scout

Docker incorpora una herramienta llamada Docker Scout que nos puede ayudar a identificar estas vulnerabilidades en nuestras imágenes. Lo podemos ejecutar de forma directa en línea de comandos o integrarlo con nuestro registro (Docker Hub, …) y nuestras herramientas de CI.

Cuenta con los siguientes subcomandos:

  • docker scout compare: Compara dos imágenes y muestra las diferencias
  • docker scout cves: Muestra el detalle de las vulnerabilidades (CVEs) detectadas en una imagen
  • docker scout quickview: Muestra un resumen rápido de los CVEs detectados en una imagen
  • docker scout recommendations: Muestra las recomendaciones de actualización de las imágenes base y otras recomendaciones generales si están disponibles

Para instalar docker scout en Linux sin Docker Compose se puede usar Docker Scout CLI. Instalación rápida:

curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --

Para usar docker scout es necesario tener un Docker ID, para ello hay que crearse una cuenta en Docker Hub.

Caso práctico

Vamos a poner a prueba esta herramienta con una imagen de Ubuntu.

1. Lo primero es descargar la imagen que queremos analizar

docker pull ubuntu:latest

2. Visualizamos un resumen rápido de vulnerabilidades

docker scout quickview ubuntu:latest

Ejemplo de salida:

    ✓ SBOM of image already cached, 143 packages indexed

  Target   │  ubuntu:latest  │    0C     0H     2M    12L
    digest │  e4c58958181a   │

What's Next?
  View vulnerabilities → docker scout cves ubuntu:latest
  Include policy results in your quickview by supplying an organization → docker scout quickview ubuntu:latest --org <organization>

3. Vamos a consultar el detalle de todas las vulnerabilidades

docker scout cves ubuntu:latest

Ejemplo (resumido) de salida:

    ✓ SBOM of image already cached, 143 packages indexed
    ✗ Detected 12 vulnerable packages with a total of 14 vulnerabilities


## Overview

                    │       Analyzed Image
────────────────────┼──────────────────────────────
  Target            │  ubuntu:latest
    digest          │  e4c58958181a
    platform        │ linux/amd64
    vulnerabilities │    0C     0H     2M    12L
    size            │ 34 MB
    packages        │ 143


## Packages and Vulnerabilities

   0C     0H     1M     0L  perl 5.34.0-3ubuntu1.2
pkg:deb/ubuntu/perl@5.34.0-3ubuntu1.2?os_distro=jammy&os_name=ubuntu&os_version=22.04

    ✗ MEDIUM CVE-2022-48522
      https://scout.docker.com/v/CVE-2022-48522
      Affected range : >=0
      Fixed version  : not fixed
      CVSS Score     : 9.8
      CVSS Vector    : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
(...)
14 vulnerabilities found in 12 packages
  LOW       12
  MEDIUM    2
  HIGH      0
  CRITICAL  0      

4. Finalmente vamos a probar el comando de recomendaciones

docker scout recommendations ubuntu:latest

Ejemplo de salida:

    ✓ SBOM of image already cached, 143 packages indexed

Could not display recommendations for  ubuntu:latest
image has no base image

5. Ve a Docker Hub, busca la imagen de ubuntu:latest y compara los resultados obtenidos con la información mostrada en Docker Hub

6. Crea una imagen personalizada llamada ubuntu-updated tomando como imagen base ubuntu:latest y aplica las actualizaciones del sistema pertinentes.

Dockerfile:

FROM ubuntu:latest
RUN apt-get update && apt-get -y dist-upgrade
RUN apt-get clean

7. Repite los pasos 2, 3 y 4 sobre la imagen personalizada que acabamos de crear y analiza los resultados obtenidos. ¿Tenemos alguna posible solución para reducir las vulnerabilidades? En caso afirmativo, prueba a aplicar esa solución en una nueva imagen llamada ubuntu-updated-fixed y repite los paso 2, 3 y 4 sobre ella.

Al hacer:

docker scout recommendations ubuntu-updated

Nos dice:

Change base image
  The list displays new recommended tags in descending order, where the top results are rated as most suitable.


            Tag           │                        Details                         │   Pushed    │       Vulnerabilities
──────────────────────────┼────────────────────────────────────────────────────────┼─────────────┼──────────────────────────────
   23.10                  │ Benefits:                                              │ 6 days ago  │    0C     0H     0M     0L
  Major OS version update │ • Image is smaller by 2.2 MB                           │             │                  -2    -12
  Also known as:          │ • Image contains 18 fewer packages                     │             │
  • mantic                │ • Tag was pushed more recently                         │             │
  • rolling               │ • Image introduces no new vulnerability but removes 14 │             │
  • mantic-20231011       │ • Major OS version update                              │             │
                          │                                                        │             │
                          │ Image details:                                         │             │
                          │ • Size: 27 MB                                          │             │
                          │ • OS: 23.10                                            │             │
                          │                                                        │             │
                          │                                                        │             │
                          │                                                        │             │
   23.04                  │ Benefits:                                              │ 2 weeks ago │    0C     0H     0M     6L
  Major OS version update │ • Image is smaller by 2.5 MB                           │             │                  -2     -6
  Also known as:          │ • Image contains 17 fewer packages                     │             │
  • lunar                 │ • Image introduces no new vulnerability but removes 8  │             │
  • lunar-20231004        │ • Major OS version update                              │             │
                          │ • 23.04 was pulled 1.5M times last month               │             │
                          │                                                        │             │
                          │ Image details:                                         │             │
                          │ • Size: 27 MB                                          │             │
                          │ • Flavor: ubuntu                                       │             │
                          │ • OS: 23.04                                            │             │

Vamos a hacer lo que nos sugiere y cambiar la imagen base por la ubuntu:23.10:

FROM ubuntu:23.10

RUN apt-get update && apt-get -y dist-upgrade
RUN apt-get clean

8. Finalmente vamos a probar la opción de comparación (OJO: es una función experimental del comando docker scout).

Primero vamos a comparar la imagen base de ubuntu:latest con nuestra imagen ubuntu-updated

docker scout compare ubuntu:latest --to ubuntu-updated

Resultado (resumido>:

WARN 'docker scout compare' is experimental and its behaviour might change in the future
    ✓ SBOM of image already cached, 143 packages indexed
    ...Storing image for indexing
    ✓ Image stored for indexing
    ...Indexing
    ✓ Indexed 143 packages


  ## Overview

                      │       Analyzed Image        │      Comparison Image
  ────────────────────┼─────────────────────────────┼──────────────────────────────
    Target            │  ubuntu:latest              │  ubuntu-updated:latest
      digest          │  e4c58958181a               │  bec7ada07c12
      platform        │ linux/amd64                 │ linux/amd64
      vulnerabilities │    0C     0H     2M    12L  │    0C     0H     2M    12L
                      │                             │
      size            │ 34 MB (-32 MB)              │ 66 MB
      packages        │ 143                         │ 143
                      │                             │


  ## Environment Variables


      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
(...)
  ## Packages and Vulnerabilities


       143 packages unchanged




     Package              Type  Version                                  Compared Version

     acl                  deb   2.3.1-1                                  2.3.1-1
     adduser              deb   3.118ubuntu5                             3.118ubuntu5      
(...)

A continuación, compararemos ubuntu:latest con ubuntu:23.10:

docker scout compare ubuntu:latest --to ubuntu:23.10

Resultado (resumido):

WARN 'docker scout compare' is experimental and its behaviour might change in the future
    ✓ SBOM of image already cached, 143 packages indexed
    ...Storing image for indexing
    ✓ Image stored for indexing
    ...Indexing
    ✓ Indexed 125 packages


  ## Overview

                      │       Analyzed Image        │      Comparison Image
  ────────────────────┼─────────────────────────────┼──────────────────────────────
    Target            │  ubuntu:latest              │  ubuntu:23.10
      digest          │  e4c58958181a               │  fe7a3960a97e
      platform        │ linux/amd64                 │ linux/amd64
      vulnerabilities │    0C     0H     2M    12L  │    0C     0H     0M     0L
                      │                  +2    +12  │
      size            │ 34 MB (+2.7 MB)             │ 31 MB
      packages        │ 143 (+18)                   │ 125
                      │                             │


  ## Environment Variables
(...)
  ## Packages and Vulnerabilities


    +   23 packages added
    -    5 packages removed
    ⎌  115 packages changed (↑ 0 upgraded, ↓ 115 downgraded)
         5 packages unchanged


    + 14 vulnerabilities added


     Package              Type  Version                                  Compared Version

  ↓  acl                  deb   2.3.1-1                                  2.3.1-3
  +  adduser              deb   3.118ubuntu5
  ↓  apt                  deb   2.4.10                                   2.7.3
  ↓  attr                 deb   1:2.5.1-1build1                          1:2.5.1-4
(...)  

Trivy

Si queremos hacer un examen más en profundidad podemos echar mano de la herramienta Trivy

A diferencia de Docker Scout, Trivy tiene un ámbito de funcionamiento mucho mayor. La podemos utilizar para detectar CVEs en imágenes de contenedores, pero también será capaz de detectar configuraciones potencialmente peligrosas y secretos así como analizar otros elementos como repositorios de código, sistemas de ficheros, maquinas virtuales, configuraciones de Kubernetes o de infraestructuras cloud, etc.

Caso práctico

La herramienta Trivy se puede instalar como un script de sistema en diferentes plataformas, pero también tenemos la opción de usarla como un contenedor. Esta será la opción que vamos a utilizar en esta práctica.

1. Para poder utilizar Trivy y optimizar mejor el uso reiterado de la herramienta vamos a utilizar un bind para persistir la cache de la herramienta. Para ello creamos una carpeta que luego usaremos como volumen (También lo podemos hacer con un named volumen si lo preferimos)

mkdir ~/ trivy-cache

2. Vamos a ejecutar un análisis sobre la imagen de ubuntu:latest:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v ~/trivy-cache/:/root/.cache/ aquasec/trivy image ubuntu:latest

Al ligar docker.sock hacemos que los comandos Docker que ejecutemos dentro del contenedor, se aplican fuera (en la máquina que tiene Docker). Esto también se suele utilizar para sincronizar fecha y hora de los contenedores.

3. Compara los resultados obtenidos con Trivy y los obtenidos con Docker Scan. ¿Tenemos más o menos VCEs?

Resultado (resumido):

ubuntu:latest (ubuntu 22.04)
============================
Total: 23 (UNKNOWN: 0, LOW: 17, MEDIUM: 6, HIGH: 0, CRITICAL: 0)

┌──────────────────┬────────────────┬──────────┬──────────┬──────────────────────────┬───────────────┬─────────────────────────────────────────────────────────────┐
│     Library      │ Vulnerability  │ Severity │  Status  │    Installed Version     │ Fixed Version │                            Title                            │
├──────────────────┼────────────────┼──────────┼──────────┼──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
│ bash             │ CVE-2022-3715  │ LOW      │ affected │ 5.1-6ubuntu1             │               │ a heap-buffer-overflow in valid_parameter_transform         │
│                  │                │          │          │                          │               │ https://avd.aquasec.com/nvd/cve-2022-3715                   │
├──────────────────┼────────────────┤          │          ├──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
│ coreutils        │ CVE-2016-2781  │          │          │ 8.32-4.1ubuntu1          │               │ coreutils: Non-privileged session can escape to the parent  │
│                  │                │          │          │                          │               │ session in chroot                                           │
│                  │                │          │          │                          │               │ https://avd.aquasec.com/nvd/cve-2016-2781                   │
├──────────────────┼────────────────┤          │          ├──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
Vulnerabilidades Docker Scout Trivy
Unknown x 0
Low 12 17
Medium 2 6
High 0 0
Critical 0 0

Con docker scout nos encontró 14 y con Trivy 23.

informatica/sistemas_operativos/cursos/docker_avanzado/distribucion_de_imagenes.1697646285.txt.gz · Última modificación: por tempwin