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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Cabecera | línea con datos que acompaña a una petición o a una respuesta | Server: nginx |
| Refuerzo | dejar un sistema con menos puertas abiertas | |
| TLS | protocolo que cifra la conexión entre navegador y servidor | |
| HSTS | cabecera que obliga al navegador a usar solo la dirección cifrada | |
| Listado de carpeta | página que enseña los archivos de una carpeta | |
| Superficie expuesta | todo 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
curl -s -I http://web | head -n 1Se 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
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?
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
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
| Comando | Imprime | Qué significa |
|---|---|---|
| Línea de estado | HTTP/1.1 200 OK | El sitio responde |
| Cabecera Server | Server: nginx/1.27.5 | Da su versión exacta a todo el mundo |
| X-Frame-Options | 0 | Esta cabecera de protección no se envía |
| Página de carpeta | Index 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
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.