k8s安全

打印 上一主题 下一主题

主题 855|帖子 855|积分 2565

Kubernetes(k8s)的安全机制是围绕掩护其API Server来设计的,主要包括认证(Authentication)、鉴权(Authorization)和准入控制(Admission Control)三个核心环节。下面分别对这三个环节进行详细阐明:
1. 认证(Authentication)

  1. kubeadm join ip:6443 --token  --discovery-token-cacert-hash
  2. # --token用于Apiserver识别kubelet是否合法
  3. # --discovery-token-cacert-hash  用于kubelet确认apiServer发来的证书是否合法
  4. [root@master ~]# cat /root/.kube/config
复制代码
认证是确定访问者的身份是否合法的过程。Kubernetes支持多种认证方式,包括但不限于:
1.1 HTTP Token认证:

通过Token来识别合法用户。Token是一个复杂且难以模拟的字符串,每个Token对应一个用户名,存储在API Server能访问的文件中。客户端发起哀求时,在HTTP Header中包含Token,API Server通过解码Token来验证用户身份。
1.2 HTTP Base认证:

通过用户名和密码的方式认证。用户名和密码通过Base64算法加密后,放在HTTP Request的Header中发送给服务端,服务端解码后验证用户名和密码。
1.3 HTTPS证书认证:

基于CA根证书签名的客户端身份认证方式。这是Kubernetes中最严格、最严谨的认证方式,通过双向TLS认证确保通讯双方的身份安全。
别的,Kubernetes还使用kubeconfig文件来管理客户端的认证信息,包括CA证书、API Server地点、客户端证书和私钥等。
2. 鉴权(Authorization)

鉴权是确定哀求方有哪些资源的权限的过程。Kubernetes API Server支持多种授权策略,包括:
2.1 RBAC(基于角色的访问控制):

通过界说角色(Role)和角色绑定(RoleBinding)来控制用户对资源的访问权限。RBAC是Kubernetes中最常用的授权模式,支持细粒度的权限控制。
2.2 ABAC(基于属性的访问控制):

通过界说策略文件来授予用户访问权限,策略文件中包含了用户属性、资源属性和操纵属性等信息。
2.3 Node鉴权:

一种特别用途的鉴权模式,专门对kubelet发出的API哀求进行授权。kubelet必须使用一个根据以表示它在system:nodes组中,用户名为system:node:。
2.4 Webhook模式:

通过调用外部HTTP/HTTPS服务来动态地决定用户的访问权限。
RBAC详解

在Kubernetes(k8s)中,RBAC(Role-Based Access Control,基于角色的访问控制)是一种授权机制,它允许管理员通过Kubernetes API来界说角色(Roles)和角色绑定(RoleBindings),从而控制用户对集群资源的访问权限。RBAC 提供了一种细粒度的访问控制方法,可以根据用户的角色来限制他们对集群资源的操纵。


  • RBAC 的核心概念

    • 角色(Role):
      界说了一组权限,这些权限限定了对一组资源(如Pods、Services等)的操纵(如GET、LIST、WATCH、CREATE、UPDATE、PATCH、DELETE等)。
      角色是命名空间级别的,意味着一个角色只能被绑定到它地点的命名空间内的用户或服务账户上。
    • 集群角色(ClusterRole):
      与角色类似,但它是集群级别的,可以用于跨命名空间的资源,或者那些不特定于命名空间的资源(如节点)。
    • 角色绑定(RoleBinding):
      将角色绑定到一个或多个用户或服务账户上,从而控制这些用户或服务账户对命名空间内资源的访问权限。
    • 集群角色绑定(ClusterRoleBinding):
      将集群角色绑定到一个或多个用户或服务账户上,控制这些用户或服务账户对集群范围内资源的访问权限。

  • 使用 RBAC
在Kubernetes中,你可以通过YAML文件来界说角色、角色绑定、集群角色和集群角色绑定。例如,你可以创建一个角色,该角色允许对某个命名空间内的Pods进行读取操纵,然后将这个角色绑定到一个特定的用户或服务账户上。
创建一个用户智能管理dev名字空间

