K8S鉴权
目录
K8S鉴权
什么是RBAC
K8S中的RBAC
角色
角色绑定
主体(subject)
角色(Role和ClusterRole)
集群内置权限
cluster-admin admin edit view
system开头的y用户
演示
参考
k8s集群相关所有的交互都通过apiserver来完成,对于这样集中式管理的系统来说,权限管理尤其重要,在1.5版的时候引入了RBAC(Role Base Access Control)的权限控制机制。
启用RBAC,需要在 apiserver 中添加参数–authorization-mode=RBAC,如果使用的kubeadm安装的集群,1.6+版本都默认开启了RBAC。
所以基本上现在遇到的,都会是RBAC方式校验权限,而权限则是我们对于攻击的一大重点,权限提升,绕过,窃取凭证。
主要将rbac,如果想了解更多的鉴权方案,可以看Kubernetes 认证 _ Kubernetes(K8S)中文文档_Kubernetes中文社区
什么是RBAC
简单就如下所示,给谁分配什么权限,这是大家经常在后台管理系统遇到的
K8S中的RBAC
简单来说,RBAC如下所示,对于kubectl使用普通用户来访问,而对于K8s就如下所示,在pod内,也就是容器内访问使用serviceaccount,而在主机节点使用普通用户,这就是我们的主体,也就是上列的张三,李四
那么在k8s中,如何进行上述的动作呢,就是通过下列方式,定义一个角色,然后绑定到角色就好,在k8s中是通过下列三类方式操作的
角色
Role:授权特定命名空间的访问权限
ClusterRole:授权所有命名空间的访问权限
角色绑定
RoleBinding:将角色绑定到主体(即subject)
ClusterRoleBinding:将集群角色绑定到主体
主体(subject)
User:用户
Group:用户组
ServiceAccount:服务账号
角色(Role和ClusterRole)
可以通过下列yaml来配置一个Role
cat >Role-001.yaml<<EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-role
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
EOF
$ kubectl apply -f Role-001.yaml
$ kubectl get role -n default
$ kubectl describe role pod-role -n default
可以通过下列yaml来配置一个集群角色
cat >ClusterRole-001.yaml<<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
EOF
$ kubectl apply -f ClusterRole-001.yaml
$ kubectl get clusterrole pod-clusterrole
$ kubectl describe clusterrole pod-clusterrole
其中
verb有如下设置
“get”, “list”, “watch”, “create”, “update”, “patch”, “delete”, “exec”
resource有如下设置
“services”, “endpoints”, “pods”,“secrets”,“configmaps”,“crontabs”,“deployments”,“jobs”,“nodes”,“rolebindings”,“clusterroles”,“daemonsets”,“replicasets”,“statefulsets”,“horizontalpodautoscalers”,“replicationcontrollers”,“cronjobs”
apiGroup有如下设置
“”,“apps”, “autoscaling”, “batch”
集群内置权限
cluster-admin admin edit view
cluster-admin 超级管理员,对集群所有权限,和linux下面root一样(在部署dashboard的时候,先创建sa,然后将sa绑定到角色cluster-admin,最后获取到token,这就使用了内置的cluster-admin )
admin 主要用于授权命名空间所有读写权限(针对于某个命名空间)
edit 允许对命名空间大多数对象读写操作,不允许查看或者修改角色、角色绑定。
view 允许对命名空间大多数对象只读权限,不允许查看角色、角色绑定和Secret
system开头的y用户
以system开头的用户都为k8s内置用户,
serviceaccount
$ cat >RoleBinding-ServiceAccount-001.yaml<<EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: role001
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rb001
namespace: default
subjects:
- kind: ServiceAccount
name: lisi
namespace: default
roleRef:
kind: Role
name: role001
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: lisi
namespace: default
EOF
演示
以为能够创建pod的权限来演示
参考
k8s之service account_serviceaccount_分享放大价值的博客-CSDN博客
九析帶你用 curl 輕鬆完爆 k8s apiserver - JavaShuo
kubernetes 开发必须要知道的知识点—— API Group_k8s apigroups_random_w的博客-CSDN博客