围绕本地机密服务构建多层防御

网络安全Beginner
立即练习

简介

深度防御是指将多种控制手段结合使用,从而确保单一的失误不会导致重要资产直接暴露。令牌检查、本地网络绑定、文件权限和日志记录,每一项都为同一服务的不同层面提供了保护。

在本实验中,你将加固一个读取机密文件的小型 Python 服务。你将通过一系列小步操作,运行服务、使用 curl 进行测试,并验证这些防御层是如何协同工作的。

从暴露的机密开始

在这一步中,你将检查该服务并观察第一层控制:没有预期令牌的请求会被拒绝,而带有令牌的请求则会成功。深度防御始于检查哪些内容已经受到保护,以及哪些部分还需要额外的防御层。

进入项目目录:

cd /home/labex/project

列出准备好的文件:

ls -l

你应该能看到 secret_service.py、secret.txt 和 service-check.py。

在后台启动服务。末尾的 & 符号告诉 shell 在你继续输入命令时保持服务运行:

python3 secret_service.py > service.log 2>&1 &

保存后台进程 ID,以便稍后能干净地停止它:

echo $! > service.pid

尝试在没有令牌的情况下读取机密:

curl -i http://127.0.0.1:8081/secret

响应应包含 403 Forbidden。现在发送所需的令牌标头:

curl -s -H "X-Access-Token: lab-token-2026" http://127.0.0.1:8081/secret

你应该看到:

Project launch code: ORBIT-742

在继续之前停止服务:

kill "$(cat service.pid)"

运行令牌层的检查程序:

python3 service-check.py token

预期结果为:

token: complete

保持服务本地化

在这一步中,你将确认网络暴露层。仅需要本地访问的服务应绑定到 127.0.0.1(也称为 localhost)。该地址仅接受来自同一台机器的连接。

检查服务的默认主机设置:

grep 'default="127.0.0.1"' secret_service.py

你应该能看到 --host 选项的参数定义。此默认设置意味着运行 python3 secret_service.py 会在 localhost 上启动服务。

再次启动服务:

python3 secret_service.py > service.log 2>&1 &

保存进程 ID:

echo $! > service.pid

使用 ss 检查监听的 TCP 套接字。-ltn 选项分别代表监听(listening)、TCP 和数字地址(numeric addresses):

ss -ltn | grep ':8081'

输出应显示 127.0.0.1:8081,这证明该服务仅限本地访问:

LISTEN ... 127.0.0.1:8081 ...

停止服务:

kill "$(cat service.pid)"

运行 localhost 层的检查程序:

python3 service-check.py localhost

预期结果为:

localhost: complete

限制机密文件权限

在这一步中,你将添加文件系统权限层。即使服务存在漏洞,机密文件也不应被每个本地账户读取。

检查当前文件权限:

ls -l secret.txt

该文件初始权限较为宽松,以便你进行优化。使用 chmod 600 将文件设置为仅所有者可读写:

chmod 600 secret.txt

再次检查权限:

ls -l secret.txt

权限位现在应以 -rw------- 开头:

-rw------- ... secret.txt

运行此层的检查程序:

python3 service-check.py permissions

预期结果为:

permissions: complete

记录拒绝的请求

在这一步中,你将测试检测层。阻止未经授权的请求固然有用,但记录下这些拒绝行为能为运维人员提供证据,表明有人试图访问受保护的路由。

删除旧的日志文件,以确保此步骤从干净的状态开始:

rm -f access.log

启动服务:

python3 secret_service.py > service.log 2>&1 &

保存进程 ID:

echo $! > service.pid

发送一个不带令牌的请求:

curl -s http://127.0.0.1:8081/secret

响应正文应为:

forbidden

查看访问日志:

cat access.log

日志应包含 rejected、/secret 和 missing_or_bad_token。

停止服务:

kill "$(cat service.pid)"

运行日志层的检查程序:

python3 service-check.py logging

预期结果为:

logging: complete

综合验证防御层

在这一步中,你将验证完整的深度防御效果。该服务现在应要求令牌、默认保持本地访问、通过仅限所有者的权限保护机密文件,并记录被拒绝的请求。

运行完整检查程序:

python3 service-check.py all

每一层都应显示为完成:

token: complete
localhost: complete
permissions: complete
logging: complete

最后一次启动服务:

python3 secret_service.py > service.log 2>&1 &

保存进程 ID:

echo $! > service.pid

确认机密对于授权请求仍然有效:

curl -s -H "X-Access-Token: lab-token-2026" http://127.0.0.1:8081/secret

你应该仍然看到:

Project launch code: ORBIT-742

停止服务:

kill "$(cat service.pid)"

这一最终检查非常重要,因为深度防御的目标是在不破坏预期授权使用的情况下保护服务。

总结

你通过围绕一个小型的服务构建多层控制,实践了深度防御。你验证了令牌要求、仅限本地绑定、仅限所有者的文件权限以及拒绝访问的日志记录。

核心经验是:每一层都在保护不同的故障点,同时确保授权的服务行为依然能够正常工作。