步调:创建证书 > 转换为kubeconfig文件 > 创建名字空间 > 角色绑定
  1. [root@master ~]# cd /etc/kubernetes/pki/
  2. [root@master pki]# ls
  3. apiserver.crt                 apiserver-kubelet-client.key  front-proxy-ca.key
  4. apiserver-etcd-client.crt     ca.crt                        front-proxy-client.crt
  5. apiserver-etcd-client.key     ca.key                        front-proxy-client.key
  6. apiserver.key                 etcd                          sa.key
  7. apiserver-kubelet-client.crt  front-proxy-ca.crt            sa.pub
  8. [root@master pki]# vim devuser.json
  9. [root@master pki]# cat devuser.json
  10. {
  11. "CN": "devuser",
  12. "hosts": [],
  13. "key": {
  14.    "algo": "rsa",
  15.    "size": 2048
  16.   },
  17. "names": [
  18.     {
  19.      "C": "CN",
  20.      "ST": "BeiJing",
  21.      "L": "BeiJing",
  22.      "O": "k8s",
  23.      "OU": "System"
  24.     }
  25.   ]
  26. }
  27. # 下载证书生成工具
  28. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  29. mv cfssl_linux-amd64 /usr/local/bin/cfssl
  30. coreOS json
  31. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  32. mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  33. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  34. mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
  35. [root@master pki]# cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /root/devuser.json | cfssljson -bare devuser
  36. open /root/devuser.json: no such file or directory
  37. Failed to parse input: unexpected end of JSON input
  38. [root@master pki]# cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes devuser.json | cfssljson -bare devuser
  39. 2024/08/28 16:40:46 [INFO] generate received request
  40. 2024/08/28 16:40:46 [INFO] received CSR
  41. 2024/08/28 16:40:46 [INFO] generating key: rsa-2048
  42. 2024/08/28 16:40:46 [INFO] encoded CSR
  43. 2024/08/28 16:40:46 [INFO] signed certificate with serial number 454243441018666193052246696391790253434641005627
  44. 2024/08/28 16:40:46 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
  45. websites. For more information see the Baseline Requirements for the Issuance and Management
  46. of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
  47. specifically, section 10.2.3 ("Information Requirements").
  48. #生成的文件
  49. devuser.csr         
  50. devuser.json        
  51. devuser-key.pem     #私钥
  52. devuser.pem         #证书
  53. # 设置集群参数
  54. export KUBE_APISERVER="https://10.0.17.100:6443"
  55. kubectl config set-cluster kubernetes \
  56. --certificate-authority=ca.crt \
  57. --embed-certs=true \
  58. --server=${KUBE_APISERVER} \
  59. --kubeconfig=devuser.kubeconfig
  60. Cluster "kubernetes" set.
  61. #生成 devuser.kubeconfig
  62. # 设置客户端认证参数
  63. kubectl config set-credentials devuser \
  64. --client-certificate=devuser.pem \
  65. --client-key=devuser-key.pem \
  66. --embed-certs=true \
  67. --kubeconfig=devuser.kubeconfig
  68. User "devuser" set.
  69. #设置上下文参数
  70. kubectl config set-context kubernetes \
  71. --cluster=kubernetes \
  72. --user=devuser \
  73. --namespace=dev \
  74. --kubeconfig=devuser.kubeconfig
  75. Context "kubernetes" created.
  76. # 鉴权 权利绑定
  77. # 创建dev命名空间
  78. [root@master pki]# kubectl create ns dev
  79. namespace/dev created
  80. # kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev --dry-run -o yaml
  81. kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev
  82. [root@master pki]# kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev
  83. rolebinding.rbac.authorization.k8s.io/devuser-admin-binding created
  84. # 提前加载kubeconfig文件 生成用户信息
  85. kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig
  86. Switched to context "kubernetes".
  87. #将devuser用户放在默认的调用路径下 验证权限的执行结果
  88. [root@master .kube]# mv /root/.kube/config /root
  89. [root@master .kube]# cp -a /etc/kubernetes/pki/devuser.kubeconfig /root/.kube/config
  90. [root@master ~]# kubectl get pod
  91. No resources found in dev namespace.
  92. #证明现在使用devuser用户
  93. [root@master ~]# kubectl get pod -n default
  94. Error from server (Forbidden): pods is forbidden: User "devuser" cannot list resource "pods" in API group "" in the namespace "default"
  95. # 配合linux用户账户使用权限
  96. useradd dev
  97. passwd dev
  98. mkdir /home/dev/.kube
  99. cp /etc/kubernetes/pki/devuser.kubeconfig /home/dev/.kube/config
  100. chown -R dev:dev  /home/dev/.kube/
  101. #查看预设角色
  102. [root@master pki]# kubectl get clusterrole
  103. NAME                                                                   CREATED AT
  104. admin                                                                  2024-08-20T14:05:32Z
  105. calico-cni-plugin                                                      2024-08-27T14:02:54Z
  106. calico-kube-controllers                                                2024-08-27T14:02:54Z
  107. calico-node                                                            2024-08-27T14:02:54Z
  108. cluster-admin                                                          2024-08-20T14:05:32Z
  109. edit                                                                   2024-08-20T14:05:32Z
  110. kubeadm:get-nodes                                                      2024-08-20T14:05:34Z
  111. system:aggregate-to-admin                                              2024-08-20T14:05:32Z
  112. system:aggregate-to-edit                                               2024-08-20T14:05:32Z
  113. system:aggregate-to-view                                               2024-08-20T14:05:32Z
  114. system:auth-delegator                                                  2024-08-20T14:05:32Z
  115. system:basic-user                                                      2024-08-20T14:05:32Z
  116. system:certificates.k8s.io:certificatesigningrequests:nodeclient       2024-08-20T14:05:32Z
  117. system:certificates.k8s.io:certificatesigningrequests:selfnodeclient   2024-08-20T14:05:32Z
  118. system:certificates.k8s.io:kube-apiserver-client-approver              2024-08-20T14:05:32Z
  119. system:certificates.k8s.io:kube-apiserver-client-kubelet-approver      2024-08-20T14:05:32Z
  120. system:certificates.k8s.io:kubelet-serving-approver                    2024-08-20T14:05:32Z
  121. system:certificates.k8s.io:legacy-unknown-approver                     2024-08-20T14:05:32Z
  122. system:controller:attachdetach-controller                              2024-08-20T14:05:32Z
  123. system:controller:certificate-controller                               2024-08-20T14:05:32Z
  124. system:controller:clusterrole-aggregation-controller                   2024-08-20T14:05:32Z
  125. system:controller:cronjob-controller                                   2024-08-20T14:05:32Z
  126. system:controller:daemon-set-controller                                2024-08-20T14:05:32Z
  127. system:controller:deployment-controller                                2024-08-20T14:05:32Z
  128. system:controller:disruption-controller                                2024-08-20T14:05:32Z
  129. system:controller:endpoint-controller                                  2024-08-20T14:05:32Z
  130. system:controller:endpointslice-controller                             2024-08-20T14:05:32Z
  131. system:controller:endpointslicemirroring-controller                    2024-08-20T14:05:32Z
  132. system:controller:ephemeral-volume-controller                          2024-08-20T14:05:32Z
  133. system:controller:expand-controller                                    2024-08-20T14:05:32Z
  134. system:controller:generic-garbage-collector                            2024-08-20T14:05:32Z
  135. system:controller:horizontal-pod-autoscaler                            2024-08-20T14:05:32Z
  136. system:controller:job-controller                                       2024-08-20T14:05:32Z
  137. system:controller:legacy-service-account-token-cleaner                 2024-08-20T14:05:32Z
  138. system:controller:namespace-controller                                 2024-08-20T14:05:32Z
  139. system:controller:node-controller                                      2024-08-20T14:05:32Z
  140. system:controller:persistent-volume-binder                             2024-08-20T14:05:32Z
  141. system:controller:pod-garbage-collector                                2024-08-20T14:05:32Z
  142. system:controller:pv-protection-controller                             2024-08-20T14:05:32Z
  143. system:controller:pvc-protection-controller                            2024-08-20T14:05:32Z
  144. system:controller:replicaset-controller                                2024-08-20T14:05:32Z
  145. system:controller:replication-controller                               2024-08-20T14:05:32Z
  146. system:controller:resourcequota-controller                             2024-08-20T14:05:32Z
  147. system:controller:root-ca-cert-publisher                               2024-08-20T14:05:32Z
  148. system:controller:route-controller                                     2024-08-20T14:05:32Z
  149. system:controller:service-account-controller                           2024-08-20T14:05:32Z
  150. system:controller:service-controller                                   2024-08-20T14:05:32Z
  151. system:controller:statefulset-controller                               2024-08-20T14:05:32Z
  152. system:controller:ttl-after-finished-controller                        2024-08-20T14:05:32Z
  153. system:controller:ttl-controller                                       2024-08-20T14:05:32Z
  154. system:coredns                                                         2024-08-20T14:05:34Z
  155. system:discovery                                                       2024-08-20T14:05:32Z
  156. system:heapster                                                        2024-08-20T14:05:32Z
  157. system:kube-aggregator                                                 2024-08-20T14:05:32Z
  158. system:kube-controller-manager                                         2024-08-20T14:05:32Z
  159. system:kube-dns                                                        2024-08-20T14:05:32Z
  160. system:kube-scheduler                                                  2024-08-20T14:05:32Z
  161. system:kubelet-api-admin                                               2024-08-20T14:05:32Z
  162. system:monitoring                                                      2024-08-20T14:05:32Z
  163. system:node                                                            2024-08-20T14:05:32Z
  164. system:node-bootstrapper                                               2024-08-20T14:05:32Z
  165. system:node-problem-detector                                           2024-08-20T14:05:32Z
  166. system:node-proxier                                                    2024-08-20T14:05:32Z
  167. system:persistent-volume-provisioner                                   2024-08-20T14:05:32Z
  168. system:public-info-viewer                                              2024-08-20T14:05:32Z
  169. system:service-account-issuer-discovery                                2024-08-20T14:05:32Z
  170. system:volume-scheduler                                                2024-08-20T14:05:32Z
  171. view                                                                   2024-08-20T14:05:32Z
