经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
kubernetes API服务器的安全防护
来源:cnblogs  作者:姚红  时间:2019/8/12 8:48:26  对本文有异议

12.1.了解认证机制

  启动API服务器时,通过命令行选项可以开启认证插件。

12.1.1.用户和组

了解用户:

  分为两种连接到api服务器的客户端:

  1.真实的人

  2.pod,使用一种称为ServiceAccount的机制

了解组:

  认证插件会连同用户名,和用户id返回组,组可以一次性给用户服务多个权限,不用单次赋予,

  system:unauthenticated组:用于所有认证插件都不会认证客户端身份的请求。

  system:authenticated组:会自动分配给一个成功通过认证的用户。

  system:serviceaccount组:包含 所有在系统中的serviceaccount。

  system:serviceaccount:<namespace>组:包含了所有在特定命名空间中的serviceAccount。

 

12.1.2 ServiceAccount介绍

  每个pod中都包含/var/run/secrets/kubernetes.io/serviceaccount/token文件,如下图所示,文件内容用于对身份进行验证,token文件持有serviceaccount的认证token。

  

  应用程序使用token去连接api服务器时,认证插件会对serviceaccount进行身份认证,并将serviceaccount的用户名传回到api服务器内部。

       serviceaccount的用户名格式如下:

  system:serviceaccount:<namespace>:<service account name>

  ServiceAccount是运行在pod中的应用程序,和api服务器身份认证的一中方式

了解ServiceAccount资源

  ServiceAcount作用在单一命名空间,为每个命名空间创建默认的ServiceAccount。

       

  多个pod可以使用相同命名空间下的同一的ServiceAccount

 ServiceAccount如何与授权文件绑定

   在pod的manifest文件中,可以指定账户名称的方式,将一个serviceAccount赋值给一个pod,如果不指定,将使用该命名空间下默认的ServiceAccount.

   可以 将不同的ServiceAccount赋值给pod,让pod访问不同的资源。

 

12.1.3创建ServiceAccount

  为了集群的安全性,可以手动创建ServiceAccount,可以限制只有允许的pod访问对应的资源。

        创建方法如下:

  1. $ kubectl get sa
  2. NAME SECRETS AGE
  3. default 1 21h
  4.  
  5.  
  6. $ kubectl create serviceaccount yaohong
  7. serviceaccount/yaohong created
  8.  
  9.  
  10. $ kubectl get sa
  11. NAME SECRETS AGE
  12. default 1 21h
  13. yaohong 1 3s

  使用describe来查看ServiceAccount。

  1. $ kubectl describe sa yaohong
  2. Name: yaohong
  3. Namespace: default
  4. Labels: <none>
  5. Annotations: <none>
  6. Image pull secrets: <none>
  7. Mountable secrets: yaohong-token-qhbxn //如果强制使用可挂载秘钥。那么使用这个serviceaccount的pod只能挂载这个秘钥
  8. Tokens: yaohong-token-qhbxn
  9. Events: <none>

  查看该token,

  1. $ kubectl describe secret yaohong-token-qhbxn
  2. Name: yaohong-token-qhbxn
  3. Namespace: default
  4. Labels: <none>
  5. Annotations: kubernetes.io/service-account.name: yaohong
  6. kubernetes.io/service-account.uid: a3d0d2fe-bb43-11e9-ac1e-005056870b4d
  7.  
  8. Type: kubernetes.io/service-account-token
  9.  
  10. Data
  11. ====
  12. ca.crt: 1342 bytes
  13. namespace: 7 bytes
  14. token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Inlhb2hvbmctdG9rZW4tcWhieG4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoieWFvaG9uZyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImEzZDBkMmZlLWJiNDMtMTFlOS1hYzFlLTAwNTA1Njg3MGI0ZCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0Onlhb2hvbmcifQ.BwmbZKoM95hTr39BuZhinRT_vHF-typH4anjkL0HQxdVZEt_eie5TjUECV9UbLRRYIqYamkSxmyYapV150AQh-PvdcLYPmwKQLJDe1-7VC4mO2IuVdMCI_BnZFQBJobRK9EdPdbZ9uxc9l0RL5I5WyWoIjiwbrQvtCUEIkjT_99_NngdrIr7QD9S5SxHurgE3HQbmzC6ItU911LjmxtSvBqS5NApJoJaztDv0cHKvlT67ZZbverJaStQdxr4yiRbpSycRNArHy-UZKbNQXuzaZczSjVouo5A5hzgSHEBBJkQpQ6Tb-Ko5XGjjCgV_b9uQvhmgdPAus8GdFTTFAbCBw

  

12.1.4将ServiceAccount分配给pod

  在pod中定义的spec.serviceAccountName字段上设置,此字段必须在pod创建时设置后续不能被修改。

  自定义pod的ServiceAccount的方法如下图

      

 

12.2通过基于角色的权限控制加强集群安全

12.2.1.介绍RBAC授权插件

  RBAC授权插件将用户角色作为决定用户能否执行操作的关机因素

12.2.2介绍RBAC授权资源

  RBAC授权规则通过四种资源来进行配置的,他们可以分为两组:

    Role和ClusterRole,他们决定资源上可执行哪些动词。

         RoleBinding和ClusterRoleBinding,他们将上述角色绑定到特定的用户,组或者ServiceAccounts上。

  Role和RoleBinding是namespace级别资源

  ClusterRole和ClusterRoleBinding是集群级别资源

 

