2.3.3 鉴权
在 Kubernetes 中,请求在到达鉴权步骤之前要经过认证。鉴权功能模块决定是接受还是拒绝请求。一个请求必须满足一些策略要求才能进入下一步,默认情况下请求是被禁 止的。APIServer 支持多种授权机制,如果开启了多个功能,就按照顺序执行。如果执行过程中有任何一个鉴权模块拒绝或接受请求,那么会立即返回,并且不会与其他模块协商; 如果所有的模块都对请求没有意见,那么请求会被拒绝。如果请求被拒绝,会返回一个403的状态码。
Kubernetes 提供了以下几种常见的鉴权方式。
(1) Node:一个专用的鉴权组件,为Kubelet 发出的请求提供鉴权操作。
(2) ABAC:基于属性的访问控制(ABAC),定义了一种访问控制范例,通过使用组合属性的策略,将访问权限授予用户。 这些策略可以使用任何类型的属性(用户属性、资源属性、对象、环境属性等)。
(3) RBAC:基于角色的访问控制(RBAC),是一种基于企业内各个用户的角色来调整访问计算机或网络资源的方法。 在这种情况下,访问权限是指单个用户执行特定任务(如查看、创建或修改文件)的能力。
(4) WebHook:WebHook是 HTTP回调模式,它会向远程服务器发送POST请求进行鉴权。
在 APIServer 的启动参数中,可以配置要使用的鉴权模块,可以选择一个或多个,运行时按照顺序检查,越靠前的模块优先级越高。
(1)--authorization-mode=ABAC:基于属性的访问控制(ABAC)模式允许使用本 地文件配置策略。
(2)--authorization-mode=RBAC:基于角色的访问控制(RBAC)模式允许使用KubernetesAPI创建和存储策略。
(3)--authorization-mode=WebHook:WebHook是一种 HTTP 回调模式,允许使用远程 REST端点管理鉴权。
(4)--authorization-mode=Node:节点鉴权是一种特殊用途的鉴权模式,专门对Kubelet发出的 API 请求执行鉴权。
(5)--authorization-mode=AlwaysDeny:此标识阻止所有请求,仅将此标识用于测试。
(6)--authorization-mode=AlwaysAllow:此标识允许所有请求,仅在不需要 API请求 的鉴权时才使用此标识。
1. RBAC鉴权
RBAC 鉴权器是一种根据企业内各个用户的角色来调整访问计算机或网络资源的方法。用户可以通过 APIServer使用rbac.authorization.k8s.ioAPI 组下的资源对象动态地配置规则。API对象:RBAC的 API声明了4种对象,可以使用 Kubectl像创建Pod 一样创建规则。
(1) Role和 ClusterRole
RBAC中的 Role和 ClusterRole包含了一组权限规则, 规则内容定义了允许用户进行的操作权限,用户可以设置多条规则,规则定义的内容取并集。Role 在一个特定的Namespace 中设置规则,Role 属于某个特定的Namespace。相反,ClusterRole 不是一个Namespace范围的资源。为什么会有Role和 ClusterRole,是因为 Kubernetes的资源对象可能是 Namespace范围内的也可能是非Namespace范围内的。
代码清单2-69是 Role示例。
apiVersion:rbac.authorization.k8s.io/v1kind:Role
metadata:
name:ns-adminnamespace:myspace
rules:
- apiGroups:
-[""]
resources:
- pods
- pods/log# 对⼦资源的引⽤
verbs:
-
["get","watch","list"]
ClusterRole是集群范围的,它可以是集群范围的资源、非资源端点或是跨Names- pace 访问的 Namespace 作用域的资源,代码清单 2-70是 Coredns的 ClusterRole 示例。
apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRole
metadata:
name:system:corednsrules:
- apiGroups:
-""
resources:
- endpoints
- services
- pods
- namespacesverbs:
- list
- watch
- apiGroups:
-""
resources:
- nodesverbs:
-
get