复制代码
在Kubernetes中,您可以使用kubectl下令行工具来检察用户。Kubernetes本身不包含用户管理的功能,用户通常是在外部管理的(例如使用LDAP、Active Directory或其他身份认证体系),然后通过Kubernetes的身份认证插件进行集成。
如果您想要检察Kubernetes集群中的用户,您通常需要检察与用户相关的Service Accounts或者Roles和RoleBindings。Service Accounts用于为在Kubernetes中运行的Pods提供身份认证。Roles和RoleBindings用于界说用户或Service Accounts的权限。
以下是一些可以使用的kubectl下令:


  • 检察全部Service Accounts:
  1. kubectl get serviceaccounts --all-namespaces
复制代码


  • 检察特定命名空间的Roles和RoleBindings:
  1. kubectl get roles --namespace <namespace>
  2. kubectl get rolebindings --namespace <namespace>
复制代码


  • 检察Role或ClusterRole的详细信息,了解它授予的权限:
  1. kubectl describe role <role-name> --namespace <namespace>
  2. kubectl describe clusterrole <clusterrole-name>
复制代码


  • 检察RoleBinding或ClusterRoleBinding的详细信息,了解它们关联的用户或Service Accounts:
  1. kubectl describe rolebinding <rolebinding-name> --namespace <namespace>
  2. kubectl describe clusterrolebinding <clusterrolebinding-name>
