资讯专栏INFORMATION COLUMN

kubernetes RBAC实战 kubernetes 用户角色访问控制,dashboard访问,

sherlock221 / 1814人阅读

摘要:这个用户或者组用于后面的角色绑定使用生成的证书就会生成下面的文件校验证书生成文件已经生成了,我们可以直接利用这个文件,省的自己再去配置集群参数设置客户端认证参数设置上下文参数设置莫认上下文以上执行一个步骤就可以看一下的变化。

kubernetes RBAC实战 环境准备

先用kubeadm安装好kubernetes集群,kubernetes1.8.2安装包 | kubernetes1.9.2安装包好用又方便,服务周到,童叟无欺

本文目的,让名为devuser的用户只能有权限访问特定namespace下的pod

命令行kubectl访问 安装cfssl

此工具生成证书非常方便, pem证书与crt证书,编码一致可直接使用

</>复制代码

  1. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  2. chmod +x cfssl_linux-amd64
  3. mv cfssl_linux-amd64 /bin/cfssl
  4. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  5. chmod +x cfssljson_linux-amd64
  6. mv cfssljson_linux-amd64 /bin/cfssljson
  7. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  8. chmod +x cfssl-certinfo_linux-amd64
  9. mv cfssl-certinfo_linux-amd64 /bin/cfssl-certinfo
签发客户端证书

根据ca证书与么钥签发用户证书
根证书已经在/etc/kubernetes/pki目录下了

</>复制代码

  1. [root@master1 ~]# ls /etc/kubernetes/pki/
  2. apiserver.crt ca-config.json devuser-csr.json front-proxy-ca.key sa.pub
  3. apiserver.key ca.crt devuser-key.pem front-proxy-client.crt
  4. apiserver-kubelet-client.crt ca.key devuser.pem front-proxy-client.key
  5. apiserver-kubelet-client.key devuser.csr front-proxy-ca.crt sa.key

注意以下几个文件: ca.crt ca.key ca-config.json devuser-csr.json

创建ca-config.json文件

