"GCP IAM 绑定/成员"中的 "authoritative" 和 "非 authoritative" 的含义是什么?

27
我正在尝试理解GCP Terraform提供程序中https://www.terraform.io/docs/providers/google/r/google_service_account_iam.htmlgoogle_service_account_iam_bindinggoogle_service_account_iam_member的区别。我了解google_service_account_iam_binding用于向成员列表授予角色,而google_service_account_iam_member用于向单个成员授予角色,但是我不清楚这些定义中“Authoritative”和“Non-Authoritative”的含义是什么:

google_service_account_iam_binding:对于给定的角色具有“权威性”。更新IAM策略以向一组成员授予角色。保留服务帐号的IAM策略中的其他角色。

google_service_account_iam_member:非权威性。更新IAM策略以将角色授予新成员。保留服务帐号的角色的其他成员。

请问有人可以为我详细解释一下吗?
3个回答

20

"Authoritative" 的意思是更改所有相关特权,而 "non-authoritative" 的意思是不更改相关特权,只更改您指定的特权。

否则,您可以将 authoritative 解释为唯一真相的来源,而将 non-authoritative 解释为真相的一部分。


我 echo Stan 评论中的前两个问题。 - jamiet
Stan的回答比我的更精确,请参考他的回答。 - aximov

10

这个链接非常有帮助。
基本上,它的意思是:
如果一个角色绑定了一组 IAM 身份,并且您想要添加更多身份,则权威的方法需要您重新指定所有旧身份以及您要添加的新身份,否则您未指定的旧身份将从该角色中解除绑定。这与 Git 中的强制推送相当接近,因为它会覆盖任何现有的东西,在我们这里是身份。

非权威的方式则相反: 您只需要关心正在更新的身份即可。


2

Authoritative操作可能会删除现有的配置并破坏你的项目,而Non-Authoritative则不会。

使用Authoritative资源可能会产生严重破坏性后果。如果你使用了这些资源,可能会后悔。除非你对必须使用Authoritative资源非常有信心,否则不要使用它们。

我敢肯定您现在已经知道,在使用IAM资源的*_iam_policy和*_iam_binding版本时需要相当多的注意。资源中有一些“小心!”和“注意”警告,列出了一些潜在的风险,但也存在隐藏的危险。例如,使用google_project_iam_policy资源可能会意外地从项目中删除Google的服务代理(https://cloud.google.com/iam/docs/service-agents)的IAM角色。或者,使用google_storage_bucket_iam_policy和google_storage_bucket_iam_binding的危险,可能会删除包含项目的projectViewers:,projectEditors:和projectOwners:授予的默认IAM角色。

我遇到的人们遇到上述情况最大的问题是初始terraform计划并未显示任何内容被删除。虽然google_project_iam_policy的文档指出最好先terraform import该资源,但事实上,这适用于所有*_iam_policy和*_iam_binding资源。不幸的是,这很繁琐,可能被遗忘,并且不是你可以在Terraform模块中抽象化的东西。

参见terraform/gcp - 在哪些情况下我们别无选择只能使用Authoritative资源?和报告的问题。

一个简单的例子。如果你运行这个脚本,你认为会发生什么。你认为你可以继续使用你的GCP项目吗?

resource "google_service_account" "last_editor_standing" {
  account_id   = "last_editor_standing"
  display_name = "last editor you will have after running this terraform"
}

resource "google_project_iam_binding" "last_editor_standing" {
  project = "ToBeDemised"
  members = [
    "serviceAccount:${google_service_account.last_editor_standing.email}"
  ]
  role     = "roles/editor"                                    
}

这将至少删除对你的项目至关重要的Google APIs服务代理
如果你仍然认为这是需要使用的资源,请自行承担风险。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接