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

Kubelet 身份验证

来自文档:

默认情况下,未被其他配置的身份验证方法拒绝的对 kubelet HTTPS 端点的请求被视为匿名请求,并被赋予 用户名 system:anonymoussystem:unauthenticated

3 种身份验证 方法 是:

  • 匿名(默认):使用设置参数 --anonymous-auth=true 或配置:
"authentication": {
"anonymous": {
"enabled": true
},
  • Webhook: 这将 启用 kubectl API bearer tokens 作为授权(任何有效的令牌都将有效)。允许它:
  • 确保在 API 服务器中启用 authentication.k8s.io/v1beta1 API 组
  • 使用 --authentication-token-webhook--kubeconfig 标志启动 kubelet,或使用以下设置:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},

Note

kubelet 在配置的 API 服务器上调用 TokenReview API确定用户信息 从承载令牌

  • 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/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslog
/spec/*nodesspec
所有其他nodesproxy

例如,以下请求试图在没有权限的情况下访问 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