Kubelet 身份验证/授权
概述
kubelet 的 HTTPS 端点暴露了访问不同敏感度数据的 API,并允许您对节点和容器内的操作执行不同级别的权限。
本文档描述了如何对 kubelet 的 HTTPS 端点的访问进行身份验证和授权。
Kubelet 身份验证
默认情况下,未被其他配置的身份验证方法拒绝的对 kubelet HTTPS 端点的请求被视为匿名请求,并赋予用户名 system:anonymous 和组 system:unauthenticated。
要禁用匿名访问并向未经身份验证的请求发送 401 Unauthorized 响应
- 使用
--anonymous-auth=false标志启动 kubelet
要启用 kubelet HTTPS 端点的 X509 客户端证书身份验证
- 使用
--client-ca-file标志启动 kubelet,提供一个 CA 捆绑包以使用其验证客户端证书 - 使用
--kubelet-client-certificate和--kubelet-client-key标志启动 apiserver - 有关更多详细信息,请参阅 apiserver 身份验证文档
要启用 API bearer token(包括 service account token)用于对 kubelet HTTPS 端点进行身份验证
- 确保 API 服务器中启用了
authentication.k8s.io/v1API 组 - 使用
--authentication-token-webhook和--kubeconfig标志启动 kubelet - kubelet 调用配置的 API 服务器上的
TokenReviewAPI,以确定 bearer token 中的用户信息
Kubelet 授权
任何成功通过身份验证的请求(包括匿名请求)然后都会被授权。默认授权模式为 AlwaysAllow,它允许所有请求。
有很多可能的原因需要细分对 kubelet API 的访问
- 启用了匿名身份验证,但应限制匿名用户调用 kubelet API 的能力
- 启用了 bearer token 身份验证,但应限制任意 API 用户(如 service account)调用 kubelet API 的能力
- 启用了客户端证书身份验证,但只有由配置的 CA 签名的部分客户端证书才应允许使用 kubelet API
要细分对 kubelet API 的访问,请将授权委托给 API 服务器
- 确保 API 服务器中启用了
authorization.k8s.io/v1API 组 - 使用
--authorization-mode=Webhook和--kubeconfig标志启动 kubelet - kubelet 调用配置的 API 服务器上的
SubjectAccessReviewAPI,以确定是否授权每个请求
kubelet 使用与 apiserver 相同的 请求属性 方法来授权 API 请求。
动词由传入请求的 HTTP 动词确定
| HTTP 动词 | 请求动词 |
|---|---|
| POST | create |
| GET, HEAD | get |
| PUT | update |
| PATCH | patch |
| DELETE | delete |
资源和子资源由传入请求的路径确定
| Kubelet API | 资源 | 子资源 |
|---|---|---|
| /stats/* | nodes | stats |
| /metrics/* | nodes | metrics |
| /logs/* | nodes | log |
| /spec/* | nodes | spec |
| /checkpoint/* | nodes | checkpoint |
| 所有其他 | nodes | proxy |
警告
nodes/proxy 权限授予访问所有其他 kubelet API 的权限。这包括可用于在节点上运行的任何容器中执行命令的 API。
其中一些端点通过 HTTP GET 请求支持 Websocket 协议,这些协议使用 get 动词进行授权。这意味着 get 权限 nodes/proxy 不是只读权限,并授权在节点上运行的任何容器中执行命令。
命名空间和 API 组属性始终为空字符串,资源名称始终是 kubelet 的 Node API 对象的名称。
在这种模式下运行时,请确保通过传递给 apiserver 的 --kubelet-client-certificate 和 --kubelet-client-key 标志标识的用户已获得以下属性的授权
- verb=*, resource=nodes, subresource=proxy
- verb=*, resource=nodes, subresource=stats
- verb=*, resource=nodes, subresource=log
- verb=*, resource=nodes, subresource=spec
- verb=*, resource=nodes, subresource=metrics
细粒度授权
Kubernetes v1.33 [beta](默认启用)当启用特性门控 KubeletFineGrainedAuthz 时,kubelet 在回退到 /pods、/runningPods、/configz 和 /healthz 端点的 proxy 子资源之前,会执行细粒度检查。资源和子资源由传入请求的路径确定
| Kubelet API | 资源 | 子资源 |
|---|---|---|
| /stats/* | nodes | stats |
| /metrics/* | nodes | metrics |
| /logs/* | nodes | log |
| /pods | nodes | pods, proxy |
| /runningPods/ | nodes | pods, proxy |
| /healthz | nodes | healthz, proxy |
| /configz | nodes | configz, proxy |
| 所有其他 | nodes | proxy |
当启用特性门控 KubeletFineGrainedAuthz 时,请确保通过传递给 API 服务器的 --kubelet-client-certificate 和 --kubelet-client-key 标志标识的用户已获得以下属性的授权
- verb=*, resource=nodes, subresource=proxy
- verb=*, resource=nodes, subresource=stats
- verb=*, resource=nodes, subresource=log
- verb=*, resource=nodes, subresource=metrics
- verb=*, resource=nodes, subresource=configz
- verb=*, resource=nodes, subresource=healthz
- verb=*, resource=nodes, subresource=pods
如果使用 RBAC 授权,启用此门控还确保内置的 system:kubelet-api-admin ClusterRole 已更新为具有访问上述所有子资源的权限。