复制代码
请注意,这些下令提供的信息大概不会直接体现“用户”的概念,而是体现与用户权限相关的Service Accounts和角色绑定。实际的用户信息取决于您的身份认证体系和Kubernetes集群的配置。如果您使用的是外部的LDAP、OIDC等,您大概需要直接查询这些体系来管理用户。
  1. # 定义一个角色  
  2. apiVersion: rbac.authorization.k8s.io/v1  
  3. kind: Role  
  4. metadata:  
  5.   namespace: default  
  6.   name: pod-reader  
  7. rules:  
  8. - apiGroups: [""] # "" 表示核心API组  
  9.   resources: ["pods"]  
  10.   verbs: ["get", "list", "watch"]  
  11. ---
  12. # 将角色绑定到一个用户  
  13. apiVersion: rbac.authorization.k8s.io/v1  
  14. kind: RoleBinding  
  15. metadata:  
  16.   name: read-pods  
  17.   namespace: default  
  18. subjects:  
  19. - kind: User  
  20.   name: janedoe # 用户名  
  21.   apiGroup: rbac.authorization.k8s.io  
  22. roleRef:  
  23.   kind: Role  
  24.   name: pod-reader  
  25.   apiGroup: rbac.authorization.k8s.io
复制代码
在上面的例子中,我们界说了一个名为pod-reader的角色,它允许对default命名空间内的Pods进行读取操纵。然后,我们创建了一个名为read-pods的角色绑定,将pod-reader角色绑定到了用户janedoe上。这样,用户janedoe就只能对default命名空间内的Pods进行读取操纵了。
Role 示例

Role界说了一组针对特定命名空间内资源的操纵权限集合。以下是一个Role的示例,该Role允许在development命名空间中检察和列出Pods和Deployments:
  1. apiVersion: rbac.authorization.k8s.io/v1  
  2. kind: Role  
  3. metadata:  
  4.   namespace: development  
  5.   name: dev-readonly  
  6. rules:  
  7. - apiGroups: [""] # "" 表示核心API组  
  8.   resources: ["pods", "deployments"]  
  9.   verbs: ["get", "list", "watch"]
