Introdução
Você mantém o mesmo importador em um ambiente novo. Sua política aceita qualquer URL, e o cliente HTTP segue redirecionamentos. Restrinja esse recurso a um endpoint fixo do catálogo, preservando as imagens e o consumidor legítimo de estoque da aplicação.
Você fará uma pequena edição Python explicada. Workstation envia solicitações; App Policy edita o arquivo realmente carregado pelo App. Não é necessária experiência em Python. Os dados preparados usam nomes controlados e redes isoladas; essa política é específica para esses endpoints e não promete prevenir toda SSRF.
Permitir somente o destino aprovado
Nesta etapa, restrinja a política ativa ao endpoint aprovado pela loja. Uma lista de permissões define exatamente as entradas aceitas e rejeita as demais. A regra comercial é:
Selecione a aba Workstation na interface do laboratório para começar esta etapa.
| Esquema | Nome de host | Porta | Finalidade |
|---|---|---|---|
http |
catalog.test |
8000 |
Imagens de produtos |
Mude para a aba Workstation. Examine uma URL analisada. A análise separa os campos, mas não determina se são seguros:
Mude para a aba Workstation antes de executar o comando a seguir.
python3 imagectl.py parse http://catalog.test:8000/leaf.png
Espere scheme: http, hostname: catalog.test e port: 8000. Sem uma porta HTTP explícita, usa-se 80, que não está aprovada. Teste o comportamento inseguro atual:
python3 imagectl.py probe http://internal.test:8000/status
probe realiza a mesma busca real de saída que uma importação, mas não salva um registro. Antes da correção, espere HTTP 200.
Mude para a aba App Policy, que abre o diretório do host com policy.py. App monta esse diretório e recarrega o módulo a cada solicitação. Abra o editor:
Mude para a aba App Policy antes de executar o comando a seguir.
nano policy.py
Por enquanto mantenha FOLLOW_REDIRECTS = True. Substitua somente a linha return True por:
return (p.scheme, p.hostname, p.port or 80) == ("http", "catalog.test", 8000)
Preserve os quatro espaços iniciais: Python usa indentação para manter instruções dentro de uma função. p = urlsplit(url) produz os campos analisados. Os parênteses agrupam três valores em uma tupla; == compara a tupla inteira. A expressão retorna um booleano, True ou False. p.port or 80 fornece a porta HTTP normal quando nenhuma foi escrita. Texto entre aspas é uma string; 8000 é um número.
Salve com Ctrl+O, pressione Enter e saia com Ctrl+X. Volte à aba Workstation. Execute:
Mude para a aba Workstation antes de executar o comando a seguir.
python3 imagectl.py probe http://catalog.test:8000/leaf.png
python3 imagectl.py probe http://internal.test:8000/status
A imagem deve retornar HTTP 200; Internal, HTTP 403 com destination denied. Um 502 indica falha na busca, geralmente por erro de edição; não é uma rejeição válida. Mude para a aba App Policy, reabra nano policy.py, corrija a grafia e a indentação e salve. Volte à aba Workstation antes de testar novamente. Não há reinício: cada solicitação carrega a política salva.
Parar redirecionamentos e verificar os dois lados
Nesta etapa, feche o caminho de redirecionamento restante e teste a preservação da função normal. Mude para a aba Workstation. Tente o redirecionamento do Catalog após corrigir os destinos:
Selecione a aba Workstation na interface do laboratório para começar esta etapa.
Mude para a aba Workstation antes de executar o comando a seguir.
python3 imagectl.py probe http://catalog.test:8000/redirect
Ele ainda retorna o JSON de Internal porque o cliente HTTP segue o redirecionamento após a primeira verificação. A loja só aceita URLs diretas de imagens, então sua regra é rejeitar todo redirecionamento.
Mude para a aba App Policy. Abra o mesmo arquivo ativo:
Mude para a aba App Policy antes de executar o comando a seguir.
nano policy.py
Troque FOLLOW_REDIRECTS = True por FOLLOW_REDIRECTS = False. Essa variável seleciona o manipulador HTTP preparado que recusa redirecionamentos. Preserve a verificação de destino. Salve com Ctrl+O, Enter e saia com Ctrl+X.
Volte à aba Workstation. Teste os casos proibidos separadamente:
Mude para a aba Workstation antes de executar o comando a seguir.
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
Espere HTTP 422 com redirect denied para o redirecionamento e HTTP 403 para os dois endpoints incorretos. https é outro protocolo; alterar apenas a porta também muda o endpoint. Erro de conexão ou 502 não é a rejeição desejada.
Finalmente importe a imagem legítima e confira o consumidor independente de estoque:
python3 imagectl.py fetch http://catalog.test:8000/leaf.png normal
python3 imagectl.py direct http://app.test:8000/health
Ambos devem retornar HTTP 200; a saúde deve incluir inventory: synthetic-ready. Mude para a aba Image Importer e atualize a página para ver a imagem verde. Bloquear tudo, parar Internal ou editar uma cópia não utilizada não satisfaz o resultado. Se a imagem falhar, mude para a aba App Policy para restaurar a tupla aprovada e volte à aba Workstation para repetir a importação aprovada; se a saúde falhar, preserve a conectividade interna do App. A correção controla destinos fixos e redirecionamentos desse recurso sem remover o acesso de rede do consumidor legítimo.

Para uma política futura com dois endpoints, Python compara uma tupla com um conjunto usando in, por exemplo (p.scheme, p.hostname, p.port or 80) in {("http", "one.test", 8000), ("http", "two.test", 8001)}. As chaves contêm duas alternativas completas. Isso permite cada combinação listada e rejeita pares cruzados de host e porta. O próximo desafio fornece sua própria tabela.
Resumo
Você comparou tuplas completas de destinos, desativou redirecionamentos e testou solicitações proibidas e a preservação de imagens e estoque. Esses controles se aplicam a identidades fixas e controladas de serviços.



