仅授予门户所需访问权限

网络安全Beginner
立即练习

介绍

这个全新环境中的匿名泄露已经修复,但门户仍使用存储管理员凭据。它能做的远不止读取指定对账单。你将创建专用身份,仅授予所需对象读取权限,并让应用改用它。

用 Storage Admin 修改账户和策略,用 Portal App 编辑应用私有凭据文件,用 Document Portal 发起真实应用请求。合成场景运行在使用内置用户主体的本地 VersityGW 1.10.0 上,并非完整 AWS IAM。环境独立于上一个实验启动。

创建门户专用身份

在这一步中,用独立应用身份替代对管理员的依赖。

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

切换到 Document Portal 标签页,点击 Open assigned document,观察 Identity: storage-admin。对账单能正常显示,但不需要管理员权限。身份标识调用者;私密密钥让客户端通过签名请求证明身份。认证证明谁在调用;授权决定该调用者可以做什么。

切换到 Storage Admin 标签页,载入本 VM 的管理员凭据:

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

source admin.env

VersityGW 自带管理客户端。-a 指定访问密钥名称,-s 指定秘密值,-er 指定端点。create-user 之前的选项标识管理员,之后的选项定义新账户。user 角色没有管理员绕过权限。创建这个合成账户:

/opt/c14/versitygw admin -a storage-admin -s storage-admin-secret -er http://127.0.0.1:7070 create-user -a portal-reader -s portal-reader-secret -r user

成功时没有错误。如果重复运行后账户已存在,继续使用已有账户。不要授予 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 public/help.txt help.txt

对象元数据确认了经过认证的请求。公开帮助允许所有人读取;这还没有授予内部对账单读取权限。InvalidAccessKeyId 表示用户不存在,SignatureDoesNotMatch 表示密钥错误;它们都不是授权结果。

仅授予所需前缀的读取权限

在这一步中,授权专用身份,而不授予写入或无关读取权限。

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

门户需要 portal/statement.txt,允许的区域是 portal/。前缀匹配对象键的开头。portal/* 不包含 finance/budget.txt。读取使用 s3:GetObject;上传和删除使用不同操作 s3:PutObject 与 s3:DeleteObject。避免使用包含全部操作的 s3:*。

在 Storage Admin 中读取生效策略:

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

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

目前只有公开帮助的允许规则。打开本地副本:

nano policy.json

用下面的完整 JSON 替换它。保留公开语句,并为具名读取身份增加独立允许语句。VersityGW 的内置主体是用户名;AWS 主体格式不同。

{
  "Version": "2012-10-17",
  "Statement": [
    {"Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::documents/public/*"},
    {"Effect": "Allow", "Principal": "portal-reader", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::documents/portal/*"}
  ]
}

在 nano 中按 Ctrl+O、Enter 保存,再按 Ctrl+X 退出。用 file:// 应用文件:

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

无输出表示成功;语法错误会使旧策略继续生效。必要时修正并重新应用。测试允许的读取:

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

现在测试无关读取。预期的 AccessDenied 是有意的;出现后继续:

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 finance/budget.txt budget.txt

检查点还会在一次性的等效存储中测试真实写入和删除请求,保留线上文档。无效身份会在允许读取的正向对照中失败,因此无法用损坏的登录冒充最小权限。

切换应用凭据

在这一步中,让实际门户使用专用身份。

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

切换到 Portal App 标签页。这个独立本地账户拥有私有应用配置,不带有 Storage Admin shell 的凭据。读取当前文件:

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

cat credentials.json

access_key 和 secret_key 字段当前标识 storage-admin。编辑文件:

nano credentials.json

使用专用合成凭据:

{
  "access_key": "portal-reader",
  "secret_key": "portal-reader-secret"
}

按 Ctrl+O、Enter 保存,再按 Ctrl+X 退出。门户每次请求都会读取此文件,无需重启。切回 Document Portal 标签页,点击 Open assigned document 或刷新。预期看到 Identity: portal-reader 和原始对账单。如果门户提示无法读取,修正 JSON 或凭据,然后在 Storage Admin 中检查策略。

Document Portal 使用专用 portal-reader 身份

最后,切换到 Storage Admin 标签页,测试匿名内部请求和公开帮助。-sS 隐藏进度条并显示错误,-w 添加响应码:

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

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

预期出现 AccessDenied 和 HTTP 403。

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

预期返回原始帮助文本。应用身份和匿名访问是两条独立边界;保护其中一条不会自动保护另一条。

总结

你创建了普通应用身份,仅允许所需前缀的读取,并让正常工作的门户不再使用管理员凭据。你分别验证了认证、授权、公开访问和应用可用性。