Defesas em Camadas em torno de um Serviço Secreto Local

CibersegurançaBeginner
Pratique Agora

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.