Introducción a la Seguridad de Contenedores con Docker

CompTIABeginner
Practicar Ahora

Introducción

Bienvenido a este laboratorio práctico sobre los fundamentos de la seguridad de contenedores con Docker. Docker es una plataforma potente para desarrollar, distribuir y ejecutar aplicaciones en contenedores. Si bien los contenedores proporcionan aislamiento de procesos, su seguridad es crucial para proteger sus aplicaciones y el sistema anfitrión.

En este laboratorio, explorará los fundamentos de la seguridad de contenedores Docker. Primero, verificará que Docker esté configurado correctamente en el entorno LabEx. Luego, ejecutará un contenedor básico de servidor web Nginx, inspeccionará sus procesos en ejecución y examinará su consumo de recursos. Finalmente, aprenderá a aplicar controles de seguridad fundamentales estableciendo límites de recursos en un contenedor.

Al final de este laboratorio, tendrá una comprensión práctica de los pasos iniciales para asegurar un entorno Docker.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 100%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Verificar la Instalación y Configuración de Docker

En este paso, verificará que Docker ya está instalado en el entorno LabEx y se asegurará de tener los permisos adecuados para usarlo.

La máquina virtual LabEx viene con Docker preinstalado. Primero, comprobemos la versión de Docker para confirmar que está disponible.

docker --version

Debería ver una salida similar a esta, confirmando que Docker está instalado correctamente:

Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3

Ahora comprobemos si el demonio de Docker está en ejecución:

sudo systemctl status docker

Este comando le mostrará el estado del servicio Docker. Debería ver que está activo y en ejecución.

Para ejecutar comandos de Docker sin sudo, su usuario necesita estar en el grupo docker. En el entorno LabEx, su usuario ya está configurado con los permisos adecuados. Verifiquemos esto:

groups $USER

Debería ver docker en la salida, confirmando que su usuario tiene los permisos necesarios:

labex : labex sudo docker ssl-cert

Dado que su usuario ya está en el grupo docker, puede ejecutar comandos de Docker directamente sin necesidad de sudo.

Probemos que Docker funciona correctamente ejecutando un comando simple:

docker info

Este comando mostrará información a nivel de sistema sobre Docker, confirmando que puede comunicarse con el demonio de Docker con éxito.

Ejecutar un Contenedor Básico de Servidor Web

En este paso, ejecutará su primer contenedor. Utilizaremos la imagen oficial de nginx, que proporciona un servidor web ligero y de alto rendimiento.

Para ejecutar un contenedor, se utiliza el comando docker run. Usaremos algunas opciones comunes:

  • -d: Ejecuta el contenedor en modo "detached" (en segundo plano).
  • -p 8080:80: Mapea el puerto 8080 en el host al puerto 80 dentro del contenedor. Esto le permite acceder al servidor Nginx a través de localhost:8080.
  • --name webserver: Asigna un nombre fácil de recordar a su contenedor.
  • nginx: El nombre de la imagen a utilizar.

Ejecute el siguiente comando para iniciar el contenedor Nginx:

docker run -d -p 8080:80 --name webserver nginx

Docker primero verificará si la imagen nginx está disponible localmente. Si no lo está, la descargará automáticamente de Docker Hub y luego iniciará el contenedor. Puede ver que el contenedor se está ejecutando usando el comando docker ps.

docker ps

La salida mostrará su contenedor webserver, su ID, la imagen en la que se basa y el mapeo de puertos.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   webserver

Ahora, probemos si el servidor web está funcionando. Use curl para enviar una solicitud al servidor en el puerto mapeado.

curl localhost:8080

Debería ver el HTML de la página de bienvenida predeterminada de Nginx como salida, lo que confirma que su contenedor se está ejecutando y es accesible.

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. For further configuration, refer to the
      <a href="http://nginx.org/">nginx.org</a> documentation.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Examinar Procesos y Uso de Recursos del Contenedor

En este paso, aprenderá a inspeccionar los procesos que se ejecutan dentro de un contenedor y a monitorizar su consumo de recursos. Esta es una habilidad fundamental para depurar y comprender cómo se comporta su aplicación contenerizada.

Una característica clave de los contenedores es el aislamiento de procesos. Desde la perspectiva del host, puede ver lo que se está ejecutando dentro de un contenedor sin tener que usar exec para acceder a él. El comando docker top le permite ver los procesos principales de un contenedor.

