Introduction
Vous maintenez le même importateur dans un environnement neuf. Sa politique accepte toute URL et son client HTTP suit les redirections. Limitez cette fonction métier à un point de terminaison fixe du catalogue, tout en préservant les images et le consommateur légitime d’inventaire de l’application.
Vous effectuerez une courte modification Python expliquée. Workstation émet les requêtes ; App Policy modifie le fichier réellement chargé par App. Aucune expérience Python n’est nécessaire. Les données préparées utilisent des noms contrôlés et des réseaux isolés ; cette politique précise ne prétend pas empêcher toutes les SSRF.
Autoriser uniquement la destination approuvée
Dans cette étape, limitez la politique active à la destination approuvée par la boutique. Une liste autorisée définit exactement les entrées acceptables et refuse les autres. La règle métier est :
Sélectionnez l’onglet Workstation dans l’interface du laboratoire pour commencer cette étape.
| Schéma | Nom d’hôte | Port | Usage |
|---|---|---|---|
http |
catalog.test |
8000 |
Images de produits |
Passez à l’onglet Workstation et examinez une URL analysée. L’analyse sépare les champs sans décider de leur sécurité :
Passez à l’onglet Workstation avant d’exécuter la commande suivante.
python3 imagectl.py parse http://catalog.test:8000/leaf.png
Attendez-vous à scheme: http, hostname: catalog.test et port: 8000. Sans port HTTP explicite, 80 est utilisé, ce qui n’est pas approuvé. Essayez le comportement actuellement dangereux :
python3 imagectl.py probe http://internal.test:8000/status
probe effectue la même véritable récupération sortante qu’un import, sans enregistrer d’import. Avant correction, attendez-vous à HTTP 200.
Passez à l’onglet App Policy, qui ouvre le dossier hôte contenant policy.py. App monte ce dossier et recharge le module à chaque requête. Ouvrez l’éditeur :
Passez à l’onglet App Policy avant d’exécuter la commande suivante.
nano policy.py
Conservez pour l’instant FOLLOW_REDIRECTS = True. Remplacez uniquement return True par :
return (p.scheme, p.hostname, p.port or 80) == ("http", "catalog.test", 8000)
Gardez les quatre espaces initiaux : Python utilise l’indentation pour placer les instructions dans une fonction. p = urlsplit(url) produit les champs analysés. Les parenthèses regroupent trois valeurs en tuple ; == compare le tuple complet. L’expression renvoie un booléen, True ou False. p.port or 80 fournit le port HTTP normal en l’absence de port explicite. Le texte entre guillemets est une chaîne ; 8000 est un nombre.
Enregistrez avec Ctrl+O, Enter, puis quittez avec Ctrl+X. Revenez à l’onglet Workstation et exécutez :
Passez à l’onglet Workstation avant d’exécuter la commande suivante.
python3 imagectl.py probe http://catalog.test:8000/leaf.png
python3 imagectl.py probe http://internal.test:8000/status
L’image doit retourner HTTP 200 ; Internal doit retourner HTTP 403 et destination denied. 502 indique une récupération défaillante, souvent due à une erreur d’édition, et non un refus valide. Passez à l’onglet App Policy, rouvrez nano policy.py, corrigez l’orthographe et l’indentation, puis enregistrez. Revenez à l’onglet Workstation avant de retester. Aucun redémarrage : chaque requête charge la politique enregistrée.
Refuser les redirections et vérifier les deux aspects
Dans cette étape, fermez le chemin de redirection restant et vérifiez que le fonctionnement normal subsiste. Passez à l’onglet Workstation et essayez la redirection de Catalog après la correction des destinations :
Sélectionnez l’onglet Workstation dans l’interface du laboratoire pour commencer cette étape.
Passez à l’onglet Workstation avant d’exécuter la commande suivante.
python3 imagectl.py probe http://catalog.test:8000/redirect
Elle retourne encore le JSON d’Internal : le client suit la redirection après la vérification initiale. La boutique n’accepte que des URL directes d’images ; elle choisit donc de refuser toute redirection.
Passez à l’onglet App Policy et ouvrez le même fichier actif :
Passez à l’onglet App Policy avant d’exécuter la commande suivante.
nano policy.py
Remplacez FOLLOW_REDIRECTS = True par FOLLOW_REDIRECTS = False. Cette variable sélectionne le gestionnaire HTTP préparé qui refuse les redirections. Préservez le contrôle de destination. Enregistrez avec Ctrl+O, Enter, puis quittez avec Ctrl+X.
Revenez à l’onglet Workstation et testez les cas interdits séparément :
Passez à l’onglet Workstation avant d’exécuter la commande suivante.
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
Attendez-vous à HTTP 422 avec redirect denied pour la redirection, et HTTP 403 pour les deux mauvaises destinations. https est un autre protocole ; changer uniquement le port change aussi la destination. Une erreur de connexion ou 502 n’est pas le refus attendu.
Importez enfin l’image légitime et contrôlez le consommateur indépendant d’inventaire :
python3 imagectl.py fetch http://catalog.test:8000/leaf.png normal
python3 imagectl.py direct http://app.test:8000/health
Les deux doivent retourner HTTP 200 ; la santé doit inclure inventory: synthetic-ready. Passez à l’onglet Image Importer et actualisez la page pour voir l’image verte. Tout bloquer, arrêter Internal ou modifier une copie inutilisée ne satisfait pas le résultat. Si l’image échoue, passez à l’onglet App Policy pour restaurer le tuple approuvé, puis revenez à l’onglet Workstation pour répéter l’import autorisé ; préservez la connectivité interne d’App si la santé échoue. La correction contrôle les destinations fixes et les redirections de cette fonction sans retirer l’accès réseau au consommateur d’inventaire légitime.

Pour deux destinations futures, Python peut comparer un tuple à un ensemble avec in, par exemple (p.scheme, p.hostname, p.port or 80) in {("http", "one.test", 8000), ("http", "two.test", 8001)}. Les accolades contiennent deux choix complets. Cela autorise chaque combinaison indiquée et refuse une paire hôte/port croisée. Le défi suivant fournit sa propre table.
Résumé
Vous avez comparé les tuples complets de destinations, désactivé les redirections et testé les requêtes interdites ainsi que le maintien des images et de l’inventaire. Ces contrôles visent des identités de service fixes et contrôlées.



