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"

    Loading

    Facebook评论