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 持有者令牌(包括服务帐户令牌)用于对 kubelet 的 HTTPS 端点进行身份验证,
- 请确保在 API 服务器中启用了 `authentication.k8s.io/v1beta1` API 组
- 使用 `--authentication-token-webhook` 和 `--kubeconfig` 标志启动 kubelet
- kubelet 将在已配置的 API 服务器上调用 `TokenReview` API,以根据持有者令牌确定用户信息
Kubelet 授权
任何成功通过身份验证的请求(包括匿名请求)都将被授权。默认授权模式为 `AlwaysAllow`,它允许所有请求。
细分对 kubelet API 的访问权限有很多可能的理由
- 启用了匿名身份验证,但应限制匿名用户调用 kubelet API 的能力
- 启用了持有者令牌身份验证,但应限制任意 API 用户(如服务帐户)调用 kubelet API 的能力
- 启用了客户端证书身份验证,但只允许由已配置 CA 签署的部分客户端证书使用 kubelet API
要细分对 kubelet API 的访问权限,请将授权委托给 API 服务器
- 确保在 API 服务器中启用了 `authorization.k8s.io/v1beta1` API 组
- 使用 `--authorization-mode=Webhook` 和 `--kubeconfig` 标志启动 kubelet
- kubelet 将在已配置的 API 服务器上调用 `SubjectAccessReview` API,以确定每个请求是否已授权
kubelet 使用与 apiserver 相同的请求属性方法对 API 请求进行授权。
谓词由传入请求的 HTTP 谓词确定
HTTP 谓词 | 请求谓词 |
---|---|
POST | 创建 |
GET, HEAD | 获取 |
PUT | 更新 |
PATCH | 修补 |
DELETE | 删除 |
资源和子资源由传入请求的路径确定
Kubelet API | 资源 | 子资源 |
---|---|---|
/stats/* | 节点 | 统计信息 |
/metrics/* | 节点 | 指标 |
/logs/* | 节点 | 日志 |
/spec/* | 节点 | 规格 |
/checkpoint/* | 节点 | 检查点 |
所有其他 | 节点 | 代理 |
命名空间和 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
细粒度授权
当启用特性门控 `KubeletFineGrainedAuthz` 时,kubelet 会在回退到 `/pods`、`/runningPods`、`/configz` 和 `/healthz` 端点的 `proxy` 子资源之前执行细粒度检查。资源和子资源由传入请求的路径确定
Kubelet API | 资源 | 子资源 |
---|---|---|
/stats/* | 节点 | 统计信息 |
/metrics/* | 节点 | 指标 |
/logs/* | 节点 | 日志 |
/spec/* | 节点 | 规格 |
/pods | 节点 | pods,proxy |
/runningPods/ | 节点 | pods,proxy |
/healthz | 节点 | healthz,proxy |
/configz | 节点 | configz,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=spec
- verb=*, resource=nodes, subresource=metrics
- verb=*, resource=nodes, subresource=configz
- verb=*, resource=nodes, subresource=healthz
- verb=*, resource=nodes, subresource=pods