关闭匿名下载

网络安全Beginner
立即练习

介绍

一个小型支持团队把公开帮助文档和客户对账单存放在同一个存储桶中。门户通常使用签名请求读取对账单;访客应当只能读取帮助文档。错误的策略却使内部文档可以匿名下载。你将缩小访问范围,而不删除业务数据。

本实验使用 Storage Admin。Document Portal 显示预置应用;Portal App 是其独立的本地账户。所有文档和凭据均为合成数据。VersityGW 1.10.0 是本地 S3 兼容网关,使用内置用户名作为主体。本实验不复现 AWS IAM 或账户级 Public Access Block。掌握基本终端操作即可,无需云账户。

下载正常公开的文档

在这一步中,获取原本就应向访客开放的帮助文档。

在实验界面选择 Storage Admin 标签页,开始本步骤。

存储桶是具有名称的对象集合。对象键是存储的对象名称:public/help.txt 使用前缀 public/,而不是普通目录权限。此处存储桶为 documents,端点 http://127.0.0.1:7070 是这台 VM 上的存储服务。

curl 发起 HTTP 请求。不提供凭据时,它代表匿名访客。在 Storage Admin 中运行:

运行以下命令前,请切换到 Storage Admin 标签页。

curl -sS http://127.0.0.1:7070/documents/public/help.txt

-sS 隐藏进度条,但显示连接错误。预期看到 Synthetic help: contact support through the portal.。现在用 -o 指定输出文件,保存一个有用的本地副本:

curl -sS -o help.txt http://127.0.0.1:7070/documents/public/help.txt

用 cat 读取本地文档:

cat help.txt

应该显示相同的帮助文本。这是正常的公开访问。切换到 Document Portal 标签页,然后点击 Open assigned document:使用签名请求的门户应用也能读取合成对账单。下一步将把这种合法用途与匿名泄露区分开。

Document Portal 使用应用身份打开指定对账单

缩小匿名访问策略

在这一步中,禁止匿名读取内部文档,同时保留公开帮助。

在实验界面选择 Storage Admin 标签页,开始本步骤。

先匿名请求对账单。-w 追加 HTTP 响应码;\n 插入换行。200 表示请求成功。真正的权限拒绝是 403,并包含 AccessDenied;404 或连接错误并不能证明保护生效。

运行以下命令前,请切换到 Storage Admin 标签页。

curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:7070/documents/portal/statement.txt

看到对账单和 HTTP 200 说明存在泄露。不要删除它:门户仍然需要该文档。

AWS CLI 可以调用 S3 兼容 API。source 将预置的管理员凭据载入当前终端。这些凭据只用于本训练 VM;如果打开新的 Storage Admin 会话,请重新运行此命令。

source admin.env

从运行中的服务读取生效策略。s3api 选择对象存储操作;--endpoint-url 指向本地网关,而不是 AWS。--query Policy --output text 显示 JSON 策略字符串。

aws --endpoint-url http://127.0.0.1:7070 s3api get-bucket-policy --bucket documents --query Policy --output text

JSON 策略包含 Statement 列表。Effect: Allow 授予操作权限,Principal 指定获准的主体,Action 指定操作,Resource 指定对象。s3:GetObject 表示读取对象。Principal: "*" 包含匿名访客。资源 arn:aws:s3:::documents/* 覆盖所有键;末尾的 * 匹配任意后缀。另一条语句单独授予 portal-reader 访问 portal/* 的权限。

用 nano 编辑预置副本:

nano policy.json

只把匿名语句中的 Resource 从 arn:aws:s3:::documents/* 改为 arn:aws:s3:::documents/public/*。保留具名门户语句。JSON 字符串需要双引号,字段之间需要逗号。按 Ctrl+O 保存,按 Enter 确认,再按 Ctrl+X 退出。

只编辑本地文件不会改变访问权限。应用它;file:// 告诉 CLI 从该文件读取策略:

aws --endpoint-url http://127.0.0.1:7070 s3api put-bucket-policy --bucket documents --policy file://policy.json

应用成功时没有输出。如果 JSON 无效,重新打开编辑器,修正引号或逗号,然后再次应用。重复上面的匿名对账单请求:预期出现 AccessDenied 和 HTTP 403。没有适用允许规则的请求默认被拒绝。对所有人一概拒绝也会阻断合法门户。

保留门户和公开帮助

在这一步中,证明修复保留了有用的读取功能,并且文档未改变。

在实验界面选择 Storage Admin 标签页,开始本步骤。

用第 1 步的匿名命令重新测试公开帮助:应该仍然返回原始文本。切换到 Document Portal 标签页,再次打开 Open assigned document。预期看到对账单和 Identity: portal-reader。

为了直接测试具名身份,为这一条命令设置凭据。前缀赋值只影响该命令,因此终端中的管理员环境随后仍然可用。get-object 将指定键下载到命令末尾指定的本地文件名:

运行以下命令前,请切换到 Storage Admin 标签页。

AWS_ACCESS_KEY_ID=portal-reader AWS_SECRET_ACCESS_KEY=portal-reader-secret aws --endpoint-url http://127.0.0.1:7070 s3api get-object --bucket documents --key portal/statement.txt statement.txt

CLI 打印对象元数据。读取实际下载的文档:

cat statement.txt

预期看到 Synthetic statement: account 1042, balance 75 credits.。同一份已存储的对账单现在可通过具名请求访问,而匿名请求被拒绝。如果门户失败,重新检查生效策略:具名允许规则必须保留,匿名允许规则必须以 public/* 结尾。恢复策略并重新应用;删除对象或停止存储服务无法同时满足这两个要求。

总结

你区分了匿名请求与门户签名请求,缩小了真实存储桶策略的访问范围,并保留了公开帮助和客户对账单。成功的修复既要阻断泄露,也要保留正常业务路径。