概述
访问k8s集群时候,需要经过三个步骤完成具体操作
- 第一步:认证
- 第二步:鉴权(授权)
- 第三步:准入控制
进行访问的时候,这个过程都需要结果apiserver,apiserver做统一协调(如门卫)
- 访问过程中需要证书、token、或者用户名+密码
- 如果想要访问Pod,还需要serverAccount
图例说明:
- 传输安全:对外不暴露8080端口,只能内部访问,对外使用端口6443
- 认证:客户端身份认证常用方式如下:
- https证书认证,基于ca证书
- http token认证,通过token识别用户
- http基本认证,用户名+密码认证(这种认证方式使用的比较少)
- 鉴权(授权)
- 基于RBAC进行鉴权操作(基于角色访问控制)
- 准入控制:实际上就是一个准入控制器的一个列表,对发送到apiserver上的请求过滤,在列表中就通过,没有就不通过
- 进行注入控制器的列表,如果列表中对应请求内容,便通过,没有便拒绝
RBAC
概述
RBAC(Role-Based Access Control,基于角色的访问控制)
相对于其他访问控制方式,新的 RBAC 具有如下优势:
- 对集群中的资源和非资源权限均有完整的覆盖
- 整个 RBAC 完全由几个 API 对象完成,同其他 API 对象一样,可以用 kubectl 或 API进行操作
- 可以在运行时进行调整,无需重启 API Server要使用 RBAC 授权模式,需要在 API Server 的启动参数中加上
--authorization-mode=RBAC
图例说明:有一个用户lucy,其拥有一个sale的角色,sale角色可以对资源进行create和get操作,那么lucy也可以对资源进行create和get操作
RBAC 的 API 资源对象说明
RBAC 引入了 4 个新的顶级资源对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding。
同其他 API 资源对象一样,用户可以使用 kubectl 或者 API 调用等方式操作这些资源对象
角色(Role)
role:特定命名空间访问权限
ClusterRole:对所有命名空间访问权限
一个角色就是一组权限的集合
,这里的权限都是许可形式的,不存在拒绝的规则。
在一个命名空间中,可以用角色来定义一个角色,
如果是集群级别的,就需要使用 ClusterRole了。
角色只能对命名空间内的资源进行授权
查看和创建命名空间,操作如下:
集群角色(ClusterRole)
集群角色除了具有和角色一致的命名空间内资源的管理能力 ,因其集群级别的范围,还可以用于以下特殊元素的授权。
- 集群范围的资源,例如 Node
- 非资源型的路径,例如/healthz
- 包含全部命名空间的资源,例如 pods
角色绑定(RoleBinding) 和 集群角色绑定(ClusterRoleBinding)
角色绑定或集群角色绑定用来把一个角色绑定到一个目标上,绑定目标可以是 User、Group 或者 Service Account。
- 使用 RoleBinding 为某个命名空间授权,
- ClusterRoleBinding 为集群范围内授权。
主体
有以下三种:
- user:用户
- group:用户组
- serviceAccount:服务账号
RBAC实现鉴权
第一步:创建命名空间
查看命名空间
创建新的命名空间:roledemo
第二步:在创建的命名空间下创建pod
创建
查看pod
第三步:创建角色
创建如下的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"]
创建并执行文件
查看指定名称空间角色
第四步:创建角色绑定
创建如下的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文件
查看
第五步:使用证书识别身份
创建如下的脚本文件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脚本
将证书文件进行复制
执行sh脚本
查看证书文件
第六步:测试
查看pod功能
查看svc,是没有权限的