Laboratorio de refuerzo de un servidor web: corrige una configuración débil de nginx y compruébala con curl

Este laboratorio da a cada alumno un pequeño sitio servido por nginx con una configuración débil a propósito. Muestra su número de versión, lista sus carpetas, no envía ninguna cabecera de seguridad y deja al alcance una carpeta .git, un archivo de copia de seguridad y una zona de administración abierta. El alumno lo examina con curl, corrige la configuración dentro del contenedor en marcha, recarga nginx y ve cómo cada comprobación pasa de FAIL a PASS.

Lo hemos diseñado nosotros a partir de la sola imagen pública de nginx, así que no hay ninguna aplicación vulnerable que atacar: solo un servidor que hacer más seguro. La copia del laboratorio no tiene ruta a internet ni a ningún otro alumno.

Qué aprenden los alumnos

Qué dice un servidor web a un visitante sin que se lo pidan: su versión exacta, los archivos de una carpeta, archivos que nadie quería publicar. Leen las cabeceras de respuesta con curl -I, añaden las cuatro cabeceras de seguridad habituales, desactivan el listado de carpetas y la versión, rechazan una carpeta .git y un archivo de copia de seguridad, y cierran a los visitantes una zona de administración. También practican probar una configuración con nginx -t, cargarla con nginx -s reload y comprobar el resultado con una herramienta. Es adecuado para las unidades de configuración segura y de administración de sistemas; consulta la redacción exacta en la unidad de tu organismo certificador.

Ejecútalo en tu navegador

El sitio es el servicio llamado web, y el terminal del laboratorio llega a él por ese nombre. Un comando docker en el terminal puede ver, abrir, reiniciar y leer los registros del servicio del laboratorio: no puede crear, descargar ni eliminar nada. La carpeta de configuración es un volumen con nombre, así que lo que el alumno guarda sigue ahí después de detener e iniciar de nuevo el laboratorio.

  1. Abre la página Contenedor. Abre «Crear» en la barra y elige «Ejecutar un contenedor». Cualquiera puede abrir la página, y el laboratorio de Git y el de SQL se inician sin cuenta. Todos los demás laboratorios necesitan una cuenta gratuita: crea una, inicia sesión y pulsa «Iniciar».
  2. Busca el laboratorio. La tarjeta «Laboratorios de ejemplo» lista todos los ejemplos. Busca Reforzar un servidor web (nginx).
  3. Pulsa «Iniciar». «Iniciar» lo ejecuta tal cual, con una sola pulsación. «Editar el archivo primero» abre el archivo compose para que lo cambies antes de iniciarlo.
  4. Ábrelo. En la página del laboratorio, abre el terminal junto al laboratorio. Ejecuta curl -I http://web para ver las cabeceras y docker exec web lab-check para ver nueve líneas PASS o FAIL. Después docker exec -it web sh abre una shell en el servidor: edita /etc/nginx/conf.d/default.conf, pruébalo con nginx -t y cárgalo con nginx -s reload. El enlace del laboratorio, The bakery’s website, abre el sitio en una pestaña.

Qué pedir a los alumnos que entreguen

La salida de curl -I http://web antes y después, y la de docker exec web lab-check al final, para que el cambio se vea en el propio terminal del alumno. Para cada corrección, una frase con sus propias palabras sobre qué daba la debilidad a un atacante y qué hace el ajuste. La comprobación dice si el servidor se comporta como debe; solo la explicación dice si se ha entendido. Para un trabajo más sólido, pide el archivo de configuración completo.

La comprobación es la del propio laboratorio: lab-check pregunta al servidor en marcha, así que informa de lo que hace nginx y no de lo que dice un archivo, y termina con éxito solo si pasan las nueve líneas. El README del repositorio da además un curl de una línea para cada corrección, para comprobar desde cualquier sitio. Nada se califica automáticamente.

Una lección básica en este laboratorio

Web Server Hardening Basics es una lección breve hecha en este laboratorio, con cada paso explicado y un botón Ejecutar que escribe su comando en el terminal del alumno. Mira las cabeceras y un listado de carpeta, ejecuta la comprobación, corrige el número de versión con un comando, recarga nginx y comprueba de nuevo. Las demás correcciones quedan para el alumno.

Una cuenta personal gratuita la recibe en el módulo Basics, que está en Inicio, cada centro puede copiarla de la carpeta Basics de la Biblioteca, y un centro nuevo la tiene en un módulo llamado Lab Basics (Sample). Es deliberadamente breve: muestra a un docente lo que es una lección hecha en un laboratorio, y el laboratorio hace el resto. Cópiala en un módulo propio para cambiarla.

El código en GitHub

El archivo compose ejecuta la imagen pública de nginx, fijada a una versión, como único servicio, y escribe el sitio y la configuración débil al arrancar. nginx tiene licencia BSD-2-Clause y nosotros no lo distribuimos. La prueba del repositorio recorre el laboratorio como un alumno, corrección a corrección, con los mismos límites que aplica la plataforma. Nada de lo que el sitio enlace fuera de sí mismo puede descargarse, porque el laboratorio no tiene salida a internet.

Asígnalo como trabajo

Indica en la tarea qué correcciones hacer y qué entregar.

  1. Crea el laboratorio. En tu módulo añade una tarea y elige la tarjeta «Laboratorio de contenedores», y después «En un repositorio de GitHub». Indica https://github.com/mitsurutech/lab-harden-nginx con la rama main. El archivo compose es el predeterminado, compose.yaml. Haz un fork del repositorio antes si quieres modificarlo.
  2. Publica y pruébalo. «Publicar» fija el commit que te mostraron, así que un cambio posterior en el repositorio no altera un laboratorio que ya has asignado. Inicia primero tu propia copia.
  3. Asígnalo. Asígnalo como cualquier tarea, con una fecha de entrega si quieres, e indica en la tarea qué hacer y qué entregar.
  4. Califica lo entregado. Abre la copia de un alumno y el trabajo que ha entregado, califícalo y devuélvelo con un motivo si necesita más.

Preguntas frecuentes

¿Qué pasa si un alumno guarda un error en la configuración?
El laboratorio arranca igualmente. Una configuración que no pasa nginx -t al arrancar se conserva al lado como default.conf.broken y se vuelve a escribir la débil. Para empezar a propósito desde la configuración débil, elimina el archivo .seeded en /etc/nginx/conf.d y reinicia el servicio.
¿Tiene el alumno que instalar algo o llegar a internet?
No. nginx y curl están en la imagen del propio laboratorio, el terminal está en el navegador, y la copia del laboratorio no tiene salida a internet.
¿Cómo comprueban los alumnos que el endurecimiento de nginx ha funcionado?
Ejecutan docker exec web lab-check en el terminal del laboratorio, que muestra nueve líneas PASS o FAIL y termina con éxito solo cuando pasan las nueve. Consulta al servidor en marcha, así que informa de lo que hace nginx y no de lo que dice un archivo, y curl -I http://web muestra las cabeceras antes y después.