复制代码
ClusterRole 示例

ClusterRole与Role类似,但作用范围是整个集群,包括全部命名空间以及那些不隶属于任何命名空间的集群级别资源。以下是一个ClusterRole的示例,该ClusterRole允许检察集群中的节点信息:
  1. apiVersion: rbac.authorization.k8s.io/v1  
  2. kind: ClusterRole  
  3. metadata:  
  4.   name: cluster-viewer  
  5. rules:  
  6. - apiGroups: [""]  
  7.   resources: ["nodes"]  
  8.   verbs: ["get", "list", "watch"]
复制代码
RoleBinding 示例
RoleBinding将Role与一组用户、组或者服务账户关联起来,并且限制在某个特定命名空间内见效。以下是一个RoleBinding的示例,该RoleBinding将上面创建的dev-readonly角色绑定到用户alice上:
  1. apiVersion: rbac.authorization.k8s.io/v1  
  2. kind: RoleBinding  
  3. metadata:  
  4.   name: dev-user-binding  
  5.   namespace: development  
  6. subjects:  
  7. - kind: User  
  8.   name: alice  
  9. roleRef:  
  10.   kind: Role  
  11.   name: dev-readonly  
  12.   apiGroup: rbac.authorization.k8s.io
复制代码
ClusterRoleBinding 示例

ClusterRoleBinding类似于RoleBinding,但它将ClusterRole绑定到用户、组或服务账户上,并在整个集群范围内见效。以下是一个ClusterRoleBinding的示例,该ClusterRoleBinding将上面创建的cluster-viewer角色绑定到用户alice上:
  1. apiVersion: rbac.authorization.k8s.io/v1  
  2. kind: ClusterRoleBinding  
  3. metadata:  
  4.   name: cluster-viewer-binding  
  5. subjects:  
  6. - kind: User  
  7.   name: alice  
  8. roleRef:  
  9.   kind: ClusterRole  
  10.   name: cluster-viewer  
  11.   apiGroup: rbac.authorization.k8s.io
复制代码
通过以上示例,我们可以看到RBAC在Kubernetes中如何通过界说角色和角色绑定来精细控制不同用户或服务账户对集群资源的访问权限。这些界说可以通过kubectl下令行工具或Kubernetes API进行创建、检察和修改。
RBAC 提供了一种机动且强大的方式来管理Kubernetes集群中的访问控制,使得管理员能够根据实际需要来定制权限策略。
常见预定角色



  • view ClusterRole
    允许读取一个命名空间中的大多数资源,除了Role、 RoleBinding和 Secret
  • editClusterRole
    允许读取和修改 Secret。
    但是,它也不允许检察或修改Role和RoleBinding,这是为了防止权限扩散。
  • adminClusterRole
    一个命名空间中的资源的完全控制权是由 admin ClusterRole 赋予的。 有这个ClusterRole的主体可以读取和修改命名空间中的任何资源,除了ResourceQuota 和命名空间资源本身。edit和adminClusterRole之间的主要区别是能否在命名空间中检察和修改 Role 和 RoleBinding。
  • cluster-adminClusterRole
    通过将cluster-adminClusterRole赋给主题,主体可以得到Kuberbnetes器群完全控制的权限
3. 准入控制(Admission Control)

准入控制是API Server的一个插件列表,用于在哀求操纵被长期化到etcd之前进行拦截和检查。准入控制器可以修改哀求内容,或者根据预界说的策略决定是否允许该哀求继续执行。Kubernetes提供了多种内置的准入控制器,如:
3.1 NamespaceLifecycle:

确保哀求的资源在精确的命名空间中。
3.2 LimitRanger:

限制Pod可以使用的资源量。
3.3 ServiceAccount:

确保Pod在创建时主动设置ServiceAccount。
3.4 DefaultStorageClass:

为没有指定存储类的PersistentVolumeClaim设置默认的存储类。
别的,用户还可以编写自界说准入控制器或利用Webhook准入控制器与外部服务集成,以实现更为复杂的场景和业务逻辑。
综上所述,Kubernetes的安全机制通过认证、鉴权和准入控制三个环节,确保了集群内部和外部访问的安全性。这些机制共同协作,为Kubernetes集群提供了强大的安全保障。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表