本章概述
- Kubernetes API 鉴权流程
- Kubernetes API 鉴权类型
- 准入控制示例
13.1 Kubernetes API 鉴权流程:
1、身份验证:
kubernetes API-Server验证客户端身份是不是合法的service account账户,如果不是则API服务器直接返回错误状态码401并终止请求。此步骤会检查头部报文和客户端证书,如:client certificates,password,tokens
集群认证证书文件默认在用户家目录下的.kube/config,如root用户文件路径为:/root/.kube/config,为安全考虑,有些集群可能会更改证书文件路径,可以通过指定证书文件访问k8s集群。如:kubectl get pod --kubeconfig=/root/.kube/config
2、鉴权:
如果请求者有效,API服务器继续验证客户端是否有权限执行其当前的请求操作,如果请求者未经授权则API服务器返回错误403并终止请求。此步骤会检测Policy与verbs,如get、delete等
3、准入控制:
如果客户端权限验证通过,则API服务器的准入控制器判断请求是否被允许执行。
此步骤由控制器检测权限,如DenyExecOnPrivileged、LimitRanger等。
13.2 Kubernetes API 鉴权类型:
官网链接:https://kubernetes.io/zh/docs/reference/access-authn-authz/authorization
常用的两种:Node和RBAC
1、Node(节点鉴权):针对kubelet发出的API请求进行鉴权。
授予node节点的kubelet读取services、endpoints、secrets、configmaps等事件状态,并向API server更新pod与node状态。
查看k8s配置文件,默认开启Node和RBAC
2、Webhook: 是一个HTTP回调,发生某些事情时调用的HTTP调用。
# Kubernetes API 版本
apiVersion: v1
# API 对象种类
kind: Config
# clusters 代表远程服务。
clusters:
- name: name-of-remote-authz-service
cluster:
# 对远程服务进行身份认证的 CA。
certificate-authority: /path/to/ca.pem
# 远程服务的查询 URL。必须使用 'https'。
server: https://authz.example.com/authorize
3、ABAC(Attribute-based access control ):基于属性的访问控制,1.6之前使用,将属性与账户直接绑定。
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "user1", "namespace": "*", "resource": "*","apiGroup": "*"}} #用户user1对所有namespace所有API版本的所有资源拥有所有权限((没有设置"readonly": true)。
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "user2", "namespace": "myserver", "resource":"pods", "readonly": true}} #用户user2对namespace myserver的pod有只读权限。
--authorization-mode=...,RBAC,ABAC --authorization-policy-file=mypolicy.json #通过修改配置文件开启ABAC参数
4、RBAC(Role-Based Access Control):基于角色的访问控制,将权限与角色(role)先进行关联,然后将角色与用户进行绑定(Binding)从而继承角色中的权限。
RBAC API声明了四种Kubernetes对象:Role、ClusterRole、RoleBinding和ClusterRoleBinding。
Role: 定义一组规则,用于访问命名空间中的 Kubernetes 资源。
RoleBinding: 定义用户和角色(Role)的绑定关系。
ClusterRole: 定义了一组访问集群中 Kubernetes 资源(包括所有命名空间)的规则。
ClusterRoleBinding: 定义了用户和集群角色(ClusterRole)的绑定关系。
13.3 准入控制示例
13.3.1 通过token登录dashboard
示例:创建magedu-user账号,具有magedu namespace的权限
1、指定namespace创建账号
kubectl create serviceaccount magedu-user -n magedu
查看账号:
2、创建role规则
vim magedu-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: magedu #角色所在namespace,要和目标pod保持一致
name: magedu-role #指定角色名称
rules:
- apiGroups: ["*"] #资源对象的API版本,空表示所有版本
resources: ["pods/exec"] #目标资源对象为pod可执行的命令
#verbs: ["*"]
##RO-Role
verbs: ["get", "list", "watch", "create"] #定义上述资源对象的权限
- apiGroups: ["*"]
resources: ["pods"] #目标资源对象为pod
#verbs: ["*"]
##RO-Role
verbs: ["get", "list", "watch"] #定义上述资源对象的权限
- apiGroups: ["apps/v1"]
resources: ["deployments"] #目标资源对象为deployment控制器
#verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
##RO-Role
verbs: ["get", "watch", "list"] #定义上述资源对象的权限
创建role
kubectl apply -f magedu-role.yaml
查看role
3、创建role-binding,将role规则和用户进行绑定
vim magedu-role-bind.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: role-bind-magedu
namespace: magedu
subjects:
- kind: ServiceAccount
name: magedu-user #指定要绑定的账号
namespace: magedu
roleRef:
kind: Role
name: magedu-role #指定要绑定的role规则
apiGroup: rbac.authorization.k8s.io
创建role-binding
kubectl apply -f magedu-role-bind.yaml
查看role-binding
kubectl get rolebindings.rbac.authorization.k8s.io -n magedu
kubectl describe rolebindings.rbac.authorization.k8s.io role-bind-magedu -n magedu
4、获取token
(1)查看magedu namespace下的secrets
kubectl get secrets -n magedu #magedu-user即为刚创建的账号secrets
(2)获取secrets中的token信息
kubectl describe secrets magedu-user-token-nr5xg -n magedu
5、登录dashboard
复制token信息,通过magedu-user用户登录dashboard
(1)在k8s集群查看dashboard地址,进行访问,然后输入token
(2)登录以后只能访问default namespace下的资源,要想访问magedu namespace下的资源,需要修改浏览器url路径中的namespace(将default更改为magedu即可)
可以正常查看pod情况
注意:这里只能对pod进行"get", "list", "watch", "create"操作,对其他资源无法进行操作,也无法对其他namespace进行操作。
执行删除操作时,因为不具备删除权限,会报错:
以上生成的token,仅可以用来登录dashboard,如果想要进入集群执行命令,则需要生成kubeconfig文件,通过制定kubeconfig文件连接K8S集群执行命令
13.3.2 通过kubeconfig文件登录集群
1、创建csr文件
创建存放证书的目录
mkdir -p /root/yaml/20220522/RBAC-yaml-case
cd /root/yaml/20220522/RBAC-yaml-case
编辑yaml文件
vim magedu-user-csr.json
{
"CN": "China",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
2、签发证书
这里需要用到cfssl来生成证书,如果没有安装需要进行安装,安装步骤参考4.2.3.2.2的第(4)步骤。
ln -sv /etc/kubeasz/bin/cfssl* /usr/bin/
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem -ca-key=/etc/kubernetes/ssl/ca-key.pem -config=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json -profile=kubernetes magedu-user-csr.json | cfssljson -bare magedu-user
参数说明:
-ca=/etc/kubernetes/ssl/ca.pem #指定ca公钥证书,和k8s集群使用同一个ca证书
-ca-key=/etc/kubernetes/ssl/ca-key.pem #指定ca私钥证书,和k8s集群使用同一个ca证书
-config=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json #指定k8s集群config文件
-profile=Kubernetes #描述文件
查看生成的证书
3、生成普通用户kubeconfig文件
kubectl config set-cluster cluster1 --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=https://172.31.7.188:6443 --kubeconfig=magedu-user.kubeconfig
参数说明:
cluster1 #k8s集群名称
--certificate-authority=/etc/kubernetes/ssl/ca.pem #指定ca公钥
--embed-certs=true #伪装证书,即通过base64加密
--server=https://172.31.7.188:6443 #api-server地址和端口,可以写VIP地址172.31.7.188
--kubeconfig=magedu-user.kubeconfig #指定kubeconfig文件,会在当前目录下生成该文件
查看kubeconfig文件,已经生成证书,api-server地址,k8s集群名称,但其他字段为空,继续生成
4、设置客户端认证参数,将普通用户的公钥和私钥放入kubeconfig文件
# cp *.pem /etc/kubernetes/ssl/
# kubectl config set-credentials magedu-user \
--client-certificate=/etc/kubernetes/ssl/magedu-user.pem \
--client-key=/etc/kubernetes/ssl/magedu-user-key.pem \
--embed-certs=true \
--kubeconfig=./magedu-user.kubeconfig
参数说明:
magedu-user #指定普通用户名称
--client-certificate=/etc/kubernetes/ssl/magedu-user.pem #指定普通用户公钥
--client-key=/etc/kubernetes/ssl/magedu-user-key.pem #指定普通用户私钥
--embed-certs=true #证书伪装,进行base64加密
--kubeconfig=./magedu-user.kubeconfig #指定kubeconfig文件
查看kubeconfig文件内容,普通用户信息已加入kubeconfig文件
5、设置上下文参数(多集群使用上下文区分)
官网链接:https://kubernetes.io/zh/docs/concepts/configuration/organize-cluster-access-kubeconfig/
命令如下:
#kubectl config set-context cluster1 \
--cluster=cluster1 \
--user=magedu-user \
--namespace=magedu \
--kubeconfig=./magedu-user.kubeconfig
参数说明:
--cluster=cluster1 #指定设置上下文的集群名称
--user=magedu-user #指定普通用户名称
--namespace=magedu #指定普通用户可以访问的namespace
--kubeconfig=./magedu-user.kubeconfig #指定kubeconfig文件
查看kubeconfig文件
6、设置默认上下文
kubectl config use-context cluster1 --kubeconfig=./magedu-user.kubeconfig
7、获取token:
kubectl get secrets -n magedu | grep magedu
kubectl describe secrets magedu-token-8d897 -n magedu
kubectl describe secrets magedu-user-token-nr5xg -n magedu
token如下所示:
eyJhbGciOiJSUzI1NiIsImtpZCI6Ii05ZmctQVVKcEdaLXpuN2pCUHg4WXloNEJYbVNPR1JpVEVhQTNmTUw1SkkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJtYWdlZHUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoibWFnZWR1LXVzZXItdG9rZW4tbnI1eGciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoibWFnZWR1LXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NjFhM2YwMS1kYjNhLTQ5MmYtYWNiOS0zODAzNjFmM2RhMDciLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6bWFnZWR1Om1hZ2VkdS11c2VyIn0.BVuVUCFJrxAA5GoZEXD2euMpixkb3lQ-Tqctif-N4B8_TakLMOZAJbZr4MA-cEdCyFPiXnKpI-kdf1HNnUajy0uIp8avYql-dzhSyI2pKft2aklT7kUAWvdIH9E2YIpMO7jq4VJSx5v7PiVHUL4wvBKwL9V3TcnqUCqb6_ANy5oTcGgomd7lMs4x4mgqFQf6hcnbUwkcXNbQq9QF0tf4xgXiSqNX27j0DiUXkrcDKvG8Kr7Jv0eeWZyfgy-2r9d5RG2Y1Cv2kptmq6ATAtxoU5wxQoyGpwNWtz0V_WRMXhGpuP4BXybLMdA3tneUfVTcLlxGjLj0lcH4D2IhG9LiJQ
8、将token写入用户kube-config文件:
将token复制到magedu-user.kubeconfig文件最后
注意:json文件对格式要求严格,注意缩进(token前要缩进四个字符,按四下空格)
将magedu-user.kubeconfig文件导出,传递到需要登录dashboard的主机上
9、dashboard登录测试:
浏览器输入https://172.31.7.111:30004/#/login
选择magedu-user.kubeconfig文件
进入dashboard控制台,默认就是magedu,无需手动更改
文章评论