12.2.3使用Role和RoleBinding

   Role资源定义了哪些操作可以在哪些资源上执行,

创建Role

  service-reader.yml

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: Role
  3. metadata:
  4. namespace: kube-system
  5. name: service-reader
  6. rules:
  7. - apiGroups: [""]
  8. verbs: ["get", "list"]
  9. resources: ["services"]

  在kube-system中创建Role

  1. #kubectl -n kube-system create -f service-reader.yml

  查看该namespace下的role

  1. $ kubectl -n kube-system get role
  2. NAME AGE
  3. extension-apiserver-authentication-reader 41h
  4. kube-state-metrics-resizer 41h
  5. service-reader 2m17s
  6. system::leader-locking-kube-controller-manager 41h
  7. system::leader-locking-kube-scheduler 41h
  8. system:controller:bootstrap-signer 41h
  9. system:controller:cloud-provider 41h
  10. system:controller:token-cleaner 41h

绑定角色到ServiceAccount

   将service-reader角色绑定到default ServiceAccount

  1. $ kubectl create rolebinding test --role=service-reader
  2. rolebinding.rbac.authorization.k8s.io/test created

  

  1. $ kubectl get rolebinding test -o yaml
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: RoleBinding
  4. metadata:
  5. creationTimestamp: 2019-08-11T03:40:51Z
  6. name: test
  7. namespace: default
  8. resourceVersion: "239323"
  9. selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/test
  10. uid: d0aff243-bbe9-11e9-ac1e-005056870b4d
  11. roleRef:
  12. apiGroup: rbac.authorization.k8s.io
  13. kind: Role
  14. name: service-reader

  

12.2.4使用ClusterRole和ClusterRoleBinding

 查看集群ClusterRole

  1. # kubectl get clusterrole
  2. NAME AGE
  3. admin 42h
  4. cluster-admin 42h
  5. edit 42h
  6. flannel 42h
  7. kube-state-metrics 42h
  8. system:aggregate-to-admin 42h
  9. ...

创建ClusterRole

  1. kubectl create clusterrole flannel --verb=get,list -n kube-system 

查看yaml文件

  1. # kubectl get clusterrole flannel -o yaml
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: ClusterRole
  4. metadata:
  5. annotations:
  6. kubectl.kubernetes.io/last-applied-configuration: |
  7. {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRole","metadata":{"annotations":{},"name":"flannel"},"rules":[{"apiGroups":[""],"resources":["pods"],"verbs":["get"]},{"apiGroups":[""],"resources":["nodes"],"verbs":["list","watch"]},{"apiGroups":[""],"resources":["nodes/status"],"verbs":["patch"]}]}
  8. creationTimestamp: 2019-08-09T09:58:42Z
  9. name: flannel
  10. resourceVersion: "360"
  11. selfLink: /apis/rbac.authorization.k8s.io/v1/clusterroles/flannel
  12. uid: 45100f6f-ba8c-11e9-8f57-005056870608
  13. rules:
  14. - apiGroups:
  15. - ""
  16. resources:
  17. - pods
  18. verbs:
  19. - get
  20. - apiGroups:
  21. - ""
  22. resources:
  23. - nodes
  24. verbs:
  25. - list
  26. - watch
  27. - apiGroups:
  28. - ""
  29. resources:
  30. - nodes/status
  31. verbs:
  32. - patch

 

创建clusterRoleBinding

  1. $ kubectl create clusterrolebinding cluster-tetst --clusterrole=pv-reader --serviceaccount=kuebsystem:yaohong
  2. clusterrolebinding.rbac.authorization.k8s.io/cluster-tetst created

  

 

12.2.5了解默认的ClusterRole和ClusterRoleBinding

如下所示使用kubectl get clusterroles和kubectl get clusterrolesbinding可以获取k8s默认资源。

用edit ClusterRole允许对资源进行修改

用admin ClusterRole赋予一个命名空间全部的权限

  1. $ kubectl get clusterroles
  2. NAME AGE
  3. admin 44h
  4. cluster-admin 44h
  5. edit 44h
  6. flannel 44h
  7. kube-state-metrics 44h
  8. system:aggregate-to-admin 44h
  9. system:aggregate-to-edit 44h
  10. system:aggregate-to-view 44h
  11. system:auth-delegator 44h
  12. system:aws-cloud-provider 44h
  13. system:basic-user 44h
  14. system:certificates.k8s.io:certificatesigningrequests:nodeclient 44h
  15. system:certificates.k8s.io:certificatesigningrequests:selfnodeclient 44h
  16. system:controller:attachdetach-controller 44h
  17. system:controller:certificate-controller 44h
  18. system:controller:clusterrole-aggregation-controller 44h
  19. 。。。

  

  1. wps@wps:~$ kubectl get clusterrolebindings
  2. NAME AGE
  3. clust-tetst 17m
  4. cluster-admin 44h
  5. cluster-tetst 13m
  6. flannel 44h
  7. kube-state-metrics 44h
  8. kubelet-bootstrap 44h
  9. system:aws-cloud-provider 44h
  10. system:basic-user 44h
  11. system:controller:attachdetach-controller 44h
  12. system:controller:certificate-controller 44h
  13. 。。。

 

原文链接:http://www.cnblogs.com/yaohong/p/11331154.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号