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)模式允许使用 Kubernetes API 创建和存储策略。
(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.io API 组下的资源对象动态地配置规则。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 示例。
代码清单 2-69
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: ns-admin namespace: myspace rules: - apiGroups: - [""] resources: - pods - pods/log # 对子资源的引用 verbs: - ["get", "watch", "list"]
ClusterRole 是集群范围的,它可以是集群范围的资源、非资源端点或是跨 Namespace 访问的 Namespace 作用域的资源,代码清单 2-70 是 Coredns 的 ClusterRole 示例。
代码清单 2-70
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:coredns rules: - apiGroups: - "" resources: - endpoints - services - pods - namespaces verbs: - list - watch - apiGroups: - "" resources: - nodes verbs: - get
(2) RoleBinding 和 ClusterRoleBinding
RoleBinding 向用户或一组用户授予在角色中定义的权限。它包含主题列表(用户、组或服务账户),以及对所授予角色的引用。 RoleBinding 授予特定 Namespace 内的权限,而 ClusterRoleBinding 授予在集群范围内访问的权限。
RoleBinding 可 以 引 用 同 一 Namespace 中 的 任 何 Role。 或 者,RoleBinding 可 以引 用 ClusterRole 并 将 该 ClusterRole 绑 定 到 RoleBinding 的 Namespace。 如 果 要 将ClusterRole 绑定到集群中的所有 Namespace,要使用 ClusterRoleBinding。 代码清单 2-71 是一个 RoleBinding 的示例。
代码清单 2-71
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-admin-rolebinding namespace: myspace roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ns-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: kcp
要在集群范围内完成访问权限的鉴权,可以使用一个 ClusterRoleBinding(见代码清单2-72)。
代码清单 2-72
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: system:coredns roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:coredns subjects: - kind: ServiceAccount name: coredns namespace: kube-system
2. Node 鉴权
Node 鉴权是一种专用授权模式,专门对 Kubelet 发出的 API 请求进行鉴权。Node 鉴权允许 Kubelet 对多种资源有操作权限,例如,Services、Endpoints、Nodes、Pods 等资源。使用 system:node 组对 Kubelet 组件进行权限控制,要使用 Node 鉴权,需要在APIServer 启动参数中添加 --authorization-mode=Node,RBAC。
3. WebHook 模式
WebHook 鉴权基于 HTTP 的回调机制,这个模块在做决策时,APIServer 会向远端鉴权服务器发送一个 POST 请求,请求体是一个 SubjectAccessReview 对象,这个对象中包含了描述用户请求的资源,同时也包含了被访问资源或请求的具体信息。要启用WebHook 鉴权,需要添加如下参数。
(1)--authorization-webhook-config-file=:这是一个 kubeconfig 格式的配置文件,user 字段引用的是 apiserver webhook,clusters 字段引用的是远端服务。
(2)--authorization-mode=Node,RBAC:启用 WebHook 鉴权。