写点什么

Kubernetes 手记(14)- 用户权限系统

用户头像
雪雷
关注
发布于: 2021 年 06 月 17 日
Kubernetes手记(14)- 用户权限系统

十四 用户权限系统

在 k8s 中的用户权限系统是使用 RBAC 模式的,RBAC 是 Role-Based AC 的缩写,全称:基于角色的访问控制。


我们可以让一个用户扮演一个角色,而这个角色拥有权限,而这个用户就拥有了这个权限,所以在 RBAC 中,用户授权就是授权某个角色。


用户(user):用户可以拥有某个角色。
角色(role):角色可以拥有某些许可。 1. 操作 2. 对象
许可(permission): 在一个对象上能施加的操作组合起来,称之为一个许可权限。
复制代码


  • 用户类型


Human User:              # 用户账号Pod Service Account:     # 服务账号
复制代码


  • 角色类型


- role(角色)、rolebinding(角色绑定)- clusterrole(集群角色)、clusterrolebinding(集群角色绑定)
复制代码


  • 授权类型


- 用户通过 rolebinding 去 bind rule,rolebinding 只能是当前命名空间中- 通过 clusterrolebinding 去 bind clausterrole,clusterrolebinding会在所有名称空间生效- 通过 rolebinding 去 bind clausterrole,由于 rolebinding 只在当前名称空间,所以 clusterrole 权限被限制为当前名称空间
复制代码


  • 通过 rolebinding 去 bind clusterrole 的好处


如果有很多名称空间、如果用 rolebinding 绑定 role,那么则需要在每个名称空间都定义 role如果使用 rolebinding 绑定一个 clausterrole ,由于 clusterrole 拥有所有名称空间的权限,而 rolebinding  只能绑定当前名称空间,那么就省去为每个名称空间都新建一个 role 的过程了。
复制代码

14.1 权限列表

kubectl get clusterrole admin -o yaml
复制代码

14.2 创建 Role

  • 命令行定义


kubectl create role pods-reader --verb=get,list,watch --resource=pods
复制代码


  • 使用清单方式定义


apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:  name: pods-reder  namespace: defaultrules:- apiGroups:                           # 对哪些 api 群组内的资源进行操作  - ""  resources:                           # 对哪些资源授权  - pods  verbs:                               # 授权做哪些操作  - get  - list  - watch
复制代码

14.3 创建 rolebinding

  • 使用 rolebinding 对象创建,用户与 role 的绑定


kubectl create rolebinding kaliarch-read-pods --role=pods-reader --user=kaliarch
复制代码


  • 使用清单方式定义


apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:  name: kaliarch-read-podsroleRef:  apiGroup: rbac.authorization.k8s.io  kind: Role  name: pods-readersubjects:- apiGroup: rbac.authorization.k8s.io  kind: User  name: kaliarch
复制代码


  • 切换用户和环境上下文


$ kubectl config use-context kaliarch@kubernetes
复制代码


  • 测试用户是否拥有 get 权限


kubectl get pods
复制代码

14.4 创建 clusterrole

  • 命令行定义


kubectl create clusterrole cluster-reader --verb=get,list,watch --resource=pods
复制代码


  • 使用清单方式定义


apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  name: cluster-readerrules:- apiGroups:  - ""  resources:  - pods  verbs:  - get  - list  - watch
复制代码


  • 系统内置有非常多的 clusterrole,详见:kubectl get clusterrole


NAME                                                                   AGEadmin                                                                  5d16hcluster-admin                                                          5d16hcluster-reader                                                         4m32sedit                                                                   5d16hflannel                                                                5d6hsystem:aggregate-to-admin                                              5d16hsystem:aggregate-to-edit                                               5d16hsystem:aggregate-to-view                                               5d16hsystem:auth-delegator                                                  5d16hsystem:aws-cloud-provider                                              5d16hsystem:basic-user                                                      5d16hsystem:certificates.k8s.io:certificatesigningrequests:nodeclient       5d16hsystem:certificates.k8s.io:certificatesigningrequests:selfnodeclient   5d16hsystem:controller:attachdetach-controller                              5d16hsystem:controller:certificate-controller                               5d16hsystem:controller:clusterrole-aggregation-controller                   5d16hsystem:controller:cronjob-controller                                   5d16hsystem:controller:daemon-set-controller                                5d16h
复制代码

14.5 创建 clusterrolebinding

  • 命令行定义


kubectl create clusterrolebinding kaliarch-read-all-pods --clusterrole=cluster-reader --user=kaliarch
复制代码


  • 清单定义


apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:  name: kaliarch-read-all-podsroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-readersubjects:- apiGroup: rbac.authorization.k8s.io  kind: User  name: kaliarch
复制代码


  • 切换用户和环境上下文


$ kubectl config use-context kaliarch@kubernetes
复制代码


  • 测试用户是否拥有 get 权限


$ kubectl get pods -n kube-system$ kubectl config use-context kubernetes-admin@kubernetes
复制代码

14.6 rolebinding 与 clusterrole

如果使用 rolebinding 绑定一个 clusterrole ,由于 clusterrole 拥有所有名称空间的权限,而 rolebinding 只能绑定当前名称空间,那么就省去为每个名称空间都新建一个 role 的过程了。


  • 命令定义


$ kubectl create rolebinding kaliarch-cluster-reader --clusterrole=cluster-reader --user=kaliarch
复制代码


  • 清单定义


apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:  name: kaliarch-adminroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: adminsubjects:- apiGroup: rbac.authorization.k8s.io  kind: User  name: kaliarch
复制代码


  • 切换用户和环境上下文


$ kubectl config use-context kaliarch@kubernetes
复制代码


  • 测试用户是否拥有 get 权限,由于使用了 rolebinding ,所以 cluster-reader 被限制到当前命名空间


$ kubectl get pods -n kube-system$ kubectl config use-context kubernetes-admin@kubernetes
复制代码

14.7 RBAC 授权

在 bind 授权的时候,可以绑定的用户主体有:user、group


  • 使用 rolebinding 和 clusterrolebinding 绑定


绑定到 user:表示只有这一个用户拥有 role 或者 clusterrole 的权限绑定到 group:表示这个组内的所有用户都具有了 role 或者 clusterrole 的权限
复制代码


  • 创建用户时候加入组,加入组后账户自动集成该组的权限


# 创建私钥(umask 077; openssl genrsa -out kaliarch.key 2048)
# 生成证书签署请求,O 是组,CN 就是账号,这个账号被 k8s 用来识别身份,授权也需要授权这个账号openssl req -new -key kaliarch.key -out kaliarch.csr -subj "O=system:masters/CN=kaliarch/"
# 使用 CA 签署证书,并且在 1800 天内有效openssl x509 -req -in kaliarch.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out kaliarch.crt -days 1800
# 查看证书openssl x509 -in kaliarch.crt -text -noout
复制代码

其他

自己将手记发在:https://github.com/redhatxl/awesome-kubernetes-notes欢迎一键三连

发布于: 2021 年 06 月 17 日阅读数: 9
用户头像

雪雷

关注

stay hungry stay foolish 2019.08.16 加入

Devops,python,shell,云原生,云架构,kubernetes https://github.com/redhatxl

评论

发布
暂无评论
Kubernetes手记(14)- 用户权限系统