【问题标题】:kubernetes rbac authorization layer seems to give incorrect resultkubernetes rbac 授权层似乎给出了不正确的结果
【发布时间】:2018-12-23 16:11:39
【问题描述】:

我试图更好地理解 Kubernetes 中的 RBAC。遇到这种意外情况,使用kubectl auth can-i进行授权测试和实际结果不同。简而言之,按照这个测试,新创建的用户应该无法获取 pod,但是这个用户实际上可以获取 pod。

版本:

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:53:20Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:43:26Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}

为有问题的用户配置kubectl:

$ kubectl config view --minify
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/master/ca.pem
    server: https://192.168.1.111:6443
  name: jdoe
contexts:
- context:
    cluster: jdoe
    user: jdoe
  name: jdoe
current-context: jdoe
kind: Config
preferences: {}
users:
- name: jdoe
  user:
    client-certificate: /home/master/jdoe.pem
    client-key: /home/master/jdoe-key.pem

针对授权层的测试表明 jdoe 无法获取 pod。

$ kubectl auth can-i get pods --as jdoe
no

但是,jdoe 可以获取 pod:

$ kubectl get pods --all-namespaces
NAMESPACE       NAME                                       READY     STATUS    RESTARTS   AGE
ingress-nginx   nginx-ingress-controller-87554c57b-ttgwp   1/1       Running   0          5h
kube-system     coredns-5f7d467445-ngnvf                   1/1       Running   0          1h
kube-system     coredns-5f7d467445-wwf5s                   1/1       Running   0          5h
kube-system     weave-net-25kq2                            2/2       Running   0          5h
kube-system     weave-net-5njbh                            2/2       Running   0          4h

切换回管理上下文后,从身份验证层得到了类似的结果:

$ kubectl config use-context kubernetes
Switched to context "kubernetes".
$ kubectl config view --minify
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://192.168.1.111:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: admin
  name: kubernetes
current-context: kubernetes
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate: /home/master/admin.pem
    client-key: /home/master/admin-key.pem

从这里开始,用户 jdoe 也不应该获得 pod。

$ kubectl auth can-i get pods --as jdoe
no

kubectl config view的输出

$ kubectl config view 
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/master/ca.pem
    server: https://192.168.1.111:6443
  name: jdoe
- cluster:
    certificate-authority-data: REDACTED
    server: https://192.168.1.111:6443
  name: kubernetes
- cluster:
    certificate-authority: /home/master/ca.pem
    server: https://192.168.1.111:6443
  name: master
contexts:
- context:
    cluster: jdoe
    user: jdoe
  name: jdoe
- context:
    cluster: kubernetes
    user: admin
  name: kubernetes
- context:
    cluster: master
    user: master
  name: master
current-context: kubernetes
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate: /home/master/admin.pem
    client-key: /home/master/admin-key.pem
- name: jdoe
  user:
    client-certificate: /home/master/jdoe.pem
    client-key: /home/master/jdoe-key.pem
- name: master
  user:
    client-certificate: /home/master/master.pem
    client-key: /home/master/master-key.pem

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    kubectl get pods 没有特定的 pod 名称实际上是一个列表。有关给定请求对应的动词的详细信息,请参阅https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb

    can-i list pods 返回什么?

    【讨论】:

    • 得到了no for kubectl auth can-i list pods --as jdoe ...我明白你的意思。
    • --as 使用模拟进行 authz 检查,并使其模拟指定的用户名。模拟不知道与用户关联的任何组成员身份,除非您使用 --as-group 指定那些成员身份,因此 jdoe.pem 客户端证书可能包含负责 get pods 调用成功的组成员身份,但不是t 在can-I 调用中考虑。 openssl x509 -in /home/master/jdoe.pem -text -noout 显示为客户端证书主题是什么?
    • 它显示Subject: C=IN, L=BGLR, O=system:masters, OU=CKA, CN=jdoe
    • O=system:masters 将超级用户组添加到该凭据。该组被授权做任何事情。 can-i --as=jdoe --as-group=system:masters ... 将始终报告 yes
    猜你喜欢
    • 2022-08-13
    • 2022-01-16
    • 2019-08-04
    • 2015-08-25
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多