</>复制代码

  1. cat > ca-config.json <
  2. 创建devuser-csr.json文件:
    k8s的用户名就是从CN上获取的。 组是从O上获取的。这个用户或者组用于后面的角色绑定使用

  3. </>复制代码

    1. cat > devuser-csr.json <
    2. 生成user的证书:

    3. </>复制代码

      1. $ cfssl gencert -ca=ca.crt -ca-key=ca.key -config=ca-config.json -profile=kubernetes devuser-csr.json | cfssljson -bare devuser
    4. 就会生成下面的文件:

    5. </>复制代码

      1. devuser.csr devuser-key.pem devuser.pem
    6. </>复制代码

      1. 校验证书
    7. </>复制代码

      1. # cfssl-certinfo -cert kubernetes.pem
    8. 生成config文件
    9. kubeadm已经生成了admin.conf,我们可以直接利用这个文件,省的自己再去配置集群参数

    10. </>复制代码

      1. $ cp /etc/kubernetes/admin.conf devuser.kubeconfig
    11. 设置客户端认证参数:

    12. </>复制代码

      1. kubectl config set-credentials devuser
      2. --client-certificate=/etc/kubernetes/ssl/devuser.pem
      3. --client-key=/etc/kubernetes/ssl/devuser-key.pem
      4. --embed-certs=true
      5. --kubeconfig=devuser.kubeconfig
    13. 设置上下文参数:

    14. </>复制代码

      1. kubectl config set-context kubernetes
      2. --cluster=kubernetes
      3. --user=devuser
      4. --namespace=kube-system
      5. --kubeconfig=devuser.kubeconfig
    15. 设置莫认上下文:

    16. </>复制代码

      1. kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig
    17. 以上执行一个步骤就可以看一下 devuser.kubeconfig的变化。里面最主要的三个东西

    18. cluster: 集群信息,包含集群地址与公钥

    19. user: 用户信息,客户端证书与私钥,正真的信息是从证书里读取出来的,人能看到的只是给人看的。

    20. context: 维护一个三元组,namespace cluster 与 user

    21. 创建角色
    22. 创建一个叫pod-reader的角色

    23. </>复制代码

      1. [root@master1 ~]# cat pod-reader.yaml
      2. kind: Role
      3. apiVersion: rbac.authorization.k8s.io/v1
      4. metadata:
      5. namespace: kube-system
      6. name: pod-reader
      7. rules:
      8. - apiGroups: [""] # "" indicates the core API group
      9. resources: ["pods"]
      10. verbs: ["get", "watch", "list"]
    24. </>复制代码

      1. kubectl create -f pod-reader.yaml
    25. 绑定用户
    26. 创建一个角色绑定,把pod-reader角色绑定到 devuser上

    27. </>复制代码

      1. [root@master1 ~]# cat devuser-role-bind.yaml
      2. kind: RoleBinding
      3. apiVersion: rbac.authorization.k8s.io/v1
      4. metadata:
      5. name: read-pods
      6. namespace: kube-system
      7. subjects:
      8. - kind: User
      9. name: devuser # 目标用户
      10. apiGroup: rbac.authorization.k8s.io
      11. roleRef:
      12. kind: Role
      13. name: pod-reader # 角色信息
      14. apiGroup: rbac.authorization.k8s.io
    28. </>复制代码

      1. kubectl create -f devuser-role-bind.yaml
    29. 使用新的config文件
    30. </>复制代码

      1. $ rm .kube/config && cp devuser.kubeconfig .kube/config
    31. 效果, 已经没有别的namespace的权限了,也不能访问node信息了:

    32. </>复制代码

      1. [root@master1 ~]# kubectl get node
      2. Error from server (Forbidden): nodes is forbidden: User "devuser" cannot list nodes at the cluster scope
      3. [root@master1 ~]# kubectl get pod -n kube-system
      4. NAME READY STATUS RESTARTS AGE
      5. calico-kube-controllers-55449f8d88-74x8f 1/1 Running 0 8d
      6. calico-node-clpqr 2/2 Running 0 8d
      7. kube-apiserver-master1 1/1 Running 2 8d
      8. kube-controller-manager-master1 1/1 Running 1 8d
      9. kube-dns-545bc4bfd4-p6trj 3/3 Running 0 8d
      10. kube-proxy-tln54 1/1 Running 0 8d
      11. kube-scheduler-master1 1/1 Running 1 8d
      12. [root@master1 ~]# kubectl get pod -n default
      13. Error from server (Forbidden): pods is forbidden: User "devuser" cannot list pods in the namespace "default": role.rbac.authorization.k8s.io "pod-reader" not found
    33. dashboard访问
    34. service account原理
    35. k8s里面有两种用户,一种是User,一种就是service account,User给人用的,service account给进程用的,让进程有相关的权限。

    36. 如dasboard就是一个进程,我们就可以创建一个service account给它,让它去访问k8s。

    37. 我们看一下是如何把admin权限赋给dashboard的:

    38. </>复制代码

      1. ╰─➤ cat dashboard-admin.yaml
      2. apiVersion: rbac.authorization.k8s.io/v1beta1
      3. kind: ClusterRoleBinding
      4. metadata:
      5. name: kubernetes-dashboard
      6. labels:
      7. k8s-app: kubernetes-dashboard
      8. roleRef:
      9. apiGroup: rbac.authorization.k8s.io
      10. kind: ClusterRole
      11. name: cluster-admin
      12. subjects:
      13. - kind: ServiceAccount
      14. name: kubernetes-dashboard
      15. namespace: kube-system
    39. 把 kubernetes-dashboard 这个ServiceAccount绑定到cluster-admin这个ClusterRole上,这个cluster role非常牛逼,啥权限都有

    40. </>复制代码

      1. [root@master1 ~]# kubectl describe clusterrole cluster-admin -n kube-system
      2. Name: cluster-admin
      3. Labels: kubernetes.io/bootstrapping=rbac-defaults
      4. Annotations: rbac.authorization.kubernetes.io/autoupdate=true
      5. PolicyRule:
      6. Resources Non-Resource URLs Resource Names Verbs
      7. --------- ----------------- -------------- -----
      8. [*] [] [*]
      9. *.* [] [] [*]
    41. 而创建dashboard时创建了这个service account:

    42. </>复制代码

      1. apiVersion: v1
      2. kind: ServiceAccount
      3. metadata:
      4. labels:
      5. k8s-app: kubernetes-dashboard
      6. name: kubernetes-dashboard
      7. namespace: kube-system
    43. 然后deployment里指定service account

    44. </>复制代码

      1. volumes:
      2. - name: kubernetes-dashboard-certs
      3. secret:
      4. secretName: kubernetes-dashboard-certs
      5. - name: tmp-volume
      6. emptyDir: {}
      7. serviceAccountName: kubernetes-dashboard
    45. 更安全的做法
    46. </>复制代码

      1. [root@master1 ~]# cat admin-token.yaml
      2. kind: ClusterRoleBinding
      3. apiVersion: rbac.authorization.k8s.io/v1beta1
      4. metadata:
      5. name: admin
      6. annotations:
      7. rbac.authorization.kubernetes.io/autoupdate: "true"
      8. roleRef:
      9. kind: ClusterRole
      10. name: cluster-admin
      11. apiGroup: rbac.authorization.k8s.io
      12. subjects:
      13. - kind: ServiceAccount
      14. name: admin
      15. namespace: kube-system
      16. ---
      17. apiVersion: v1
      18. kind: ServiceAccount
      19. metadata:
      20. name: admin
      21. namespace: kube-system
      22. labels:
      23. kubernetes.io/cluster-service: "true"
      24. addonmanager.kubernetes.io/mode: Reconcile
    47. </>复制代码

      1. [root@master1 ~]# kubectl get secret -n kube-system|grep admin
      2. admin-token-7rdhf kubernetes.io/service-account-token 3 14m
    48. </>复制代码

      1. [root@master1 ~]# kubectl describe secret admin-token-7rdhf -n kube-system
      2. Name: admin-token-7rdhf
      3. Namespace: kube-system
      4. Labels:
      5. Annotations: kubernetes.io/service-account.name=admin
      6. kubernetes.io/service-account.uid=affe82d4-d10b-11e7-ad03-00163e01d684
      7. Type: kubernetes.io/service-account-token
      8. Data
      9. ====
      10. ca.crt: 1025 bytes
      11. namespace: 11 bytes
      12. token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi03cmRoZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImFmZmU4MmQ0LWQxMGItMTFlNy1hZDAzLTAwMTYzZTAxZDY4NCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.jSfQhFsY7V0ZmfqxM8lM_UUOoUhI86axDSeyVVtldSUY-BeP2Nw4q-ooKGJTBBsrOWvMiQePcQxJTKR1K4EIfnA2FOnVm4IjMa40pr7-oRVY37YnR_1LMalG9vrWmqFiqIsKe9hjkoFDuCaP7UIuv16RsV7hRlL4IToqmJMyJ1xj2qb1oW4P1pdaRr4Pw02XBz9yBpD1fs-lbwheu1UKcEnbHS_0S3zlmAgCrpwDFl2UYOmgUKQVpJhX4wBRRQbwo1Sn4rEFVI1NIa9l_lM7Mf6YEquLHRu3BCZTdu9YfY9pevQz4OfHE0NOvDIqmGRL8Z9kPADAXbljWzcD1m1xCQ
    49. 用此token在界面上登录即可

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27139.html

