首页 > 解决方案 > 我可以在单个策略中授予服务帐户对多个存储桶的访问权限吗?

问题描述

我来自 AWS,仍在学习 IAM/Policies 在 GCP 中的工作方式。在 AWS 中,如果我想授予角色访问多个存储桶的权限,我会在 terraform 中执行以下操作:

data "aws_iam_policy_document" "policy" {

  statement {
    actions = [
      "s3:Get*"
    ]

    resources = [
      "${var.bucket1_arn}/*",
      "${var.bucket2_arn}/*",
      "${var.bucket3_arn}/*",
    ]
  }

}

resource "aws_iam_policy" "policy" {
  name   = "my-policy"
  policy = data.aws_iam_policy_document.policy.json
}


resource "aws_iam_role_policy_attachment" "policy_attachment" {
  policy_arn = aws_iam_policy.policy.arn
  role       = ${var.role_name}
}

我一直试图弄清楚如何在 GCP 中做到这一点,但到目前为止我发现我需要单独为每个存储桶附加一个策略,如下所示:

data "google_iam_policy" "policy" {
  binding {
    role = "roles/storage.objectViewer"

    members = [
      "serviceAccount:${service_account}",
    ]
  }

}

resource "google_storage_bucket_iam_policy" "bucket_1" {
  bucket = google_storage_bucket.bucket_1.name
  policy_data = data.google_iam_policy.policy.policy_data
}

resource "google_storage_bucket_iam_policy" "bucket_2" {
  bucket = google_storage_bucket.bucket_2.name
  policy_data = data.google_iam_policy.policy.policy_data
}

resource "google_storage_bucket_iam_policy" "bucket_3" {
  bucket = google_storage_bucket.bucket_3.name
  policy_data = data.google_iam_policy.policy.policy_data
}

这是授予服务帐户访问多个存储桶的正确方法(或最佳实践?)吗?

标签: google-cloud-platformterraformterraform-provider-awsterraform-provider-gcpgoogle-cloud-iam

解决方案


DazWikin 的回答是对的,但是在 GCP 上你可以作弊。事实上,您可以使用 IAM 条件并构建类似的东西:

  • 在文件夹或组织级别授予帐户(服务或用户)以授予其对所有资源的访问权限。例如,授予角色storage Admin
  • 使用条件仅在存储桶的子集上强制执行此角色

像那样

resource "google_organization_iam_binding" "Binding" {
  members = ["<ACCOUNT_EMAIL>"]
  org_id = "<YOUR_ORG_ID>"
  role = "roldes/storage.admin"
  condition {
    expression = 'resource.name.startsWith("projects/_/buckets/<BUCKET1>") || resource.name.startsWith("projects/_/buckets/<BUCKET2>")'
    title = "bucket filter"
  }
}

它不是那么干净,尤其是当您有要在列表中添加的新存储桶时进行更新,但这是您提出问题的一种解决方法。


推荐阅读