当前位置:   article > 正文

k8s安全机制

k8s安全机制

k8s的安全机制。分布式集群管理工具,就是容器编排

安全机制的核心:APIserver作为整个内部通信的中介,也是外部控制的入口,所有的安全机制都是围绕API server来进行设计

请求API资源

1、认证

2、鉴权

3、准入控制

只有三个条件都通过,才可以在k8s集群当中创建

认证:Anthentcation

1、HTTP Token:通过token识别合法用户,token是一个很长,很复杂的一个字符串,字符串是用来表达客户的一种方式,每个token对应一个用户名,用户名存储在APIserver能够访问的文件中

客户端发起请求时,HTTP headr包含token

客户端发起请求----token----APIserver(用户名存储文件)----解码-----用户名-----访问集群

2、http base:用户+密码的验证方式,用户名和密码都是通过base64进行加密,加密完成的字符串,http Request的header Atuthorization,发送给服务端,服务端收到加密字符串,解码,获取用户名和密码,验证通过,登录成功

3、https证书: 最严格的方式,也是最严谨的方式,基于CA根证书签名的客户端身份进行验证

认证的访问类型

1、k8s组件对api server组件的访问, kubelet kube-proxy

2、pod对APi server的访问,pod coredNS dashborad都是pod,也需要访问APi

3、客户端kubelet

  1. kubelet kube-proxy:都是通过APiserver的https证书,进行双向验证,都是用6443端口进行验证
  2. controller manager sheduler与APi server在一台服务器,可以直接使用APi server的非安全端口访问(8080端口)
签发证书

1、手动签发 二进制部署就是手动签发证书,CA签发----把证书匹配到每个对应组件,然后访问6443即可

2、自动签发,kubeadm,kubelet第一次访问api server使用token,token通过之后,controller manager会为kubelet生成一个证书,以后都是通过证书访问,kubeadm修改了证书的有效期,默认1年

3、kubeconfig,文件包含集群的参数,CA证书,API server地址,客户端的参数(客户端的证书和私钥),集群的名称和用户名

  1. k8s组件通过启动时指定访问不同的kubeconfig,可以访问不同的集群----API server---namespace---资源对象---pod----容器
  2. kubeconfig既是集群的描述文件,也是一个集群信息的保存文件,包含了集群的访问方式和认证信息
  3. -/ .kube/config 保存的是kubectl的访问认证信息

4、service Account,就是为了方便pod中的容器访问API server

pod的动作(增删改查)动态的,每个pod手动生成一个证书,于是k8s使用了service Account来进行循环认证,service Account里面包含了统一的认证信息,直接进行api server访问

5、Secret 保存资源对象

  1. serverAccount 内部保存的token service-Account-token
  2. Secret保存的是自定义的保密信息

6、serviceAccount保存信息

  1. 1、token
  2. 2、ca.crt
  3. 3、namespace
  4. 都会被自动挂载
鉴权

之前的认证过程,只是确认了双方都是可信的,可以相互通信的,鉴权是为了确定请求方的访问权限

能做那些指定的操作
  1. 1、ALwaysDeny 拒绝所有,一般是测试
  2. 2、ALwaysAllow 允许所有,用测试
  3. 3、ABAC attribute-base access control 基于属性的访问控制
  4. 4、webhook 外部访问集群内部的鉴权方式
  5. 5、RBAC role-base access control 基于角色的访问控制,也是k8s现在默认的规则机制
  6. 角色
  7. role 指定命名空间的资源控制权限
  8. 绑定角色
  9. rolebinding 将角色绑定到指定的命名空间
  10. 集群
  11. clusterrole 可以授权所有命名空间的资源控制权限
  12. 绑定集群
  13. clusterrolebinding 将集群的角色绑定到命名空间
准入控制

准入控制是api server的一个准入控制器的插件列表,不同的插件可以实现不同的准入控制机制

一般情况下建议使用官方默认的准入控制器

有哪些准入控制
  1. limitranger 命名空间的配置
  2. serviceAccount
  3. ResourceQuota 命名空间的配置限制
实验

