概述
任何请求访问k8s的kube-apiserver时都要依次经历这三个阶段:
- 认证(Authentication,有时简写成AuthN):做身份校验,解决“你是谁?”
- 授权(Authorization,有时简写AuthZ):做权限管控,解决“你能干什么?”,给予访问k8s集群中哪些资源以及做哪些操作的权利,比如你是否能创建一个pod是否能删除一个pod。
- 准入控制(Admission Control):由一组控制逻辑级联而成,对对象进行拦截校验、更改等操作。比如在一个名为test的ns中创建一个pod,如果这个ns不存在那集群要不要自动创建出来?或者直接拒绝该请求?
当然如果你的k8s集群开启了HTTP访问,就不再需要认证和授权流程了,显然这种配置风险太大。
认证
1 | 在认证阶段最重要的就是身份(Identity),我们需要从中获取到用户的相关信息。 |
x509证书
1 | k8s使用mTLS进行身份验证,通过解析请求使用的 客户端(client)证书,将其中的 subject 的通用名称(Common Name)字段(例如"/CN=bob")作为用户名。 |
Token
1 | token又分为如下几种类型: |
ServiceAccount Token
1 | 这是 Kubernetes 中使用最为广泛的认证方式之一,主要用来给 Pod 提供访问 APIServer 的权限,通过使用 Volume 的方式挂载到 Pod 中。 |
授权
1 | k8s内部有多种授权模块,比如 Node、ABAC、RBAC、Webhook。 |
ABAC
1 | ABAC (Attribute Based Access Control) 是一种基于属性的访问控制,可以给 APIServer 指定一个 JSON 文件--authorization-policy-file=SOME_FILENAME,该文件描述了一组属性组合策略,比如: |
RBAC
1 | 相对而言,RBAC使用起来就非常方便。 |
1 | ClusterRole 除了可以定义集群方位的资源外,比如 Node,还可以定义跨 namespace 的资源访问,比如你想访问所有命名空间下面的 Pod,就可以这么定义: |
1 | RBAC 中定义这些角色包含了一组权限规则,这些规则纯粹以累加形式组合,没有互斥的概念。 |
准入控制
1 | 准入控制可以帮助我们在 APIServer 真正处理对象前做一些校验以及修改的工作。 |
小结
1 | 作为一个企业级的容器管理调度平台,Kubernetes 在 Auth 方面设计得很完善,支持多种后端身份认证授权系统,比如 LDAP (Lightweight Directory Access Protocol)、Webhook 等。 |