一个计算机技术爱好者与学习者

0%

好好学K8S:K8S中的RBAC鉴权

1. RBAC Authorization

Role-based access control (RBAC) is a method of regulating access to computer or network resources based on the roles of individual users within your organization.

更多内容,参考Using RBAC Authorization

《为K8S创建用户账户和服务账户》一文中,我们创建了新用户jane,并且使用CA证书给该用户签发了证书。现在我们有了jane.crt和jane.key,本文中会给jane配置一些k8s集群的管理权限。

2. 角色和绑定

首先,给用户jane配置权限,使其能够创建和查看default空间下的pods。

2.1. 命令实现授权

1、创建角色

1
2
kubectl create role --help
kubectl create role developer --resource=pods --verb=list,create

2、角色绑定

1
kubectl create rolebinding dev-user-binding --role=developer --user=jane

2.2. manifest实现授权

直接通过配置清单,也可以实现角色创建和角色绑定。

1、创建授权文件auth.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: developer
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["list", "create"]

---
kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1
metadata:
name: dev-user-binding
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.iomaster

2、执行授权

1
kubectl apply -f auth.yaml

2.3. 验证权限

1
2
kubectl auth can-i list pods --as jane
kubectl get pods --as jane

至此,用户jane的权限配置完成。

3. 集群角色和绑定

以上,给jane授权,是在namespace范围内的。当我们想给jane授权cluster范围的权限时,就需要clusterroles。

比如,我们想给jane授权node相关的权限,可以如下实现。

3.1. 命令实现

1、创建集群角色

1
kubectl create clusterrole node-reader --verb=get,list,watch --resource=nodes

2、绑定集群角色

1
kubectl create clusterrolebinding node-reader-binding --user=jane --clusterrole=node-reader

3.2. manifest实现

1、创建授权文件auth.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
creationTimestamp: null
name: node-reader
rules:
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- list
- watch

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
creationTimestamp: null
name: node-reader-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: node-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: jane

2、执行授权

1
kubectl apply -f auth.yaml

4. 授权范围

如果使用clusterrole指定的资源是pods这种namespace级别的资源,该集群角色绑定给jane后会有什么效果?
答:jane对所有namespace中的pods资源拥有clusterrole中定义的操作权限。

  • ClusterRole + ClusterRoleBinding = All Namespaces
  • ClusterRole + RoleBindings = Particular Namespaces
  • Role + RoleBinding = Same Namespace

更多内容参考How to Use ClusterRoleBinding With A ServiceAccount in All Namespaces (or a few)

5. logs&exec命令权限授权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-and-pod-logs-reader
rules:
- apiGroups:
- ""
resources:
- pods
- pods/log
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- pods/exec
verbs:
- create

详情参考kubernetes RBAC role verbs to exec to pod

6. CRD资源授权

如果是CRD资源需要授权,可以先查看CRD资源,然后写入到yaml文件。例如,想要授权sparkapplition资源的操作权限:

1、首先查看spark crd资源

1
kubectl get crd | grep spark

看到内容为:

1
2
scheduledsparkapplications.sparkoperator.k8s.io       
sparkapplications.sparkoperator.k8s.io

2、编写clusterrole yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
creationTimestamp: null
name: sparkdev-role
rules:
- apiGroups:
- "sparkoperator.k8s.io"
resources:
- sparkapplications
- scheduledsparkapplications
verbs:
- get
- list
- watch
- create
- update
- patch
- delete

7. 访问K8S集群

用户jane已经拥有了需要的权限,该怎样访问k8s集群呢?答案是通过kubeconfig文件。

7.1. 获取集群基本信息

假设当前用户是admin,那么可以通过命令拿到apiserver地址和ca.crt文件。

1、查看apiserver地址

1
kubectl config view | grep server

2、保存ca.crt

1
cat ~/.kube/config | grep certificate-authority-data | awk '{print $2}' | base64 --decode > ca.crt

7.2. 生成jane.kubeconfig

1、生成(设置)kubeconfig集群参数

1
2
3
4
5
kubectl config set-cluster kubernetes \
--server="https://172.17.0.69:6443" \
--certificate-authority=ca.crt \
--embed-certs=true \
--kubeconfig=jane.kubeconfig

当前目录生成jane.kubeconfig文件。

2、设置kubeconfig客户端认证参数

1
2
3
4
5
kubectl config set-credentials jane \
--client-certificate=jane.crt \
--client-key=jane.key \
--embed-certs=true \
--kubeconfig=jane.kubeconfig

3、设置kubeconfig上下文参数

1
2
3
4
5
kubectl config set-context jane@kubernetes \
--cluster=kubernetes \
--user=jane \
--namespace=default \
--kubeconfig=jane.kubeconfig

4、查看配置

1
2
cat jane.kubeconfig
kubectl config view --kubeconfig jane.kubeconfig

7.3. 验证访问

1、设置默认上下文

1
2
3
export KUBECONFIG=jane.kubeconfig
kubectl config get-contexts
kubectl config use-context jane@kubernetes

2、测试执行命令

1
kubectl get pods

如果没有配置权限,会输出:

1
Error from server (Forbidden): pods is forbidden: User "jane" cannot list resource "pods" in API group "" in the namespace "default"

如果配置好了权限,会输出pod相关信息。

但是,以上权限测试只是在minikube或者katacoda平台生效。
如果使用kodekloud或者阿里云k8s集群,会报错:

1
error: You must be logged in to the server (Unauthorized)

研究了四个多小时,才发现是平台的问题,服气了。。。

8. 后记

上文中描述了useraccount的授权,但是没有提到serviceaccount的授权。

其实对于serviceaccount的授权,非常简单。创建role/clusterrole,sa绑定role/clusterrole即可。
例如:default namespace下的sa账户jane,授权app namespace下的pod创建权限。

1
2
kubectl create role developer --resource=pods --verb=list,create -n app
kubectl create rolebinding dev-user-binding --role=developer --serviceaccount=default:jane -n app
  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-k8s-rbac-auth/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~