CKA [Security] – Authorization中的RBAC讲解和RoleBinding实践教程

- 如以上的流程图,登入cluster之后,会进行RBAC check如何没有权限的话就Access Denied
RBAC中的的Role是设置权限能够操作什么组件比如pod,deployment 等等
而subject是对象role绑定的对象有Service Account, group或user
RoleBinding就是把role和subject绑定在一起。

Role的讲解
- 如下图,role能够操控pod,secret 等等,但是权限的边界只是局限于namespace而不是整个cluster,如果创建role没有指定局限于什么namespace的话,那么就是局限于default namespace

ClusterRole的讲解
- 相较于Role的对于namespace的绑定,ClusterRole就能够跨namespace,或者局限于namespace的权限,非常灵活
- ClusterRole也能设置ClusterScoped的权限,比如nodes , storage classes, crd 等等

什么是ApiGroup?

在Kubernetes当中每个api都有api group,了解api以便可以set role的权限。参考这个Kubernetes docs referrence 1.33版本
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.33/#api-overview
比如Deployment的 api group是 apps, 而pod的api group就是core


根据以下的命令行,我们可以filter出来api-resource是在apps的api group以下的资源有哪些。
kubectl api-resources --api-group="apps"

如果是要filter api group 是filter的话,那么就需要放空才能过滤
kubectl api-resources --api-group=""

什么是Verbs?
在role的yaml定义当中,我们可以分为3个设定的值
- 第一是api group,api group就是以上所讲的,api管理群,比如使用的是core那么就放空
- 第二是resources, 你想设置控制的资源是什么比如core当中有pod
- 第三是verbs, verbs就是类似权限,能够读取,删除等等。

比如以下的role example yaml就是含有了apiGroups , resources和verbs
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["list"]
RoleBinding的结构
根据以下的RoleBinding例子,绑定的subject是user,绑定的role是pod-read-only

创建Token实践操作
以下的教程需要用到,以便登入kubernetes cluster
1. 创建Service Account , 默认没有指定namespace的话,那么就是使用default namespace
kubectl create sa test-sa
2. 为Service Account 创建Token , 默认没有加上duration的话,那么有效期限就是1个小时而已
kubectl create token test-sa --duration=10h
3. 使用 jwt 检查过期时间
https://jwt.io/

创建RoleBinding的实践操作
1. 创建role
【使用命令行创建role】
kubectl create role pod-reader --verb=get --verb=list --resource=pods
【dry run role 并且输出yaml】
kubectl create role pod-reader --verb=get --verb=list --resource=pods --dry-run=client -o yaml

2. 创建好role之后,就需要创建RoleBiding把role和提上所创建好的test-sa service account给关联起来
kubectl create rolebinding reader-binding --role=pod-reader --serviceaccount=default:test-sa
3. 测试使用命令行连接cluster 并且查看pods, 所以一开始需要查看cluster-info以获取control plane url
kubectl cluster-info

4. 把test-sa token给注入environment variable在terminal当中 (macos)
【注入variable】
TOKEN=XXXXXXXXX
【输出并且检查variable】
echo $TOKEN
5. 把https://K8S-DETAILS-HERE 改成你的control plane url
curl -k https://K8S-DETAILS-HERE/api/v1/namespaces/default/pods --header "Authorization: Bearer $TOKEN"
如果输出像以下的图片的话,没有报错就是有权限登入cluster和有权限访问了

根据以上url只是读取了default namespace而已,如何我们把default url改成kube-system的话就会报错,因为你的rolebinding没有绑定到kube-system namespace,所以没有权限访问。
curl -k https://K8S-DETAILS-HERE/api/v1/namespaces/kube-system/pods --header "Authorization: Bearer $TOKEN"
