¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cerrar las puertas de un servidor web (hardening)

Después de esta lección: Puedo reforzar un servidor web decidiendo qué oculta, qué rechaza y qué cifra.

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

El servidor que contaba demasiado

Una panadería tiene una web sencilla en un servidor pequeño. Una persona pide la página y, en la respuesta, lee el nombre del programa y su versión exacta. Otra abre una carpeta y encuentra una lista de archivos.

Nada está roto. Pero el servidor da más pistas de las que hacen falta.

La regla única

Advertencia

Este laboratorio es un servidor flojo a propósito. Ataca solo tu copia privada, que no tiene salida a internet. Atacar un sistema que no es tuyo, o que no tienes permiso para probar, es delito en casi todos los países.

Al final de esta lección

Nota

Puedo reforzar un servidor web decidiendo qué oculta, qué rechaza y qué cifra.

Palabras clave

PalabraQué significaEjemplo
Cabeceralínea con datos que acompaña a una petición o a una respuestaServer: nginx
Refuerzodejar un sistema con menos puertas abiertas
TLSprotocolo que cifra la conexión entre navegador y servidor
HSTScabecera que obliga al navegador a usar solo la dirección cifrada
Listado de carpetapágina que enseña los archivos de una carpeta
Superficie expuestatodo lo que un desconocido puede alcanzar

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Mira el servidor de tu laboratorio

Tu laboratorio ejecuta una web de una panadería en nginx. Arráncalo y ejecuta estos cuatro comandos. Solo leen. El primero muestra la línea de estado. El segundo muestra la cabecera Server. El tercero cuenta una cabecera de seguridad. El cuarto lee una página de carpeta.

La línea de estado

Comando
curl -s -I http://web | head -n 1

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

La cabecera Server

Comando
curl -s -I http://web | grep -i "^server"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

¿Cuántas cabeceras X-Frame-Options?

Comando
curl -s -I http://web | grep -ci "x-frame-options"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El título de una página de carpeta

Comando
curl -s http://web/files/ | grep -o "Index of [a-z/]*"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo resuelto: leer las cuatro respuestas

ComandoImprimeQué significa
Línea de estadoHTTP/1.1 200 OKEl sitio responde
Cabecera ServerServer: nginx/1.27.5Da su versión exacta a todo el mundo
X-Frame-Options0Esta cabecera de protección no se envía
Página de carpetaIndex of /files/, dos veces (título y encabezado)El servidor lista la carpeta en vez de rechazar

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Las cabeceras de seguridad guían al navegador

Algunas cabeceras no cuestan nada y cierran familias enteras de problemas. X-Content-Type-Options: nosniff impide que el navegador adivine el tipo de un archivo. X-Frame-Options impide que otras webs enmarquen tu página.

Content-Security-Policy limita qué scripts pueden ejecutarse. Referrer-Policy limita qué dirección se pasa a otras webs.

Un error frecuente

Advertencia

Mucha gente cree que ocultar el número de versión hace seguro un servidor. Solo oculta una pista. Un servidor viejo con un fallo conocido sigue siendo débil. Oculta la pista, pero también actualiza el programa y quita lo que no se usa.

El tráfico debe ir cifrado con TLS

TLS tiene versiones. SSL 3, TLS 1.0 y TLS 1.1 son viejas y ya no se consideran seguras. Permite solo TLS 1.2 y 1.3.

Una buena configuración tiene un certificado de confianza y en vigor. Redirige la dirección sin cifrar a la cifrada. Envía HSTS para que los navegadores recuerden usar la cifrada.

Menos expuesto es dejar solo lo necesario

Sirve solo los archivos que necesita el sitio. Deja fuera de la carpeta web las copias de seguridad, las carpetas del control de versiones y los archivos de configuración. Pon la zona de administración tras un acceso o una limitación de red.

Cada cosa que no sirves es una cosa menos que atacar.

Comprobar una cabecera en Python

Código: python
headers = ["content-type", "server"]
# Cambia name por "x-frame-options" y pulsa Run. Luego añade esa cabecera a la lista.
name = "x-frame-options"
if name in headers:
    print("presente:", name)
else:
    print("falta:", name)

Para ir más allá: cuatro cabeceras

La comprobación del laboratorio pide cuatro cabeceras: X-Content-Type-Options, X-Frame-Options, Content-Security-Policy y Referrer-Policy.

Cambia show-check para que recorra esa lista y escriba una línea por cabecera. Escribe en headers los nombres que da curl -s -I http://web en la terminal del laboratorio, en minúsculas, y predice antes cuántas líneas dirán falta.

Sobre este laboratorio y su código: Laboratorio de refuerzo de un servidor web: corrige una configuración débil de nginx y compruébala con curl

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.