授予服务帐户访问项目内单个集群的权限

问题描述 投票:0回答:1

使用案例

我们有一个仅供测试的集群,我们希望将其用作 Github Actions 管道的一部分。我们希望管道能够在集群内做几乎任何它喜欢做的事情 - 创建/删除命名空间、资源等等。

方法

为此,我们创建了一个 google 服务帐户(不要与 kubernetes 级服务帐户或“KSA”混淆),并为相关 GCP 项目附加了以下角色:

  • 角色/container.clusterViewer
  • 角色/container.developer

然后,我们在运行该操作时使用 Google 的 auth 操作 来验证此 SA。

问题

概述的方法有效,但它会导致 SA 能够访问此特定 GCloud 项目中的“所有”集群。对于最小特权原则,我想将其限制为仅涉及相关集群。 我认为在

roles/container.developer

角色分配中添加一个条件就是答案,但我一直无法让它发挥作用。文档建议我应该能够使用集群的资源名称:

https://cloud.google.com/iam/docs/conditions-resource-attributes#resource-name
,但尝试失败了。我尝试了resource.name == "projects/<project>/locations/<location>/clusters/<name>",以及各种
.endsWith
食谱,但没有任何效果。然后我尝试了:
resource.type == "container.googleapis.com/Clusters"

而且我
仍然

在尝试创建命名空间时遇到权限错误。这向我表明,尝试创建命名空间时传递的资源类型实际上并不是集群 - 因此我无法指定我想要的条件类型。 所以这让我陷入困境。我缺少什么?做这样的事情的“正确”方法是什么?

google-kubernetes-engine gcloud google-cloud-iam
1个回答
0
投票

使用

RBAC

(基于角色的访问控制),您可以定义哪个用户可以在集群中执行哪些操作,通过使用角色绑定,您可以限制服务帐户只能在特定集群中执行操作。 另一种方法是您可以使用

带有 IAM 的标签

,它可以帮助您创建一个键值对来识别资源并应用您为用户设置的条件。

“标签是附加到
Google Cloud 资源

的键值对。您可以根据资源是否具有特定标签有条件地授予 IAM 角色或有条件地拒绝 IAM 权限。”

另一个解决方法是您可以尝试创建
自定义角色

并设置权限以及条件,因为正如您提到的,roles/container.developer在条件

“resource.type == "container.googleapis.com/Clusters"
下无法按预期工作。
如果您想创建自定义角色,请不要忘记向自定义角色授予

等价

roles/container.developer的所有访问权限。

    

© www.soinside.com 2019 - 2024. All rights reserved.