相关文章

  • 【容器云 UK8S】最佳实践:权限管理之了解RBAC和权限管理实践

    摘要:本文介绍了模型中四个最主要的对象,即,大致了解了的工作原理和使用方法,如果要更加深入地了解和掌握,可以查看官方文档。只是这个不能复用到其他,一般只有在做精细化权限管理的时候,我们才会创建对象,比如一个只能查看名称为的。了解RBAC简介RBAC是一种基于角色来管理对计算机或网络资源访问策略的方法。我们知道,对K8S内所有API对象的操作都是通过访问kube-apiserver来完成的,因此ku...

    Tecode 评论0 收藏0
  • 【k8s】在AWS EKS部署并通过ALB访问k8s Dashboard保姆级教程

    摘要:本教程适用范围本教程适用范围在上使用服务部署,并通过访问集群计算节点采用托管,并使用启动模板。到此,完成集群的搭建,部署,部署,并实现了外网访问。本教程适用范围在AWS上使用EKS服务部署k8s Dashboard,并通过ALB访问EKS集群计算节点采用托管EC2,并使用启动模板。使用AWS海外账号,us-west-2区域使用账号默认vpc(172.31.0.0/16)和子网使用awscli...

    番茄西红柿 评论0 收藏2637
  • Rancher中的K8S认证和RBAC

    摘要:在中使用验证使用身份验证策略来认证用户的。审阅状态包含名称和组等用户信息。中的授权模块稍后将以此确定该用户的访问级别。认证请求认证服务决定该用户是否通过认证,并向发送响应。在对的请求成功进行认证之后,必须授权该请求。 Rancher Kubernetes拥有RBAC(基于角色的访问控制)功能,此功能可以让管理员配置不同的策略,允许或拒绝用户和服务帐户访问Kubernetes API资源...

    raise_yang 评论0 收藏0
  • Rancher中的K8S认证和RBAC

    摘要:在中使用验证使用身份验证策略来认证用户的。审阅状态包含名称和组等用户信息。中的授权模块稍后将以此确定该用户的访问级别。认证请求认证服务决定该用户是否通过认证,并向发送响应。在对的请求成功进行认证之后,必须授权该请求。 Rancher Kubernetes拥有RBAC(基于角色的访问控制)功能,此功能可以让管理员配置不同的策略,允许或拒绝用户和服务帐户访问Kubernetes API资源...

    Forest10 评论0 收藏0
  • Kubernetes安全三步谈:三种方法保护Kubernetes免受内部威胁

    摘要:若企业想要保护集群不受内部威胁无论是来自实际的恶意内部威胁,还是仅仅是防止错误或错误编码传播时,防御的手段非常少。不过所幸的是,有一些解决方案已经着眼于保护集群免受未经授权的内部访问。 这是关于Kubernetes安全系列三篇文章中的第二篇。在上篇文章中我们分享了如何确保企业的Kubernetes集群免受外部攻击,这篇文章中我们将分享三种保护Kubernetes免受内部威胁的方法,后续...

    ghnor 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<