为报告读取者授予限定范围的访问权限

AWSBeginner
立即练习

介绍

报告使用方需要读取一份私有报告,而不需要操作者对全部存储的访问权限。你将为其独立 IAM 身份授予范围限定的访问权限,测试实际请求,然后在保留报告数据的同时撤销授权。

本实验以资源引用和 S3 对象读取为基础。你应已了解 IAM Action 和 Resource;无需角色信任、实例配置文件或个人访问密钥知识。此全新环境已准备好两个 CLI 身份。

与认证考试的关联

认证 考试任务 实践内容
Cloud Practitioner (CLF-C02) 任务 2.3 和 3.1 通过可重复的基础设施配置管理最小权限身份策略。
Developer – Associate (DVA-C02) 任务 3.3,技能 3.3.4 部署基础设施定义的基础实践。
DevOps Engineer – Professional (DOP-C02) 任务 2.1 通过 IaC 定义管理资源的基础实践。
Solutions Architect – Associate (SAA-C03) 任务 1.1 限定 IAM 读取者策略范围并评估允许和拒绝访问的基础实践。

本实验实际资源及保留边界的概念总览。

准备报告并观察读取者

在这一步中,你将创建报告存储,观察一个有效的独立读取者最初没有访问权限的情况。

默认 CLI 身份管理基础设施。提供的 reader 配置文件属于独立 IAM 用户 report-reader;它的访问权限并非借用自操作者。创建存储不会自动授权该用户。选择配置文件改变的是 AWS 请求的签名身份,而不是资源本身。

在已准备好的根目录中创建报告存储:

cd /home/labex/project/reader-access
cat > main.tf <<'EOF'
resource "aws_s3_bucket" "reports" {
  bucket = "terraform-reader-reports"
}
resource "aws_s3_object" "report" {
  bucket       = aws_s3_bucket.reports.id
  key          = "reports/current.csv"
  content      = "orders,12\n"
  content_type = "text/csv"
}
EOF
terraform init
terraform plan

预期新增两个资源。应用配置并输入 yes:

terraform apply

尝试使用独立读取者读取报告。|| true 使此命令块在预期失败后仍能继续;它不会将请求变成成功读取。

aws s3api \
  get-object \
  --profile reader \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  reader-report.csv || true

预期看到 AccessDenied。身份有效,但没有匹配的权限。在整个实验中,保持独立的 team-reference-reports/keep.txt 对象为私有。AWS View 使用操作者身份检查存储;其中能够预览对象并不能证明读取者可以访问它。 部署后的 AWS View:实际创建的自有存储出现在保留的参考报告旁边。

仅授予目标报告的读取权限

在这一步中,你将使用资源引用构建 IAM 身份策略,并验证允许和禁止的读取请求。

内联身份策略直接附加到单个用户,并向该用户授予操作权限。s3:GetObject 作用于对象 ARN,而非存储桶 ARN。jsonencode 将 Terraform 值转换为有效 JSON,因此你可以使用普通 HCL 资源引用,而无需手动构造带转义的 JSON 字符串。

创建 policy.tf。读取者名称由环境预先提供;策略的目标 ARN 由创建的存储桶 ARN 和实际对象键组合而成。

cat > policy.tf <<'EOF'
resource "aws_iam_user_policy" "reader" {
  name = "ReadReport"
  user = "report-reader"
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect   = "Allow"
      Action   = "s3:GetObject"
      Resource = "${aws_s3_bucket.reports.arn}/${aws_s3_object.report.key}"
    }]
  })
}
EOF
terraform plan

计划新增一个策略,同时保留存储桶和报告。应用计划并输入 yes:

terraform apply

使用同一个 reader 配置文件读取目标:

aws s3api \
  get-object \
  --profile reader \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  reader-report.csv
cat reader-report.csv

预期看到 orders,12。现在使用同一身份访问一个无关的私有对象:

aws s3api \
  get-object \
  --profile reader \
  --bucket team-reference-reports \
  --key keep.txt \
  unrelated-report.txt || true

预期看到 AccessDenied,而不是下载到的参考数据。此策略仅授予报告读取权限;不得授权写入或删除报告。即使目标读取成功,宽泛的操作或资源通配符仍可能造成意外访问。检查会读取原生策略语义,并执行实际允许和禁止的读取请求;不要求特定的 JSON 布局。等价的字符串或列表表达式,以及仅覆盖报告的前缀,都可以在不授予新操作的前提下满足任务要求。

撤销授权而不删除数据

在这一步中,你将通过 Terraform 删除策略,并证明访问权限改变而报告仍然保留。

移除资源块会使计划提出删除该受管理资源。仅删除 policy.tf,保持存储配置不变:

rm policy.tf
terraform plan -out=revoke.tfplan
terraform show revoke.tfplan

预期销毁一个策略,不删除存储桶或对象。应用这份已保存的产物:

terraform apply revoke.tfplan

使用同一个读取者重试目标读取:

aws s3api \
  get-object \
  --profile reader \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  after-revoke.csv || true

预期看到 AccessDenied。撤销权限不会移除已下载的本地文件,存在 reader-report.csv 也不能证明新请求已获授权。使用默认操作者身份查询存储中的报告:

aws s3api \
  get-object \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  retained-report.csv
cat retained-report.csv

报告仍包含 orders,12。你改变了授权边界,但没有改变数据。有关 Action 和 Resource 的区别,请参阅 IAM 策略元素。

删除自有报告存储

在这一步中,你将在完成访问和撤销检查后清理存储。

销毁此根目录剩余的资源,并输入 yes:

terraform destroy

存储桶和报告对象被删除;提供的读取者和团队参考报告属于预先准备的环境,不在此根目录的状态中。检查最终映射和保留的参考报告:

terraform state list
aws s3api \
  list-buckets \
  --query 'Buckets[].Name'
aws s3api \
  head-object \
  --bucket team-reference-reports \
  --key keep.txt \
  --query ContentLength

状态列表为空,参考报告仍然保留。在最终检查完成之前,保留两个已准备好的 CLI 身份配置。

总结

你使用 jsonencode 和资源引用定义了 IAM 身份策略,通过独立读取者测试了允许和禁止的请求,在不删除报告数据的情况下撤销权限,并且仅删除了自有存储。