【问题标题】:How to bind roles with service accounts - Kubernetes如何将角色与服务帐户绑定 - Kubernetes
【发布时间】:2020-04-08 18:01:25
【问题描述】:

我知道有很多类似的问题,但就我浏览过的而言,它们都没有解决方案。 谈到这个问题,我创建了一个服务帐户(使用命令)、角色(使用 .yaml 文件)、角色绑定(使用 .yaml 文件)。该角色仅授予对 pod 的访问权限。但是,当我使用附加角色的 SA 登录仪表板(令牌方法)时,我可以不受任何限制地查看所有资源。这是我使用的文件和命令。

角色.yaml:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: assembly-prod
  name: testreadrole
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

RoleBinding.yaml

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: testrolebinding
  namespace: assembly-prod
subjects:
- kind: ServiceAccount
  name: testsa
  apiGroup: ""
roleRef:
  kind: Role
  name: testreadrole
  apiGroup: rbac.authorization.k8s.io

用于创建服务帐户的命令: kubectl create serviceaccount <saname> --namespace <namespacename>

更新:我创建了一个服务帐户并且没有附加任何类型的角色。当我尝试使用此 SA 登录时,它让我通过并且我能够执行各种活动,包括删除“秘密”。因此,默认情况下,所有 SA 都假定具有管理员访问权限,这就是我的上述角色不起作用的原因。这种行为是预期的,如果是,那么我该如何改变它?

【问题讨论】:

    标签: kubernetes dashboard rbac


    【解决方案1】:

    试试下面的步骤

    # create service account
    kubectl create serviceaccount pod-viewer
    
    # Create cluster role/role
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: pod-viewer
    rules:
    - apiGroups: [""] # core API group
      resources: ["pods", "namespaces"]
      verbs: ["get", "watch", "list"]
    ---
    
    # create cluster role binding
    kubectl create clusterrolebinding pod-viewer \
      --clusterrole=pod-viewer \
      --serviceaccount=default:pod-viewer
    
    # get service account secret
    kubectl get secret | grep pod-viewer
    pod-viewer-token-6fdcn   kubernetes.io/service-account-token   3      2m58s
    
    # get token
    kubectl describe secret pod-viewer-token-6fdcn
    Name:         pod-viewer-token-6fdcn
    Namespace:    default
    Labels:       <none>
    Annotations:  kubernetes.io/service-account.name: pod-viewer
                  kubernetes.io/service-account.uid: bbfb3c4e-2254-11ea-a26c-0242ac110009
    
    Type:  kubernetes.io/service-account-token
    
    Data
    ====
    token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InBvZC12aWV3ZXItdG9rZW4tNmZkY24iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoicG9kLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImJiZmIzYzRlLTIyNTQtMTFlYS1hMjZjLTAyNDJhYzExMDAwOSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnBvZC12aWV3ZXIifQ.Pgco_4UwTCiOfYYS4QLwqgWnG8nry6JxoGiJCDuO4ZVDWUOkGJ3w6-8K1gGRSzWFOSB8E0l2YSQR4PB9jlc_9GYCFQ0-XNgkuiZBPvsTmKXdDvCNFz7bmg_Cua7HnACkKDbISKKyK4HMH-ShgVXDoMG5KmQQ_TCWs2E_a88COGMA543QL_BxckFowQZk19Iq8yEgSEfI9m8qfz4n6G7dQu9IpUSmVNUVB5GaEsaCIg6h_AXxDds5Ot6ngWUawvhYrPRv79zVKfAxYKwetjC291-qiIM92XZ63-YJJ3xbxPAsnCEwL_hG3P95-CNzoxJHKEfs_qa7a4hfe0k6HtHTWA
    ca.crt:     1025 bytes
    namespace:  7 bytes
    ```
    
    Login to dashboard using the above token. you should see only pods and namespaces
    
    [![Refer the below link][1]][1]
    
    
      [1]: https://i.stack.imgur.com/D9bDi.png
    

    【讨论】:

    • 这只是使用命令行而不是 yaml 文件复制相同的东西。真的会有什么不同吗??
    • 参考以下链接-> i.stack.imgur.com/D9bDi.png
    • 这就是您想要实现的正确目标。您只想查看角色定义中定义的内容
    【解决方案2】:

    好的,我已经找到了解决方案。主要问题是我在 Azure EKS 上运行我的集群,我应该在问题中提到但没有。这是我的错误。在 Azure EKS 中,如果在创建 EKS 期间未启用 rbac,则根本不会使用角色和角色绑定。对 api-server 的所有请求都将被视为来自 Admin 的请求。 Azure 支持也证实了这一点。所以这就是我的集群角色绑定和角色不适用的原因。

    【讨论】:

    • 太棒了!你找到了真正的答案。看了几个答案,我也有同样的感觉。
    【解决方案3】:

    我看到您提供的.yamls 需要一些调整。

    Rolerules 部分之后的格式有误。

    RoleBindingsubjects: 之后缺少namespace:,并且格式错误。

    试试这样的:

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      namespace: assembly-prod
      name: testreadrole
    rules:
      - apiGroups: [""]
        resources: ["pods"]
        verbs: ["get", "watch", "list"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: testrolebinding
      namespace: assembly-prod
    subjects:
      - kind: ServiceAccount
        name: testsa
        namespace: assembly-prod
    roleRef:
      kind: Role
      name: testreadrole
      apiGroup: rbac.authorization.k8s.io
    

    有一个关于Non-Privileged RBAC User Administration in Kubernetes 的非常有用的指南,您可以在其中找到有关此特定主题的更多详细信息。

    【讨论】:

    • 不走运。我仍然能够看到一切。我可能做错了什么?默认情况下,所有服务帐户是否都具有任何管理员访问权限?我真的不知道我在这里缺少什么,因为我也没有看到错误。
    • 如提供的文章中所述:while they were technically using RBAC to create users, they were simply giving those users full administrative access. 您是否尝试按照指南中的说明逐步进行?因为我无法重现您的问题。
    • 我浏览了文档并做了完全相同的事情,但情况仍然相同。这可能与我的仪表板版本或类似的东西有关吗?这里的难点是也没有错误。
    • 我筹集了一笔赏金并更新了一些内容。看看有没有帮助。
    • 您是否尝试过使用 commands 而不是手动创建 .yaml 文件来创建角色和角色?
    猜你喜欢
    • 2019-09-02
    • 2021-05-02
    • 2021-10-28
    • 1970-01-01
    • 2020-03-26
    • 2020-12-23
    • 1970-01-01
    • 2018-11-28
    • 2018-04-10
    相关资源
    最近更新 更多