Loading

第13章:Kubernetes 鉴权框架与用户权限分配

1.Kubernetes的安全框架

  • 访问K8S集群的资源需要过三关:认证、鉴权、准入控制

  • 普通用户若要安全访问集群API Server,往往需要证书、Token或者用户名+密码;Pod访问,需要ServiceAccount

  • K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都支持插件方式,通过API Server配置来启用插件。

访问API资源要经过以下三关才可以:

  1. Authentication(鉴权)

  2. Authorization(授权)

  3. Admission Control(准入控制)

k8s-security

2.传输安全,认证,授权,准入控制

传输安全:

  • 告别8080,迎接6443(http://172.16.1.70:6443/) Client sent an HTTP request to an HTTPS server.

  • 全面基于HTTPS通信

鉴权:三种客户端身份认证:

  • HTTPS 证书认证:基于CA证书签名的数字证书认证

    [root@k8s-admin ~]# ls /etc/kubernetes/pki/ [root@k8s-admin ~]# ls -l /root/.kube/config -rw------- 1 root root 5451 Apr 24 18:40 /root/.kube/config

  • HTTP Token认证:通过一个Token来识别用户

  • HTTP Base认证:用户名+密码的方式认证

授权:

RBAC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。

根据API请求属性,决定允许还是拒绝。

准入控制:

Adminssion Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求。

3.使用RBAC授权

RBAC(Role-Based Access Control,基于角色的访问控制),允许通过Kubernetes API动态配置策略。

角色

  • Role:授权特定命名空间的访问权限

  • ClusterRole:授权所有命名空间的访问权限

角色绑定

  • RoleBinding:将角色绑定到主体(即subject)

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

主体(subject)

  • User:用户

  • Group:用户组

  • ServiceAccount:服务账号

rbac

示例:为aliang用户授权default命名空间Pod读取权限

1、用K8S CA签发客户端证书

# tar -xzf cfssl.tar.gz
# cp -a cfssl/* /usr/bin/


# cat cert.sh
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}
EOF

cat > lc-csr.json <<EOF
{
  "CN": "lc",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lc-csr.json | cfssljson -bare lc

# sh cert.sh
生成如下文件
ca-config.json lc.csr lc-csr.json lc-key.pem lc.pem

2、生成kubeconfig授权文件

 
# cat config.sh
kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/pki/ca.crt \
  --embed-certs=true \
  --server=https://172.16.1.70:6443 \
  --kubeconfig=lc.kubeconfig

# 设置客户端认证
kubectl config set-credentials lc \
  --client-key=lc-key.pem \
  --client-certificate=lc.pem \
  --embed-certs=true \
  --kubeconfig=lc.kubeconfig

# 设置默认上下文
kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=lc \
  --kubeconfig=lc.kubeconfig

# 设置当前使用配置
kubectl config use-context kubernetes --kubeconfig=lc.kubeconfig


# sh config.sh
会生成 lc.kubeconfig 文件

3、创建RBAC权限策略

# cat rbac.yaml
---
# 创建角色(权限集合)
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

---
# 将lc用户绑定到角色
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: lc
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
  
  
# kubectl apply -f rbac.yaml
# 具体的角色权限可以参考官网rbac相关文档:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/

4、测试

# kubectl get Role
NAME         AGE
pod-reader   7m46s

# kubectl get RoleBinding
NAME       AGE
read-pods   7m49s

# kubectl --kubeconfig=lc.kubeconfig get pods
NAME                     READY   STATUS   RESTARTS   AGE
nginx-86c57db685-rrhzp   1/1     Running   1         28d

# kubectl --kubeconfig=lc.kubeconfig get pods -n kube-system
Error from server (Forbidden): pods is forbidden: User "lc" cannot list resource "pods" in API group "" in the namespace "kube-system"
# lc用户只有访问default命名空间Pod读取权限。

posted @ 2021-05-23 11:03  云起时。  阅读(234)  评论(0编辑  收藏  举报