简介
深度防御是指将多种控制手段结合使用,从而确保单一的失误不会导致重要资产直接暴露。令牌检查、本地网络绑定、文件权限和日志记录,每一项都为同一服务的不同层面提供了保护。
在本实验中,你将加固一个读取机密文件的小型 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)"
这一最终检查非常重要,因为深度防御的目标是在不破坏预期授权使用的情况下保护服务。
总结
你通过围绕一个小型的服务构建多层控制,实践了深度防御。你验证了令牌要求、仅限本地绑定、仅限所有者的文件权限以及拒绝访问的日志记录。
核心经验是:每一层都在保护不同的故障点,同时确保授权的服务行为依然能够正常工作。



