概述

当我们访问K8S集群时,需要经过三个步骤完成具体操作

  • 认证
  • 鉴权【授权】
  • 准入控制:进行访问的时候,都需要经过 apiserver
    • apiserver做统一协调,比如门卫
    • 访问过程中,需要证书、token、或者用户名和密码
    • 如果访问pod需要serviceAccount

Kubernetes集群安全机制 - 图1

一、 认证

对外不暴露8080端口,只能内部访问,对外使用的端口6443
客户端身份认证常用方式

  • https证书认证,基于ca证书
  • http token认证,通过token来识别用户
  • http基本认证,用户名 + 密码认证

    二、 鉴权

    基于RBAC进行鉴权操作
    基于角色访问控制

2.1 RBAC介绍

基于角色的访问控制,为某个角色设置访问内容,然后用户分配该角色后,就拥有该角色的访问权限
Kubernetes集群安全机制 - 图2
k8s中有默认的几个角色

  • role:特定命名空间访问权限
  • ClusterRole:所有命名空间的访问权限

角色绑定

  • roleBinding:角色绑定到主体
  • ClusterRoleBinding:集群角色绑定到主体

主体

  • user:用户
  • group:用户组
  • serviceAccount:服务账号

    2.2 RBAC实现鉴权

  • 创建命名空间

    2.2.1 创建命名空间

    我们可以首先查看已经存在的命名空间

    1. kubectl get namespace

    Kubernetes集群安全机制 - 图3
    然后我们创建一个自己的命名空间 roledemo

    1. kubectl create ns roledemo

    image.png

    2.2.2 命名空间创建Pod

    为什么要创建命名空间?因为如果不创建命名空间的话,默认是在default下

    1. kubectl run nginx --image=nginx -n roledemo

    image.png

    2.2.3 创建角色

    我们通过 rbac-role.yaml进行创建 ```yaml kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: roledemo name: pod-reader rules:

  • apiGroups: [“”] # “” indicates the core API group resources: [“pods”] verbs: [“get”, “watch”, “list”]
    1. tip:这个角色只对pod getlist权限<br />然后通过 yaml创建我们的role

    创建

    kubectl apply -f rbac-role.yaml

    查看

    kubectl get role -n roledemo ``` image.png

    2.2.4 创建角色绑定

    我们还是通过 role-rolebinding.yaml 的方式,来创建我们的角色绑定 ```yaml kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods namespace: roledemo subjects:
  • kind: User name: lucy # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: Role #this must be Role or ClusterRole name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to apiGroup: rbac.authorization.k8s.io
  1. 然后创建我们的角色绑定

创建角色绑定

kubectl apply -f rbac-rolebinding.yaml

查看角色绑定

kubectl get role, rolebinding -n roledemo

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2639475/1618281811083-0a3fee1d-01e1-40ce-b00f-e8a51f094ef3.png#height=150&id=iLK53&margin=%5Bobject%20Object%5D&name=image.png&originHeight=150&originWidth=843&originalType=binary&size=17859&status=done&style=none&width=843)
  2. <a name="uaEqb"></a>
  3. #### 2.2.5 [使用证书识别身份](http://moxi159753.gitee.io/learningnotes/#/./K8S/13_Kubernetes%E9%9B%86%E7%BE%A4%E5%AE%89%E5%85%A8%E6%9C%BA%E5%88%B6/README?id=%e4%bd%bf%e7%94%a8%e8%af%81%e4%b9%a6%e8%af%86%e5%88%ab%e8%ba%ab%e4%bb%bd)
  4. 我们首先得有一个 rbac-user.sh 证书脚本
  5. ```shell
  6. cat > lucy-csr.json <<EOF
  7. {
  8. "CN": "lucy",
  9. "hosts": [],
  10. "key": {
  11. "algo": "rsa",
  12. "size": 2048
  13. },
  14. "names": [
  15. {
  16. "C": "CN",
  17. "L": "BeiJing",
  18. "ST": "BeiJing"
  19. }
  20. ]
  21. }
  22. EOF
  23. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes lucy-csr.json | cfssljson -bare lucy
  24. kubectl config set-cluster kubernetes \
  25. --certificate-authority=ca.pem \
  26. --embed-certs=true \
  27. --server=https://10.4.104.171:6443 \
  28. --kubeconfig=lucy-kubeconfig
  29. kubectl config set-credentials mary \
  30. --client-key=lucy-key.pem \
  31. --client-certificate=lucy.pem \
  32. --embed-certs=true \
  33. --kubeconfig=lucy-kubeconfig
  34. kubectl config set-context default \
  35. --cluster=kubernetes \
  36. --user=lucy \
  37. --kubeconfig=lucy-kubeconfig
  38. kubectl config use-context default --kubeconfig=lucy-kubeconfig

这里包含了很多证书文件,在TSL目录下,需要复制过来
通过下面命令执行我们的脚本

  1. bash rbac-user.sh

最后我们进行测试

  1. # 用get命令查看 pod 【有权限】
  2. kubectl get pods -n roledemo
  3. # 用get命令查看svc 【没权限】
  4. kubectl get svc -n roledmeo

Kubernetes集群安全机制 - 图7

三、 准入控制

就是准入控制器的列表,如果列表有请求内容就通过,没有的话 就拒绝

感想:这个是用二进制方式才能有证书来搞这个全部的步骤!参考意义不大!