Restringir destinos e redirecionamentos

CibersegurançaBeginner
Pratique Agora

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.

Image Importer preservando a imagem aprovada após as restrições de destinos e redirecionamentos

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.