介绍
你在全新环境中维护同一个图片导入器。目标策略目前接受所有 URL,HTTP 客户端会跟随重定向。你需要将此业务功能限制到一个固定目录端点,同时保留图片功能和应用正常的库存消费者。
你将完成一处有说明的小型 Python 编辑。Workstation 发出客户端请求;App Policy 编辑 App 实际加载的文件。无需 Python 编程经验。预置数据使用受控名称和隔离网络;策略仅针对这些端点,不代表通用 SSRF 防护。
只允许获批目标
本步骤将生效策略限制到商店批准的端点。允许列表精确列出可接受的目标,不匹配的输入会被拒绝。业务规则如下:
在实验界面选择 Workstation 标签页,开始本步骤。
| 协议 | 主机名 | 端口 | 用途 |
|---|---|---|---|
http |
catalog.test |
8000 |
商品图片 |
切换到 Workstation 标签页,查看解析后的 URL。解析仅将地址拆成字段,并不判断其安全性:
运行以下命令前,请切换到 Workstation 标签页。
python3 imagectl.py parse http://catalog.test:8000/leaf.png
预期出现 scheme: http、hostname: catalog.test、port: 8000。省略 HTTP 端口时使用 80,并非获批端口。尝试当前不安全行为:
python3 imagectl.py probe http://internal.test:8000/status
probe 和导入一样发出真实出站请求,但不保存导入记录。修复前预期为 HTTP 200。
切换到 App Policy 标签页,其中打开了包含 policy.py 的宿主机工作目录。App 挂载该目录,每次请求重新加载辅助文件。使用终端编辑器打开:
运行以下命令前,请切换到 App Policy 标签页。
nano policy.py
暂时保留 FOLLOW_REDIRECTS = True。仅将 return True 一行替换为:
return (p.scheme, p.hostname, p.port or 80) == ("http", "catalog.test", 8000)
保留开头四个空格:Python 通过缩进将语句归入函数。p = urlsplit(url) 生成解析字段。圆括号将三个值组成元组;== 比较整个元组。表达式返回布尔值 True 或 False。若未写端口,p.port or 80 提供普通 HTTP 端口。引号内是字符串,8000 是数字。
按 Ctrl+O 保存,按 Enter 确认,再按 Ctrl+X 退出。切回 Workstation 标签页,执行:
运行以下命令前,请切换到 Workstation 标签页。
python3 imagectl.py probe http://catalog.test:8000/leaf.png
python3 imagectl.py probe http://internal.test:8000/status
图片必须返回 HTTP 200;Internal 必须返回 HTTP 403 和 destination denied。502 表示抓取失败,常由编辑错误导致,并非有效策略拒绝。切换到 App Policy 标签页,重新打开 nano policy.py,修正拼写和缩进并保存。切回 Workstation 后再重试。不需重启;每次请求都会加载已保存策略。
阻止重定向并检查安全性和可用性
本步骤将关闭剩余重定向路径,并检查正常功能仍可用。切换到 Workstation 标签页,于目标修复后尝试 Catalog 重定向:
在实验界面选择 Workstation 标签页,开始本步骤。
运行以下命令前,请切换到 Workstation 标签页。
python3 imagectl.py probe http://catalog.test:8000/redirect
它仍返回 Internal 的 JSON,因为 HTTP 客户端在首次策略检查后跟随重定向。商店只接受直接图片 URL,因此选择拒绝所有重定向。
切换到 App Policy 标签页,打开同一个生效文件:
运行以下命令前,请切换到 App Policy 标签页。
nano policy.py
将 FOLLOW_REDIRECTS = True 改成 FOLLOW_REDIRECTS = False。此变量选择预置的、拒绝重定向请求的 HTTP 处理器。保留目标检查。按 Ctrl+O、Enter 保存,再按 Ctrl+X 退出。
切回 Workstation 标签页,逐一测试禁止的情况:
运行以下命令前,请切换到 Workstation 标签页。
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
重定向应返回 HTTP 422 和 redirect denied,两个错误端点均应返回 HTTP 403。https 是另一种协议;只改端口也会改变端点。连接失败或 502 并非所需拒绝。
最后导入正常图片,并检查独立的库存消费者:
python3 imagectl.py fetch http://catalog.test:8000/leaf.png normal
python3 imagectl.py direct http://app.test:8000/health
两者都必须返回 HTTP 200;健康响应必须包含 inventory: synthetic-ready。切换到 Image Importer 标签页并刷新,查看绿色图片。阻止所有请求、关闭 Internal 或编辑未使用的副本都不能达标。图片失败时,切换到 App Policy 标签页恢复获批元组,再切回 Workstation 重复获批图片导入;健康检查失败时保留 App 的内部连接。修复控制此功能的固定目标和重定向行为,不删除正常库存消费者的网络权限。

将来若允许两个端点,可用 in 比较元组与集合,例如 (p.scheme, p.hostname, p.port or 80) in {("http", "one.test", 8000), ("http", "two.test", 8001)}。花括号包含两个完整选项,因此仅允许所列组合,拒绝交叉的主机名/端口对。下一挑战会提供自己的端点表。
总结
你比较了完整的目标元组,禁用了重定向,同时测试了禁止请求和仍然正常的图片/库存行为。这些控制针对固定、受控的服务身份。