实现不同用户管理自己的命名空间

  1. 创建一个用户
  2. useradd lucky
  3. passwd lucky
  4. 上传证书到 /usr/local/bin 目录中
  5. chmod +x /usr/local/bin/cfssl*
  6. mkdir /opt/lucky
  7. cd /opt/lucky
  8. vim user-cert.sh
  9. cat > lucky-csr.json << EOF
  10. {
  11. "CN": "lucky",
  12. "hosts": [],
  13. "key": {
  14. "algo": "rsa",
  15. "size": 2048
  16. },
  17. "names": [
  18. {
  19. "C": "CN",
  20. "ST": "Nanjing",
  21. "L": "Nanjing",
  22. "O": "k8s",
  23. "OU": "system"
  24. }
  25. ]
  26. }
  27. EOF
  28. 赋权
  29. chmod +x user-cert.sh
  30. ./user-cert.sh
  31. /etc/kubernetes/pki/ 目录中会生成 lucky-key.pem、lucky.pem、lucky.csr
  32. cd /etc/kubernetes/pki/
  33. cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /opt/lucky/lucky-csr.json | cfssljson -bare lucky
  34. cd /opt/lucky
  35. vim rbac-kubeconfig.sh
  36. APISERVER=$1
  37. # 设置集群参数
  38. export KUBE_APISERVER="https://$APISERVER:6443"
  39. kubectl config set-cluster kubernetes \
  40. --certificate-authority=/etc/kubernetes/pki/ca.crt \
  41. --embed-certs=true \
  42. --server=${KUBE_APISERVER} \
  43. --kubeconfig=lucky.kubeconfig
  44. # 设置客户端认证参数
  45. kubectl config set-credentials lucky \
  46. --client-key=/etc/kubernetes/pki/lucky-key.pem \
  47. --client-certificate=/etc/kubernetes/pki/lucky.pem \
  48. --embed-certs=true \
  49. --kubeconfig=lucky.kubeconfig
  50. # 设置上下文参数
  51. kubectl config set-context kubernetes \
  52. --cluster=kubernetes \
  53. --user=lucky \
  54. --namespace=lucky-cloud \
  55. --kubeconfig=lucky.kubeconfig
  56. kubectl create namespace lucky-cloud
  57. chmod +x rbac-kubeconfig.sh
  58. 生成鉴权
  59. ./rbac-kubeconfig.sh 20.0.0.70
  60. 使用上下文参数生成 lucky.kubeconfig 文件
  61. kubectl config use-context kubernetes --kubeconfig=lucky.kubeconfig
  62. 查看证书
  63. cat lucky.kubeconfig
  64. mkdir /home/lucky/.kube
  65. cp lucky.kubeconfig /home/lucky/.kube/config
  66. chown -R lucky:lucky /home/lucky/.kube/
  67. RBAC授权
  68. vim rbac.yaml
  69. apiVersion: rbac.authorization.k8s.io/v1
  70. kind: Role
  71. metadata:
  72. namespace: lucky-cloud
  73. name: pod-reader
  74. rules:
  75. - apiGroups: [""]
  76. resources: ["pods"]
  77. verbs: ["get", "watch", "list", "create"]
  78. ---
  79. apiVersion: rbac.authorization.k8s.io/v1
  80. kind: RoleBinding
  81. metadata:
  82. name: read-pods
  83. namespace: lucky-cloud
  84. subjects:
  85. - kind: User
  86. name: lucky
  87. apiGroup: rbac.authorization.k8s.io
  88. roleRef:
  89. kind: Role
  90. name: pod-reader
  91. apiGroup: rbac.authorization.k8s.io
  92. kubectl apply -f rbac.yaml
  93. kubectl get role,rolebinding -n lucky-cloud
  94. NAME CREATED AT
  95. role.rbac.authorization.k8s.io/pod-reader 2024-01-25T05:59:37Z
  96. NAME ROLE AGE
  97. rolebinding.rbac.authorization.k8s.io/read-pods Role/pod-reader 16s
  98. 切换用户,测试操作权限
  99. su - lucky
  100. vim pod-test.yaml
  101. apiVersion: v1
  102. kind: Pod
  103. metadata:
  104. name: pod-test
  105. spec:
  106. containers:
  107. - name: nginx
  108. image: nginx
  109. kubectl create -f pod-test.yaml
  110. kubectl get pods -o wide
  111. NAME READY STATUS RESTARTS AGE
  112. pod-test 1/1 Running 0 33s
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号