Google 云 - 如何通过标签或名称授予对机密组的访问权限?

Google Cloud - How to grant access to group of secrets by label or name?

我希望能够在 Google 云中授予服务帐户基于命名约定或更好的基于标签的多个机密的访问权限。

到目前为止,GCP 开始看起来只能提供基于组织、文件夹、项目或秘密级别的访问权限,除此之外,您无法对 IAM 的设置方式进行更细致的了解. See here

我想也许 GCP 的 IAM conditions 会让我在这里有更多的灵活性,但我也没有运气。使用以下 terraform - 我的 SA 仍然可以访问项目级别的所有机密。

resource "google_project_iam_member" "access_secrets" {
project = var.project_id
role    = "roles/secretmanager.secretAccessor"
member  = "serviceAccount:${google_service_account.service-a.email}"
provider = google-beta
  
condition {
   title       = "all-service-a-secrets"
   description = "All Service A secrets"
   expression  = "resource.name.startsWith('projects/my-project/secrets/service-a-secrets')"
  }
}

由于主要使用 AWS,我觉得权限更灵活一些。看起来也许答案是更自由地使用项目,但我还没有找到很多关于使用 GCP 项目的最佳方式的意见。

这目前不可能,但它在 2020 年的路线图上。

现在可以使用 resource.name.startsWith 实现(不确定何时实施)- 但是,这让我感到困惑,您 必须 使用数字项目 ID 和不是 URL.

中的项目名称

我正在使用 IAM 条件策略根据命名约定授予对机密的访问权限。

例如,以下条件策略仅授予用户访问以“dev-myapp1-”开头的机密的权限

resource "google_project_iam_binding" "SecretCreator" {
  project = "my-project-id"
  role    = "projects/my-project-id/roles/SecretCreator"

  members = [
    "user:user.name@example.com",
  ]

resource "google_project_iam_binding" "SecretManagerAdmin" {
  project = "my-project-id"
  role    = "roles/secretmanager.admin"

  members = [
    "user:user.name@example.com",
  ]

  condition {
    title       = "dev-myapp1-*"
    expression  = "resource.name.startsWith(\"projects/123456789012/secrets/dev-myapp1-\")" 
    # "123456789012" is the Project Number. You need to use Project Number in expression not the Project ID
    #You can get the Project Number by running the command : gcloud projects describe my-project-id
  }
}

resource "google_project_iam_binding" "SecretListViewer" {
  project = "my-project-id"
  role    = "projects/my-project-id/roles/SecretListViewer"

  members = [
    "user:user.name@example.com",
  ]

}

resource "google_project_iam_binding" "SecretManagerViewer" {
  project = "my-project-id"
  role    = "roles/secretmanager.viewer"

  members = [
    "user:user.name@example.com",
  ]

}

您可能需要在项目中创建两个自定义角色才能使用此条件策略。您可以使用以下 Terraform 模板在项目中创建自定义角色。

resource "google_project_iam_custom_role" "SecretListViewer" {
  role_id     = "SecretListViewer"
  title       = "SecretListViewer"
  description = "SecretListViewer"
  permissions = ["secretmanager.secrets.list"]
}

resource "google_project_iam_custom_role" "SecretCreator" {
  role_id     = "SecretCreator"
  title       = "SecretCreator"
  description = "SecretCreator"
  permissions = ["secretmanager.secrets.create"]
}

有了这个,用户应该能够创建具有任何名称的机密,但如果名称不是以“dev-myapp1-”开头,则不能向其中添加内容或查看或使用它。他将拥有使用“dev-myapp1-”管理机密的完全访问权限。但他将无法查看内容或管理其他机密。