第八章 Kubernetes安全
1、Kubernetes RBAC授权
Kubernetes 基于角色的访问控制(Role-Based Access Control, RBAC) 是一种强大的权限管理机制,用于控制用户、用户组、服务账户对 Kubernetes 集群资源的访问。通过 RBAC,可以细粒度地定义哪些用户或服务账户可以执行哪些操作,从而增强集群的安全性和可管理性。
1.1 Kubernetes 安全框架
K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都支持 插件方式,通过 API Server 配置来启用插件。
-
Authentication(鉴权),验证用户身份是否为可信任的
-
Authorization(授权),判断用户是否有权限访问某个资源
-
Admission Control(准入控制),是否有额外的校验能力做相关方面的验证
1.1.1 鉴权(Authentication)
K8s Apiserver提供三种客户端身份认证:
- HTTPS 证书认证:基于CA证书签名的数字证书认证(kubeconfig),例如./kube/config
- HTTP Token认证:通过一个Token来识别用户(serviceaccount),例如加入集群、Dashboard的Token
- HTTP Base认证:用户名+密码的方式认证(1.19版本弃用)
1.1.2 授权(Authorization)
RBAC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。
RBAC根据API请求属性,决定允许还是拒绝。
比较常见的授权维度:
- user:用户名
- group:用户分组
- 资源,例如pod、deployment
- 资源操作方法:get,list,create,update,patch,watch,delete
- 命名空间
- API组
1.1.3 准入控制(Admission Control)
Adminssion Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控 制器插件的检查,检查不通过,则拒绝请求。
- 启用一个准入控制器:
kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...
- 关闭一个准入控制器:
kube-apiserver --disable-admission-plugins=PodNodeSelector,AlwaysDeny ...
- 查看默认启用:
kubectl exec kube-apiserver-k8s-master -n kube-system -- kube-apiserver -h | grep enable-admission-plugins
补充:方便用于可以自定义、扩展访问时的检查控制功能;对k8s功能做一个解耦
## 查看准入控制器
[root@k8s-master-1-71 ~]# vi /etc/kubernetes/manifests/kube-apiserver.yaml
1.2 基于角色的权限访问控制:RBAC
RBAC(Role-Based Access Control,基于角色的访问控制), 是K8s默认授权策略,并且是动态配置策略(修改即时生效)
主体(subject)
- User:用户
- Group:用户组
- ServiceAccount:服务账号
角色
- Role:授权特定命名空间的访问权限
- ClusterRole:授权所有命名空间的访问权限
角色绑定
- RoleBinding:将角色绑定到主体(即subject)
- ClusterRoleBinding:将集群角色绑定到主体
注:RoleBinding在指定命名空间中执行授权,ClusterRoleBinding在集群范围执行授权。
RBAC 的工作原理
定义角色:
- 使用 Role 或 ClusterRole 定义权限规则。
- 例如,定义一个 Role 允许用户查看和列出 Pod。
绑定角色:
- 使用 RoleBinding 将 Role 绑定到特定用户、用户组或服务账户。
- 例如,将 pod-reader 角色绑定到用户 jane,使其在 default 命名空间中拥有对 Pod 的读取权限。
权限验证:
- 当用户尝试执行操作时,Kubernetes 会检查相关的 RoleBinding 和 ClusterRoleBinding。
- 根据绑定的角色和规则,决定是否允许该操作。
1)角色相关命令:
① role角色:
- 创建role:kubectl create role <role-name> --verb=<操作方法> --resource=<资源> [-n namespace]
例如:创建名称为 “pod-reader” 的 Role 对象,允许用户对 Pods 执行 get、watch 和 list 操作
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
- 查看role:kubectl get role [-n namespace]
- 删除role:kubectl delete role <role-name> [-n namespace]
② clusterrole角色:
- 创建clusterrole:kubectl create clusterrole <clusterrole-name> --verb=<操作方法> --resource=<资源>
例如:创建名称为 “pod-reader” 的 ClusterRole 对象,允许用户对 Pods 对象执行 get、 watch 和 list 操作
kubectl create clusterrole pod-reader --verb=get,list,watch --r