Ejecute el siguiente comando para ver los procesos dentro de su contenedor webserver:

docker top webserver

La salida muestra el proceso maestro de Nginx ejecutándose como root y sus procesos trabajadores ejecutándose como systemd+ (un usuario del sistema para mejorar la seguridad). Observe que hay múltiples procesos trabajadores, lo cual es típico de Nginx para manejar solicitudes concurrentes de manera eficiente.

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4098                4078                0                   14:34               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            4161                4098                0                   14:34               ?                   00:00:00            nginx: worker process
systemd+            4162                4098                0                   14:34               ?                   00:00:00            nginx: worker process

A continuación, veamos el uso de recursos del contenedor. El comando docker stats proporciona un flujo en vivo de la CPU, memoria, red y E/S de disco de un contenedor. Para obtener una instantánea estática para este laboratorio, usaremos la opción --no-stream.

docker stats --no-stream webserver

Este comando mostrará una tabla con las métricas de recursos actuales para el contenedor webserver.

CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O     PIDS
bda2386621a1   webserver   0.00%     3.125MiB / 3.505GiB   0.09%     6.31kB / 1.27kB   0B / 12.3kB   3

De esta salida, puede ver que el contenedor está utilizando muy poca CPU (0.00%), aproximadamente 3.1 MiB de memoria de los 3.5 GiB de memoria del sistema disponibles (0.09%), y tiene 3 procesos en ejecución (el maestro de Nginx y 2 procesos trabajadores). Esta información es vital para identificar cuellos de botella en el rendimiento o posibles fugas de recursos en sus aplicaciones.

Inspeccionar Propiedades de Seguridad del Contenedor, como Límites de Recursos

En este paso, explorará una de las características de seguridad de contenedores más básicas pero críticas: los límites de recursos. Por defecto, un contenedor puede usar tanta CPU y memoria del host como desee. Establecer límites evita que un solo contenedor consuma todos los recursos disponibles y afecte a otros contenedores o al propio host.

Primero, inspeccionemos la configuración del contenedor webserver que creamos anteriormente. El comando docker inspect proporciona una salida JSON detallada con todas las configuraciones del contenedor.

docker inspect webserver

La salida es muy larga. Puede usar la opción --format para extraer campos específicos. Verifiquemos si hay algún límite de memoria establecido.

docker inspect --format='{{.HostConfig.Memory}}' webserver

La salida será 0, lo que significa que no hay límite de memoria.

0

Ahora, creemos un nuevo contenedor con un límite de memoria. Primero, deberá detener y eliminar el contenedor existente, ya que reutilizaremos el mapeo de puertos.

docker stop webserver
docker rm webserver

A continuación, ejecute un nuevo contenedor Nginx, pero esta vez agregue la opción --memory="100m" para limitar su uso de memoria a 100 megabytes. También le daremos un nuevo nombre.

docker run -d -p 8080:80 --name webserver-limited --memory="100m" nginx

Ahora, inspeccione el límite de memoria de este nuevo contenedor.

docker inspect --format='{{.HostConfig.Memory}}' webserver-limited

Esta vez, la salida será el límite de memoria en bytes (100 × 1024 × 1024).

104857600

Ha aplicado con éxito una restricción de recursos a un contenedor, lo cual es un paso fundamental en la seguridad de contenedores y la gestión de recursos.

Resumen

En este laboratorio, adquirió experiencia práctica con los aspectos fundamentales de Docker y la seguridad de contenedores.

Usted exitosamente:

  • Verificó la instalación de Docker y configuró los permisos de acceso adecuados en el entorno de LabEx.
  • Ejecutó un servidor web Nginx básico como un contenedor Docker.
  • Mapeó puertos para acceder a la aplicación contenerizada desde el host.
  • Inspeccionó los procesos que se ejecutan dentro de un contenedor usando docker top.
  • Monitorizó el uso de recursos en vivo con docker stats.
  • Aprendió a establecer límites de recursos, como la memoria, en un contenedor para mejorar la estabilidad y seguridad del sistema.

Estas habilidades son los pilares para gestionar y asegurar aplicaciones más complejas y multi-contenedor en un entorno de producción.