Kubelet 身份验证与授权
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
Kubelet 身份验证
默认情况下,未被其他配置的身份验证方法拒绝的对 kubelet HTTPS 端点的请求被视为匿名请求,并被赋予 用户名 system:anonymous 和 组 system:unauthenticated。
3 种身份验证 方法 是:
- 匿名(默认):使用设置参数
--anonymous-auth=true或配置:
"authentication": {
"anonymous": {
"enabled": true
},
- Webhook: 这将 启用 kubectl API bearer tokens 作为授权(任何有效的令牌都将有效)。允许它:
- 确保在 API 服务器中启用
authentication.k8s.io/v1beta1API 组 - 使用
--authentication-token-webhook和--kubeconfig标志启动 kubelet,或使用以下设置:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},
Note
kubelet 在配置的 API 服务器上调用
TokenReviewAPI 以 确定用户信息 从承载令牌
- X509 客户端证书: 允许通过 X509 客户端证书进行身份验证
- 有关更多详细信息,请参见 apiserver authentication documentation
- 使用
--client-ca-file标志启动 kubelet,提供一个 CA 包以验证客户端证书。或者使用配置:
"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}
Kubelet 授权
任何成功认证的请求(包括匿名请求)随后会被授权。默认授权模式是**AlwaysAllow,这允许所有请求**。
然而,另一个可能的值是**webhook(这就是你大多数情况下会发现的**)。此模式将检查已认证用户的权限以允许或拒绝某个操作。
Warning
请注意,即使启用了匿名认证,匿名访问可能没有任何权限来执行任何操作。
通过 webhook 进行授权可以使用**参数 --authorization-mode=Webhook**或通过配置文件进行配置:
"authorization": {
"mode": "Webhook",
"webhook": {
"cacheAuthorizedTTL": "5m0s",
"cacheUnauthorizedTTL": "30s"
}
},
kubelet 在配置的 API 服务器上调用 SubjectAccessReview API 以 确定 每个请求是否 被授权。
kubelet 使用与 apiserver 相同的 请求属性 方法来授权 API 请求:
- 操作
| HTTP 动词 | 请求动词 |
|---|---|
| POST | 创建 |
| GET, HEAD | 获取(针对单个资源),列出(针对集合,包括完整对象内容),监视(针对单个资源或资源集合的监视) |
| PUT | 更新 |
| PATCH | 补丁 |
| DELETE | 删除(针对单个资源),删除集合(针对集合) |
- 与 Kubelet API 交互的 资源 始终是 节点,子资源 从传入请求的路径中 确定:
| Kubelet API | 资源 | 子资源 |
|---|---|---|
| /stats/* | nodes | stats |
| /metrics/* | nodes | metrics |
| /logs/* | nodes | log |
| /spec/* | nodes | spec |
| 所有其他 | nodes | proxy |
例如,以下请求试图在没有权限的情况下访问 kubelet 的 pods 信息:
curl -k --header "Authorization: Bearer ${TOKEN}" 'https://172.31.28.172:10250/pods'
Forbidden (user=system:node:ip-172-31-28-172.ec2.internal, verb=get, resource=nodes, subresource=proxy)
- 我们得到了一个 Forbidden,所以请求 通过了身份验证检查。如果没有,我们只会收到一个
Unauthorised消息。 - 我们可以看到 用户名(在这种情况下来自令牌)
- 检查 资源 是 nodes,而 子资源 是 proxy(这与之前的信息是合理的)
References
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
HackTricks Cloud

