概述

访问k8s集群时候,需要经过三个步骤完成具体操作

  1. 第一步:认证
  2. 第二步:鉴权(授权)
  3. 第三步:准入控制

进行访问的时候,这个过程都需要结果apiserver,apiserver做统一协调(如门卫)

  1. 访问过程中需要证书、token、或者用户名+密码
  2. 如果想要访问Pod,还需要serverAccount

k8s 第三方身份认证_安全


图例说明:

  1. 传输安全:对外不暴露8080端口,只能内部访问,对外使用端口6443
  2. 认证:客户端身份认证常用方式如下:
  • https证书认证,基于ca证书
  • http token认证,通过token识别用户
  • http基本认证,用户名+密码认证(这种认证方式使用的比较少)
  1. 鉴权(授权)
  • 基于RBAC进行鉴权操作(基于角色访问控制)
  1. 准入控制:实际上就是一个准入控制器的一个列表,对发送到apiserver上的请求过滤,在列表中就通过,没有就不通过
  • 进行注入控制器的列表,如果列表中对应请求内容,便通过,没有便拒绝

RBAC

概述

RBAC(Role-Based Access Control,基于角色的访问控制)

相对于其他访问控制方式,新的 RBAC 具有如下优势

  1. 对集群中的资源和非资源权限均有完整的覆盖
  2. 整个 RBAC 完全由几个 API 对象完成,同其他 API 对象一样,可以用 kubectl 或 API进行操作
  3. 可以在运行时进行调整,无需重启 API Server要使用 RBAC 授权模式,需要在 API Server 的启动参数中加上--authorization-mode=RBAC

图例说明:有一个用户lucy,其拥有一个sale的角色,sale角色可以对资源进行create和get操作,那么lucy也可以对资源进行create和get操作

k8s 第三方身份认证_命名空间_02

RBAC 的 API 资源对象说明

RBAC 引入了 4 个新的顶级资源对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding。

同其他 API 资源对象一样,用户可以使用 kubectl 或者 API 调用等方式操作这些资源对象

角色(Role)

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

一个角色就是一组权限的集合,这里的权限都是许可形式的,不存在拒绝的规则。

在一个命名空间中,可以用角色来定义一个角色,

如果是集群级别的,就需要使用 ClusterRole了。

角色只能对命名空间内的资源进行授权

查看和创建命名空间,操作如下:

k8s 第三方身份认证_k8s 第三方身份认证_03

集群角色(ClusterRole)

集群角色除了具有和角色一致的命名空间内资源的管理能力 ,因其集群级别的范围,还可以用于以下特殊元素的授权。

  • 集群范围的资源,例如 Node
  • 非资源型的路径,例如/healthz
  • 包含全部命名空间的资源,例如 pods
角色绑定(RoleBinding) 和 集群角色绑定(ClusterRoleBinding)

角色绑定或集群角色绑定用来把一个角色绑定到一个目标上,绑定目标可以是 User、Group 或者 Service Account。

  1. 使用 RoleBinding 为某个命名空间授权,
  2. ClusterRoleBinding 为集群范围内授权。

主体

有以下三种:

  1. user:用户
  2. group:用户组
  3. serviceAccount:服务账号

RBAC实现鉴权

第一步:创建命名空间

查看命名空间

k8s 第三方身份认证_命名空间_04


创建新的命名空间:roledemo

k8s 第三方身份认证_安全_05

第二步:在创建的命名空间下创建pod

创建

k8s 第三方身份认证_安全_06


查看pod

k8s 第三方身份认证_安全_07

第三步:创建角色

创建如下的yaml文件(rbac-role.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"]

创建并执行文件

k8s 第三方身份认证_命名空间_08


查看指定名称空间角色

k8s 第三方身份认证_安全_09

第四步:创建角色绑定

创建如下的yaml文件

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: roledemo
subjects:
- kind: User
  name: mary # 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

创建并执行该yaml文件

k8s 第三方身份认证_安全_10


查看

k8s 第三方身份认证_k8s 第三方身份认证_11

第五步:使用证书识别身份

创建如下的脚本文件sh

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

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes mary-csr.json | cfssljson -bare mary 

kubectl config set-cluster kubernetes \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --server=https://192.168.44.147:6443 \
  --kubeconfig=mary-kubeconfig
  
kubectl config set-credentials mary \
  --client-key=mary-key.pem \
  --client-certificate=mary.pem \
  --embed-certs=true \
  --kubeconfig=mary-kubeconfig

kubectl config set-context default \
  --cluster=kubernetes \
  --user=mary \
  --kubeconfig=mary-kubeconfig

kubectl config use-context default --kubeconfig=mary-kubeconfig

创建mary目录,创建rbac-user.sh脚本

k8s 第三方身份认证_命名空间_12


将证书文件进行复制

k8s 第三方身份认证_命名空间_13

执行sh脚本

k8s 第三方身份认证_安全_14


查看证书文件

k8s 第三方身份认证_k8s 第三方身份认证_15


k8s 第三方身份认证_安全_16

第六步:测试

查看pod功能

k8s 第三方身份认证_k8s 第三方身份认证_17


查看svc,是没有权限的

k8s 第三方身份认证_kubernetes_18