一文读懂K8s安全控制:从鉴权到准入控制
客户想要访问K8s集群的API Server,一般需要证书、Token或用户名+密码。实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查。通过配置和管理准入控制器,可以确保所有进入Kubernetes集群的请求都经过严格的审查和验证。最后一步是准入控制插件,这些插件可以对即将持久化的资源进行检查、修改或拒绝。鉴权通过后,API Serve
Kubernetes 安全框架
Kubernetes(K8s)安全控制框架主要由以下三个阶段进行控制,每一个阶段都支持插件方式,通过API Server配置来启用插件:
- Authentication(鉴权):验证用户或系统组件的身份。
- Authorization(授权):确定已经鉴权的用户或系统组件是否有权限执行某个操作。
- Admission Control(准入控制):在对象被持久化到etcd之前对其进行修改或拒绝。
这些步骤确保只有经过认证和授权的请求才能访问和操作Kubernetes资源。
详细流程
-
客户端访问API Server:客户想要访问K8s集群的API Server,一般需要证书、Token或用户名+密码。如果访问Pod,则需要ServiceAccount。
-
认证(Authentication):
- API Server接收到请求后,首先通过插件进行身份验证。
- 例如,使用Token、证书或用户名+密码来验证。
-
授权(Authorization):
- 鉴权通过后,API Server会检查该用户是否有权限执行所请求的操作。
- 例如,用户是否有权限创建、删除或修改某个资源。
-
准入控制(Admission Control):
- 最后一步是准入控制插件,这些插件可以对即将持久化的资源进行检查、修改或拒绝。
- 例如,Pod的安全策略检查。
-
资源操作:
- 经过上述三步之后,请求才会被处理,对应的操作才会在集群中执行。
框架图解
- kubectl, API, UI:这些是访问K8s API Server的工具。
- /api/v1, /apis, /healthz, /logs, /swagger-ui, /metrics:API Server提供的不同接口。
- Authentication, Authorization, Admission Control:三个主要安全控制阶段。
- Pod, Controllers, Service, Storage:实际的K8s资源。
- Etcd Cluster:K8s的后台存储,用于持久化集群状态。
Kubernetes API Server提供的三种客户身份认证方式:
-
HTTPS 证书认证:
- 基于CA证书签名的数字证书认证(kubeconfig)
- 用于确保客户端与服务器之间的通信安全,并验证客户端的身份。
-
HTTP Token认证:
- 通过一个Token来识别用户(serviceaccount)
- 适用于自动化进程或应用程序与Kubernetes交互时的身份验证。
-
HTTP Base认证:
- 用户名+密码的方式认证(1.19版本弃用)
- 较为简单的认证方式,但安全性相对较低,已在Kubernetes 1.19版本后被弃用。
Kubernetes 安全框架:授权 (Authorization)
基于角色的访问控制(RBAC, Role-Based Access Control)在Kubernetes中的授权过程:
-
RBAC:
- 基于角色的访问控制,负责完成授权工作。
- 根据API请求属性,决定允许还是拒绝请求。
-
比较常见的授权维度:
- user:用户名
- group:用户分组
- 资源:例如pod, deployment等
- 资源操作方法:get, list, create, update, patch, watch, delete等
- 命名空间:资源所在的命名空间
- API组:资源所属的API组
通过这些维度,RBAC系统可以精细地控制不同用户或组对集群资源的访问权限。
Kubernetes 安全框架:准入控制 (Admission Control)
准入控制(Admission Control)在Kubernetes中的作用和配置方法:
-
Admission 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
通过配置和管理准入控制器,可以确保所有进入Kubernetes集群的请求都经过严格的审查和验证。
更多推荐
所有评论(0)