Introdução
Defesa em profundidade significa usar vários controles em conjunto para que um único erro não exponha um ativo importante por si só. Uma verificação de token, uma vinculação de rede local, permissões de arquivo e logs protegem, cada um, uma parte diferente do mesmo serviço.
Neste laboratório, você fortalecerá um pequeno serviço Python que lê um arquivo secreto. Você fará uma pequena alteração de cada vez, executará o serviço, testará com curl e verificará se as camadas funcionam juntas.
Começando a partir de um Segredo Exposto
Nesta etapa, você inspecionará o serviço e observará o primeiro controle: uma solicitação sem o token esperado é rejeitada, enquanto uma solicitação com o token é bem-sucedida. A defesa em profundidade começa verificando o que já está protegido e o que ainda precisa de outra camada.
Entre no diretório do projeto:
cd /home/labex/project
Liste os arquivos preparados:
ls -l
Você deve ver secret_service.py, secret.txt e service-check.py.
Inicie o serviço em segundo plano. O & no final diz ao shell para manter o serviço em execução enquanto você continua digitando comandos:
python3 secret_service.py > service.log 2>&1 &
Salve o ID do processo em segundo plano para que você possa pará-lo corretamente mais tarde:
echo $! > service.pid
Tente ler o segredo sem um token:
curl -i http://127.0.0.1:8081/secret
A resposta deve incluir 403 Forbidden. Agora, envie o cabeçalho de token necessário:
curl -s -H "X-Access-Token: lab-token-2026" http://127.0.0.1:8081/secret
Você deve ver:
Project launch code: ORBIT-742
Pare o serviço antes de prosseguir:
kill "$(cat service.pid)"
Execute o verificador para a camada de token:
python3 service-check.py token
O resultado esperado é:
token: complete
Manter o Serviço Local
Nesta etapa, você confirmará a camada de exposição de rede. Um serviço que precisa apenas de acesso local deve ser vinculado a 127.0.0.1, também chamado de localhost. Esse endereço aceita conexões apenas da mesma máquina.
Inspecione a configuração de host padrão do serviço:
grep 'default="127.0.0.1"' secret_service.py
Você deve ver a definição de argumento para a opção --host. Esse padrão significa que executar python3 secret_service.py inicia o serviço no localhost.
Inicie o serviço novamente:
python3 secret_service.py > service.log 2>&1 &
Salve o ID do processo:
echo $! > service.pid
Use ss para inspecionar os sockets TCP em escuta. As opções -ltn significam escuta (listening), TCP e endereços numéricos:
ss -ltn | grep ':8081'
A saída deve mostrar 127.0.0.1:8081, o que é evidência de que o serviço é apenas local:
LISTEN ... 127.0.0.1:8081 ...
Pare o serviço:
kill "$(cat service.pid)"
Execute o verificador para a camada de localhost:
python3 service-check.py localhost
O resultado esperado é:
localhost: complete
Restringir o Arquivo Secreto
Nesta etapa, você adicionará uma camada de permissão de sistema de arquivos. Mesmo que o serviço tenha um bug, o arquivo secreto não deve ser legível por todas as contas locais.
Verifique as permissões atuais do arquivo:
ls -l secret.txt
O arquivo começa com permissões mais amplas para que você possa melhorá-las. Use chmod 600 para tornar o arquivo legível e gravável apenas pelo seu proprietário:
chmod 600 secret.txt
Verifique as permissões novamente:
ls -l secret.txt
Os bits de permissão agora devem começar com -rw-------:
-rw------- ... secret.txt
Execute o verificador para esta camada:
python3 service-check.py permissions
O resultado esperado é:
permissions: complete
Registrar Solicitações Rejeitadas
Nesta etapa, você testará a camada de detecção. Bloquear uma solicitação não autorizada é útil, mas registrar essa rejeição fornece aos operadores evidências de que alguém tentou acessar a rota protegida.
Remova qualquer arquivo de log antigo para que esta etapa comece de forma limpa:
rm -f access.log
Inicie o serviço:
python3 secret_service.py > service.log 2>&1 &
Salve o ID do processo:
echo $! > service.pid
Envie uma solicitação sem o token:
curl -s http://127.0.0.1:8081/secret
O corpo da resposta deve ser:
forbidden
Visualize o log de acesso:
cat access.log
O log deve conter rejected, /secret e missing_or_bad_token.
Pare o serviço:
kill "$(cat service.pid)"
Execute o verificador para a camada de log:
python3 service-check.py logging
O resultado esperado é:
logging: complete
Verificar as Camadas em Conjunto
Nesta etapa, você verificará o resultado completo da defesa em profundidade. O serviço deve exigir o token, permanecer local por padrão, proteger o arquivo secreto com permissões apenas para o proprietário e registrar solicitações rejeitadas.
Execute o verificador completo:
python3 service-check.py all
Cada camada deve estar completa:
token: complete
localhost: complete
permissions: complete
logging: complete
Inicie o serviço uma última vez:
python3 secret_service.py > service.log 2>&1 &
Salve o ID do processo:
echo $! > service.pid
Confirme se o segredo ainda funciona para uma solicitação autorizada:
curl -s -H "X-Access-Token: lab-token-2026" http://127.0.0.1:8081/secret
Você ainda deve ver:
Project launch code: ORBIT-742
Pare o serviço:
kill "$(cat service.pid)"
Esta verificação final é importante porque a defesa em profundidade deve proteger o serviço sem interromper o uso autorizado pretendido.
Resumo
Você praticou a defesa em profundidade criando camadas de controles em torno de um pequeno serviço. Você verificou a exigência de token, a vinculação apenas local, as permissões de arquivo apenas para o proprietário e o registro de acessos rejeitados.
A principal lição é que cada camada protege um ponto de falha diferente, enquanto o comportamento autorizado do serviço continua funcionando.



