`RBAC`的配置顺序:
✔ 首先,定义一个服务账号`service account`,也就是定义角色;
✔ 接着,定义一个`role`策略,比如:允许查看`pod`,禁止`describe`pod等;
✔ 最后,将定义好的角色和`role`策略进行绑定(`binding`)即可。
`RBAC`中配置生效的经验之谈:
✔ `role`+`rolebinding`=作用于对应名称空间的策略;
✔ `clusterrole`+`clusterrolebinding`=作用域集群级别的策略;
✔ `clusterrole`+`rolebinding`=作用于对应名称空间的策略,作用同第一条。其好处是更灵活更简洁。
如果你配置过jumpserver的用户组、机器组和授权,想必很好理解。// Admission Controller //最后,把手整个系统安全的就是`Admission Controller`准入控制器了。 对于已知用户,他可以管理(可能是查看、也可能是新建、也可能会删除等等)其命名空间或者对应集群下的所有授权资源。但这里有一个问题!不知道,你想到了没有?如何去校验用户的操作是否合规呢?例如:是否在`yaml`中配置了`limits`和`requets`字段,又或者研发人员配置的这两个字段是否合理?这也是十分重要的一个环节,对于初创公司或者是`kubernetes`初建设团队,这个环节可能也可容许暂时被忽略,大家基于一定的自觉、团队研发和上线流程的规范,来软限制这点。但当你的团队、集群越来越大的时候,`Admission Controller`准入控制器的上线和把控是缺一不可的!// 实战:RBAC //以下所有操作都基于创建的`ilinux`用户进行,并且每个操作之前需要删除之前配置过的权限,否则会相互影响1.Role+RoleBinding 应用场景:某个名称空间级别的权限授权我们先编辑`role:res-reader.yaml`,定义规则为:`default`名称空间下,只能`get`、`list`和`watch`相关资源:kind: Role #名称空间权限apiVersion: rbac.authorization.k8s.io/v1metadata: namespace: default #只能读取default名称空间下的对应规则 name: res-readerrules:- apiGroups: [""] # "" 表示核心群组:core API group resources: ["pods", "pods/log", "services"] verbs: ["get", "list", "watch"]然后我们来定义授权绑定`rolebinding:ilinux-res-reader.yaml`,其作用是将`ilinux`用户,绑定到我们上面定义的名为`res-reader`的权限上。
kind: RoleBinding #名称空间级别权限绑定;ClusterRoleBinding为集群级别的权限绑定apiVersion: rbac.authorization.k8s.io/v1metadata: name: ilinux-res-reader #增加可读性,命名规则:<用户>-<权限> namespace: defaultsubjects:- kind: User name: ilinux apiGroup: rbac.authorization.k8s.ioroleRef: kind: Role name: res-reader apiGroup: rbac.authorization.k8s.io依次`apply`配置文件,发现`ilinux`用户在`default`名称空间下有对应`pods`, `pods/log`, `services`的对应权限,和预期一样
[root@centos-1 RBAC]# kubectl get pod --kubeconfig=/tmp/ilinux.kubeconfig NAME READY STATUS RESTARTS AGEngx-new-cb79d555-hfc7h 1/1 Running 0 10d[root@centos-1 RBAC]# kubectl get service --kubeconfig=/tmp/ilinux.kubeconfigNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d[root@centos-1 RBAC]# kubectl get service --kubeconfig=/tmp/ilinux.kubeconfig -n ingress-nginxError from server (Forbidden): services is forbidden: User "ilinux" cannot list resource "services" in API group "" in the namespace "ingress-nginx"2.ClusterRole+ClusterRoleBinding应用场景:k8s集群级别的权限授权编辑`ClusterRole:cluster-res-reader.yaml`。
kind: ClusterRole #集群范围权限apiVersion: rbac.authorization.k8s.io/v1metadata: name: cluster-res-readerrules:- apiGroups: [""] # "" 表示核心群组:core API group resources: ["pods", "pods/log", "services"] verbs: ["get", "list", "watch"]编辑`ClusterRoleBinding:cluster-ilinux-res-reader.yaml`。
kind: ClusterRoleBinding #ClusterRoleBinding为集群级别的权限绑定apiVersion: rbac.authorization.k8s.io/v1metadata: name: cluster-ilinux-res-reader #增加可读性,命名规则:<用户>-<权限>subjects:- kind: User name: ilinux apiGroup: rbac.authorization.k8s.ioroleRef: kind: ClusterRole name: cluster-res-reader apiGroup: rbac.authorization.k8s.io依次`apply`配置文件,并通过以下命令观察权限生成情况。
[root@centos-1 RBAC]# kubectl get clusterrole[root@centos-1 RBAC]# kubectl get clusterrolebinding这时,我们发现`ilinux`用户已经具有集群级别(所有名称空间)的对应权限。
[root@centos-1 RBAC]# kubectl get service --kubeconfig=/tmp/ilinux.kubeconfig -n ingress-nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-ingress-controller NodePort 10.99.160.254 <none> 80:30080/TCP,443:30443/TCP 26h [root@centos-1 RBAC]# kubectl get service --kubeconfig=/tmp/ilinux.kubeconfig NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d3.ClusterRole+RoleBinding应用场景:交叉使用,其中`ClusterRole`策略会降级成`rolebinding`名称空间级别的策略,效果和`role+rolebinding`一样。好处:在名称空间很多的时候,重复权限的配置文件会少一半,而且更灵活。使用上面的`ClusterRole`(`cluster-res-reader.yaml`),并`apply-f`,编辑`rolebinding`:`cluster-default-ilinux-res-reader.yaml`。
kind: RoleBinding #名称空间级别权限绑定;ClusterRoleBinding为集群级别的权限绑定apiVersion: rbac.authorization.k8s.io/v1metadata: name: cluster-default-ilinux-res-reader #增加可读性,命名规则:<用户>-<权限> namespace: defaultsubjects:- kind: User name: ilinux apiGroup: rbac.authorization.k8s.ioroleRef: kind: ClusterRole name: cluster-res-reader apiGroup: rbac.authorization.k8s.io测试和预期一样,`ClusterRole`降级成`default`名称空间的权限了
[root@centos-1 RBAC]# kubectl get service --kubeconfig=/tmp/ilinux.kubeconfig NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d [root@centos-1 RBAC]# kubectl get service --kubeconfig=/tmp/ilinux.kubeconfig -n ingress-nginxError from server (Forbidden): services is forbidden: User "ilinux" cannot list resource "services" in API group "" in the namespace "ingress-nginx"