如何以小组类型查看主题成员

E23*_*235 14 rbac kubernetes kubectl

有一个默认ClusterRoleBinding名为cluster-admin
当我跑步时,kubectl get clusterrolebindings cluster-admin -o yaml我得到:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: 2018-06-13T12:19:26Z
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "98"
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/cluster-admin
  uid: 0361e9f2-6f04-11e8-b5dd-000c2904e34b
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:masters
Run Code Online (Sandbox Code Playgroud)

subjects现场,我有:

- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:masters
Run Code Online (Sandbox Code Playgroud)

我怎样才能看到小组成员system:masters
在这里阅读有关群组的信息,但是我不明白如何才能像上面的示例那样看到谁在群组中system:masters

我注意到当我/etc/kubernetes/pki/apiserver-kubelet-client.crt使用以下命令进行解码时: openssl x509 -in apiserver-kubelet-client.crt -text -noout它包含主题,system:masters但是我仍然不明白该组中的用户是谁:

Issuer: CN=kubernetes
Validity
    Not Before: Jul 31 19:08:36 2018 GMT
    Not After : Jul 31 19:08:37 2019 GMT
Subject: O=system:masters, CN=kube-apiserver-kubelet-client
Subject Public Key Info:
    Public Key Algorithm: rsaEncryption
        Public-Key: (2048 bit)
        Modulus:
Run Code Online (Sandbox Code Playgroud)

VAS*_*VAS 12

答案更新

似乎没有办法使用kubectl. 没有像 Group 这样的对象可以在 Kubernetes 配置中“获取”。

Kubernetes 中的组信息目前由 Authenticator 模块提供,通常它只是用户属性中的字符串。

也许您可以从用户证书的主题中获取组列表,或者如果您使用 GKE、EKS 或 AKS,则组属性存储在云用户管理系统中。

https://kubernetes.io/docs/reference/access-authn-authz/rbac/ https://kubernetes.io/docs/reference/access-authn-authz/authentication/

可以从 ClusterRoleBinding 对象请求有关系统组中 ClusterRole 成员身份的信息。(例如,对于“system:masters”,它只显示 cluster-admin ClusterRole):

使用 jq:

kubectl get clusterrolebindings -o json | jq -r '.items[] | select(.subjects[0].kind=="Group") | select(.subjects[0].name=="system:masters")'
Run Code Online (Sandbox Code Playgroud)

如果您只想列出名称:

kubectl get clusterrolebindings -o json | jq -r '.items[] | select(.subjects[0].kind=="Group") | select(.subjects[0].name=="system:masters") | .metadata.name'
Run Code Online (Sandbox Code Playgroud)

使用 go 模板:

kubectl get clusterrolebindings -o go-template='{{range .items}}{{range .subjects}}{{.kind}}-{{.name}} {{end}} {{" - "}} {{.metadata.name}} {{"\n"}}{{end}}' | grep "^Group-system:masters"
Run Code Online (Sandbox Code Playgroud)

有关系统组的一些其他信息可以在GitHub 问题 #44418RBAC 文档中找到

  • 但它仍然没有显示“system:masters”组中的用户是谁。当您仅列出名称时,它会显示 ClusterRoleBindings 的名称,而不是用户的名称。基本上,您的命令正在搜索名为“system:masters”的组的“ClusterRoleBinding”,但您不会在“ClusterRoleBinding”“cluster-admin”中看到“system:masters”的成员。 (4认同)

clo*_*net 11

诚然,这里的聚会迟到了。

通读Kubernetes 'Authenticating' 文档。Kubernetes 没有用于定义和控制用户的内置机制(与 ServiceAccounts 不同,后者用于为 Pod 提供集群身份,因此服务在其上运行)。

这意味着 Kubernetes 因此没有任何内部数据库可供参考,以确定和显示组成员身份。

在较小的集群中,x509 证书通常用于对用户进行身份验证。为此,API 服务器配置为信任 CA,然后向用户颁发由该 CA 签名的证书。如您所见,如果主题包含“组织”字段,则该字段会映射到 Kubernetes 组。如果您希望用户成为多个组的成员,则指定多个“O”字段。(顺便说一句,在我看来,使用“OU”字段会更有意义,但事实并非如此)

在回答您的问题时,似乎在用户通过证书进行身份验证的集群的情况下,您唯一的途径是访问已颁发的证书,并检查主题中是否存在“O”字段。我猜在更高级的情况下,Kubernetes 将与集中式工具(例如 AD)集成,可以在本地查询组成员资格。