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
正确答案:
先解决第一问:
编辑绑定到 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
让自己创建一个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的。
:::
创建角色绑定,并绑定。看到创建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