使用动态名称管理单个 pod 的 RBAC 角色

Posted

技术标签:

【中文标题】使用动态名称管理单个 pod 的 RBAC 角色【英文标题】:RBAC role to manage single pod with dynamic name 【发布时间】:2020-04-15 08:51:21 【问题描述】:

我需要使用 RBAC 授予对一个部署和该部署的所有 pod 的访问权限。 我已经成功地为deploymet 配置了RoleRoleBinding,并且工作正常:

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: <my-namespace>
  name: <deployment>-manager-role
rules:
  - apiGroups: ["", "extensions", "apps"]
    resources: ["deployments"]
    resourceNames: ["<deployment>"]
    verbs: ["get", "list", "watch", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: <deployment>-manager-binding
  namespace: <my-namespace>
subjects:
  - kind: User
    name: <username>
    apiGroup: ""
roleRef:
  kind: Role
  name: <deployment>-manager-role
  apiGroup: ""

使用此角色,用户可以访问、更新和修补部署。此部署创建具有动态名称的 pod(如 &lt;deployment&gt;-5594cbfcf4-v4xx8)。我尝试允许该用户使用部署名称和使用部署名称 + 通配符字符 * 访问这些 pod(获取、列出、监视、读取日志、执行、删除):

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: <my-namespace>
  name: <deployment>-pods-manager-role
rules:
  - apiGroups: ["", "extensions", "apps"]
    resources: ["pods"]
    resourceNames: ["<deployment>*"]
    verbs: ["get", "list", "watch", "update", "patch", "exec", "delete"]

我还更新了角色绑定。但是当我尝试获取吊舱时:

kubectl --context=<username>-ctx -n <namespace> get pods <deployment>-5594cbfcf4-v4xx8

我收到错误:

来自服务器的错误(禁止):pod“-5594cbfcf4-v4xx8”被禁止:用户“”无法在命名空间“”中的 API 组“”中获取资源“pods”

如果我将&lt;deployment&gt;-5594cbfcf4-v4xx8 添加到resourceNames 的列表中,用户就可以访问这个pod。

是否可以根据部署名称授予对特定 pod 的访问权限?

【问题讨论】:

权限通常由命名空间设置,改为使用该模型 - 会更容易。 【参考方案1】:

在 Kubernetes 中,Pod 被视为短暂的“牛”,它们来来去去。您不应该尝试管理每个 pod 的 RBAC。

不幸的是,在您的用例中,无法为一组匹配特定名称的 pod 授予角色,因为resourceNames 字段不支持前缀/后缀等模式。不要混淆:单个星号字符 ('*') 具有特殊含义,表示“全部”,但它不是模式。因此,resourceNames 中的'my-app-* 将不起作用。此功能已开票,但未实施:https://github.com/kubernetes/kubernetes/issues/56582

还有一个请求能够通过标签管理 RBAC,但该功能也没有实现:https://github.com/kubernetes/kubernetes/issues/44703

因此,您可能需要更改模型以向用户授予角色以管理某个命名空间中的所有 pod。您的部署应该是该命名空间中唯一的“pod 来源”。这样,您就不需要指定任何资源名称。

【讨论】:

个人觉得这是 RBAC 的一个主要弱点,因为这种细粒度的权限通常是必要的。例如,我希望能够让开发人员exec 访问他们部署的 pod 以进行调试,但不授予其他人。啊。我有点沮丧。

以上是关于使用动态名称管理单个 pod 的 RBAC 角色的主要内容,如果未能解决你的问题,请参考以下文章

什么是RBAC?

弄明白Kubernetes的RBAC政策

Openshift 用户,角色和RBAC

来聊聊RBAC角色访问控制

使用RBAC授权

角色权限