Introducción
Mantienes el mismo importador en un entorno nuevo. Su política acepta cualquier URL y su cliente HTTP sigue redirecciones. Debes limitar esta función a un destino fijo del catálogo sin romper las imágenes ni el consumidor legítimo de inventario de la aplicación.
Harás una pequeña edición de Python explicada. Workstation envía solicitudes; App Policy edita el archivo que App carga realmente. No se requiere experiencia en Python. Los datos preparados usan nombres controlados y redes aisladas; la política es específica para estos destinos y no demuestra prevención universal de SSRF.
Permitir solo el destino aprobado
Selecciona la pestaña Workstation en la interfaz del laboratorio para comenzar este paso.
En este paso, restringe la política activa al destino aprobado por la tienda. Una lista permitida define exactamente lo autorizado; rechaza lo demás. La regla comercial es:
| Esquema | Nombre de host | Puerto | Propósito |
|---|---|---|---|
http |
catalog.test |
8000 |
Imágenes de productos |
En la pestaña Workstation, examina una URL analizada. Analizar separa los campos, pero no decide si son seguros:
Cambia a la pestaña Workstation antes de ejecutar el siguiente comando.
python3 imagectl.py parse http://catalog.test:8000/leaf.png
Espera scheme: http, hostname: catalog.test y port: 8000. Si se omite el puerto HTTP, se usa 80, que no está aprobado. Prueba el comportamiento inseguro actual:
python3 imagectl.py probe http://internal.test:8000/status
probe hace la misma solicitud saliente real que una importación, sin guardar un registro. Antes de reparar, espera HTTP 200.
Cambia a la pestaña App Policy, que abre el directorio del host con policy.py. App monta ese directorio y carga el módulo en cada solicitud. Abre el editor:
Cambia a la pestaña App Policy antes de ejecutar el siguiente comando.
nano policy.py
Conserva por ahora FOLLOW_REDIRECTS = True. Sustituye únicamente la línea return True por:
return (p.scheme, p.hostname, p.port or 80) == ("http", "catalog.test", 8000)
Mantén los cuatro espacios iniciales: Python usa sangría para situar instrucciones dentro de una función. p = urlsplit(url) obtiene los campos. Los paréntesis agrupan tres valores en una tupla; == compara la tupla completa. La expresión devuelve un booleano, True o False. p.port or 80 proporciona el puerto HTTP normal si no se escribió ninguno. El texto entre comillas es una cadena; 8000 es un número.
Guarda con Ctrl+O, pulsa Enter y sal con Ctrl+X. En la pestaña Workstation, ejecuta:
Cambia a la pestaña Workstation antes de ejecutar el siguiente comando.
python3 imagectl.py probe http://catalog.test:8000/leaf.png
python3 imagectl.py probe http://internal.test:8000/status
La imagen debe devolver HTTP 200; Internal, HTTP 403 y destination denied. Un 502 indica un fallo de obtención, a menudo por un error de edición; no es un rechazo válido. Cambia a la pestaña App Policy, reabre nano policy.py, corrige escritura o sangría y guarda. Vuelve a la pestaña Workstation antes de repetir las pruebas. No reinicies: cada solicitud carga la política guardada.
Detener redirecciones y comprobar ambos aspectos
Selecciona la pestaña Workstation en la interfaz del laboratorio para comenzar este paso.
En este paso, cierra la ruta de redirección restante y comprueba que la función normal sigue disponible. En la pestaña Workstation, prueba la redirección de Catalog tras restringir los destinos:
Cambia a la pestaña Workstation antes de ejecutar el siguiente comando.
python3 imagectl.py probe http://catalog.test:8000/redirect
Todavía devuelve el JSON de Internal: el cliente HTTP sigue la redirección después de la primera comprobación. La tienda solo admite URL directas de imágenes y por ello rechaza todas las redirecciones.
En la pestaña App Policy, abre el mismo archivo activo:
Cambia a la pestaña App Policy antes de ejecutar el siguiente comando.
nano policy.py
Cambia FOLLOW_REDIRECTS = True por FOLLOW_REDIRECTS = False. Esta variable selecciona el controlador HTTP preparado que rechaza redirecciones. Conserva la comprobación de destino. Guarda con Ctrl+O, Enter y sal con Ctrl+X.
En la pestaña Workstation, prueba los casos prohibidos uno por uno:
Cambia a la pestaña Workstation antes de ejecutar el siguiente comando.
python3 imagectl.py probe http://catalog.test:8000/redirect
python3 imagectl.py probe https://catalog.test:8000/leaf.png
python3 imagectl.py probe http://catalog.test:8001/leaf.png
Espera HTTP 422 con redirect denied para la redirección y HTTP 403 para ambos destinos incorrectos. https es otro protocolo; cambiar solo el puerto también cambia el destino. Un error de conexión o 502 no es la denegación esperada.
Importa finalmente la imagen legítima y comprueba el consumidor independiente de inventario:
python3 imagectl.py fetch http://catalog.test:8000/leaf.png normal
python3 imagectl.py direct http://app.test:8000/health
Ambos deben devolver HTTP 200; la salud debe incluir inventory: synthetic-ready. Cambia a la pestaña Image Importer y actualiza para ver la imagen verde. Bloquear todo, detener Internal o editar una copia no utilizada no sirve. Si falla la imagen, cambia a la pestaña App Policy para restaurar la tupla aprobada y vuelve a la pestaña Workstation para repetir la importación aprobada; si falla la salud, conserva la conectividad interna de App. La reparación controla los destinos fijos y redirecciones de esta función sin quitar acceso al consumidor legítimo de inventario.

Para una política futura con dos destinos, Python compara una tupla con un conjunto mediante in, por ejemplo (p.scheme, p.hostname, p.port or 80) in {("http", "one.test", 8000), ("http", "two.test", 8001)}. Las llaves contienen dos alternativas completas. Solo permite las combinaciones indicadas y rechaza un par cruzado de host y puerto. El próximo desafío proporciona su propia tabla.
Resumen
Comparaste tuplas completas de destinos, desactivaste redirecciones y comprobaste tanto las solicitudes prohibidas como las imágenes y el inventario conservados. Estos controles se aplican a identidades de servicio fijas y controladas.



