CKS认证-RBAC授权

6.RBAC授权

问题

:::success
Context
:::
绑定到 Pod 的 ServiceAccount的 Role 授予过度宽松的权限。 完成以下项目以减少权限集。
:::success
Task
:::
一个名为 dev-pod 的现有 Pod 已在namespace monitoring 中运行。
编辑绑定到 Pod的 ServiceAccount service-account-web 的现有 Role,仅允许只对pods 类型的资源执行 get 操作。
在 namespace monitoring 中创建一个名为role-20,并仅允许只对 statefulsets 类型的资源执行 update 操作的新 Role。
创建一个名为 role-2-binding 的新RoleBinding,将新创建的 Role 绑定到 Pod 的ServiceAccount.

请勿删除现有的 RoleBinding

使用 RBAC 鉴权

正确答案:

先解决第一问:
编辑绑定到 Pod的 ServiceAccount service-account-web 的现有 Role,仅允许只对pods 类型的资源执行 get 操作
先要想到“编辑pod绑定的service的role”这一步你要先去查看pod绑定的是哪个serviceaccount

root@hk8s-master01:~# kubectl -n monitoring get pod  dev-pod -o yaml | grep service
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
  serviceAccount: service-account-web  ##看这个serviceaccount用的是哪个,接下来就操作哪个
  serviceAccountName: service-account-web
      - serviceAccountToken:

再查看serviceaccount

root@hk8s-master01:~# kubectl get serviceaccounts -n monitoring 
NAME                  SECRETS   AGE
default               0         393d
service-account-web   0         393d   ##是这个serviceaccount
test-sa-3             0         393d

注意:这里还可以加一步查看rolebinding以确定serviceaccount绑定的是哪个role

root@hk8s-master01:~# kubectl get rolebindings.rbac.authorization.k8s.io -n monitoring pod-get -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  creationTimestamp: "2023-02-22T07:54:53Z"
  name: pod-get 
  namespace: monitoring
  resourceVersion: "10361"
  uid: debb7d6f-7172-4f6e-89fd-7522d3610996
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role   #
  name: web-role   ##
subjects:
- kind: ServiceAccount  #这里的serviceaccount绑定的role是web-role,所以修改时候只修改web-role即可。
  name: service-account-web   ## 
  namespace: monitoring

接下来我们就需要编辑这个role规则,使其只对pod有get权限。那么这一步就做完了。

root@hk8s-master01:~# kubectl edit role -n monitoring 
Edit cancelled, no changes made.
  1 # Please edit the object below. Lines beginning with a '#' will be ignored,
  2 # and an empty file will abort the edit. If an error occurs while saving this file will be
  3 # reopened with the relevant failures.
  4 #
  5 apiVersion: rbac.authorization.k8s.io/v1
  6 kind: Role
  7 metadata:
  8   creationTimestamp: "2023-02-22T07:54:37Z"
  9   name: web-role
 10   namespace: monitoring
 11   resourceVersion: "10337"
 12   uid: 5b1f83da-ca57-4056-8c6a-d8cd5997b5ed
 13 rules:
 14 - apiGroups:  ##这个是apigroup组,就是你用explain执行出来的GROUP的值。
 15   - ""
 16   resources:  ##resources:可以定义serviceaccount、pod、cluster、控制器这些内容,是啥意思我也不知道
 17   - pods
 18   verbs:
 19   - get
 20   - watch   ##需要把这两个删除掉 watch和list,然后wq保存即可。
 21   - list
root@hk8s-master01:~# kubectl explain statefulset 
GROUP:      apps   ##apiGroups填这的内容
KIND:       StatefulSet
VERSION:    v1
root@hk8s-master01:~# kubectl describe  role web-role   -n monitoring 
Name:         web-role
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  pods       []                 []              [get]

再解决第二问:
在 namespace monitoring 中创建一个名为role-20,并仅允许只对 statefulsets 类型的资源执行 update 操作的新 Role

注意:
** 7 rules:**
** 8 - apiGroups: **
** 9 - “app”**
这段配置中为什么要定义app这个组呢?
因为当你设置成 " " 时,他表示的是core组,里面没有statefulset这个资源。这个资源是在apps这个组下面。所以需要定义app
image.png

让自己创建一个role-20的role,那我们就直接复制第一个role
root@hk8s-master01:~# cp 6-1.yaml  6-2.yaml
root@hk8s-master01:~# vim 6-2.yaml 
  1 apiVersion: rbac.authorization.k8s.io/v1
  2 kind: Role
  3 metadata:
  4   creationTimestamp: "2023-02-22T07:54:37Z"
  5   name: role-20
  6   namespace: monitoring
  7 rules:
  8 - apiGroups:   ##一定要注意这个位置,需要写上,具体为什么还没弄懂。
  9   - "apps"
 10   resources:   ##这里可以定义控制器
 11   - statefulsets
 12   verbs:
 13   - update 
 14 #  - get
 15 #  - watch
 16 #  - list
root@hk8s-master01:~# kubectl apply -f 6-2.yaml

root@hk8s-master01:~# kubectl get role -n monitoring   
NAME       CREATED AT
role-20     2024-03-22T02:28:28Z
web-role   2023-02-22T07:54:37Z

最后解决第三问:
创建一个名为 role-2-binding 的新RoleBinding,将新创建的 Role 绑定到 Pod 的ServiceAccount.
:::info
注意:
当你查官网的时候,是给了这么一个示例,但是你自己一定要新增subjects.namespace:这个字段。因为你的serviceaccount是在monitoring这个名称空间中的。如果不定义,否则是找不到你的serviceaccount的。
:::
官网rolebinding示例

创建角色绑定,并绑定。看到创建2字,你就要自己编辑yaml文件
root@hk8s-master01:~# vim 6-3.yaml 
  1 apiVersion: rbac.authorization.k8s.io/v1
  2 kind: RoleBinding
  3 metadata:
  4   name: role-2-binding
  5   namespace: monitoring
  6 subjects:
  7 - kind: ServiceAccount
  8   name: service-account-web
  9   namespace: monitoring
 10 #  apiGroup: rbac.authorization.k8s.io
 11 roleRef:
 12   kind: Role
 13   name: web-role
 14   apiGroup: "rbac.authorization.k8s.io"
 15 #  apiGroup: rbac.authorization.k8s.io

第二种方法实现:
直接可以用命令实现

root@hk8s-master01:~# kubectl create rolebinding role-2-binding --role=role-20 --serviceaccount=monitoring:service-account-web  -n monitoring

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值