Kubernetes服务帐户安全性

时间:2020-08-05 14:26:52

标签: kubernetes

我试图了解授予kubernetes serviceaccount权限以执行部署,服务创建等的安全隐患。该角色是具有命名空间角色绑定的clusterrole。

用例正在使用服务帐户来自动化/编排集群中的某些任务。版本是1.16

2 个答案:

答案 0 :(得分:0)

服务帐户可用于将不同的访问级别授予不同的目的。开发人员ClusterRole需要列出,获取和观看资源,但不能删除。但是管理员可以删除和创建资源。

如果您正在开发K8运算符,则运算符需要与集群通信以创建,更新和删除资源,然后运算符需要使用所有动词的ClusterRoleBinding服务。这样操作员就可以对资源执行所有操作。但不是将完全权限分配给常规部署的好习惯。

答案 1 :(得分:0)

让我讨论一下。

根据docs

  • 角色 总是_ 在特定名称空间内设置权限 __;创建角色时,必须指定其所属的名称空间

  • 相比之下,
  • ClusterRole 是非命名空间资源 。资源具有不同的名称(Role和ClusterRole),因为Kubernetes对象总是必须命名空间或不命名空间。不能两者兼有。


角色绑定向一个或一组用户授予在角色中定义的权限。它包含一个主题列表(用户,组或服务帐户),以及对所授予角色的引用。 RoleBinding授予特定命名空间中的权限,而ClusterRoleBinding授予在群集范围内访问的权限。

  • 如果要在名称空间中定义角色,请使用Role;如果要在群集范围内定义角色,请使用ClusterRole。
  • 角色绑定可以引用同一命名空间中的任何角色 或者,RoleBinding可以引用ClusterRole并将该ClusterRole绑定到RoleBinding的命名空间 。如果要将ClusterRole绑定到群集中的所有名称空间,请使用ClusterRoleBinding。

所以回答您的问题-处理ClusterRoles肯定会带来安全风险。

best solution是要授予尽可能小的权限

  • 授予特定于应用程序的服务帐户角色(最佳做法)
  • 授予角色名称空间中的“默认”服务帐户
  • 授予角色名称空间中的所有服务帐户
  • 在群集范围内(已淘汰)的所有服务帐户授予有限的角色
  • 授予超级用户访问群集范围内所有服务帐户的权限(强烈建议)

这个问题没有答案,因为您需要计划和测试您的应用程序/部署和kubernetes API之间的操作/权限。例如,在一个命名空间内或整个集群中使用命名空间或非命名空间的资源。


在您的示例中,如果您在同一个名称空间中工作,则可以简单地使用Role / Rolebinding。您可以使用ClusterRole / Rolebinding并通过附加的RoleBinding扩展权限,从而允许ServiceAccount将新的k8s对象创建到另一个命名空间中。

假设我们正在谈论要部署的ServiceAccount,在这里您可以找到有关"RBAC in Deployments: A use case"的好建议


如果您为部署创建ServiceAccount并创建适当的Role / ClusterRole和Rolebinding / ClusterRoleBinding:

您可以执行:

kubectl can-i get secrets --as=system:serviceaccount:[namespace]:[service_account_name] -n [target_namespace]

要进行测试,请同时查看Access Clusters Using the Kubernetes API

此命令将向您显示是否特定的ServiceAccount(由Rolebinding / ClusterRolebinding中的主题定义的 )具有权限(由Role / ClusteRole中的动词定义的 )以获取指定名称空间中的机密( 由资源Role / ClusterRole 定义)。


按照这种方法,您可以验证您的部署是否具有足够的权限来针对Kubernetes API执行所有必需的操作。

在Kubernetes中使用RBAC时,您应该考虑以下提到的主题:

  • 拥有多个具有不同属性的用户,建立了适当的身份验证机制。

  • 完全控制每个用户或一组用户可以执行哪些操作。

  • 完全控制Pod中的每个进程可以执行哪些操作。 限制名称空间某些资源的可见性。