译自 https://kubernetes.io/docs/admin/kubelet-authentication-authorization/
Overview
通过kubelet暴露的https api接口,可以访问到不同的“敏感”数据,并且允许你在节点和容器内执行不同级别的操作。
本篇文档描述了kublet https 断点如何鉴权。
Kubelet 认证
默认情况下,到kubelet HTTPS endpoints
且没有被其他配置的认证方法拒绝的请求被视为匿名请求。对于匿名请求会给定system:anonymous
的用户名和system:unauthenticated
用户组。
禁止匿名用户访问,对不可靠的请求返回401 Unauthorized
:
- 启动kublet的时候添加--anonymous-auth=false
参数
开启X509
客户端证书认证:
- 添加启动参数--client-ca-file
, 并提供一个验证客户端证书的CA。
- 启动apiserver
时需添加--kubelet-client-certificate
和 --kube-client-key
参数
- 详情参考 apiserver authentication documentation
要启动API承载令牌(包括serviceaccount
账户令牌)以用于对kublet的HTTPS 端点进行身份验证:
- 确保authentication.k8s.io/v1beta1
API组在apiserver中被启用
- 以--authenticatioin-token-webhook
, --kubeconfig
以及--require-kubeconfig
参数启动kubelet
- kubelet调用事先在apiserver中定义好的TokenReview
API以确定来自承载令牌的用户信息
Note:
--require-kubeconfig
在1.8中已经过时,未来的版本会移除该参数
Kubelet 授权
每个通过身份认证的请求(包括匿名请求)都会被授权。默认的授权模式是AlwaysAllow
, 这会放行所有的请求。
出于某些原因,可以将对kubelet api的访问进行细分:
- 开启anonymous 授权, 但是匿名用户能够访问的kubelet API应该做限制
- 开启承载令牌认证,但任意API用户(如服务帐户)调用kubelet API的能力应该是有限的。
- 客户端证书身份验证已启用,但只有部分由已配置CA签名的客户端证书应被允许使用kubelet API
要细分对kubelet API的访问,请将授权委托给apiserver:
- 确保authentication.k8s.io/v1beta1
API组在apiserver中被启用
- 以--authenticatioin-token-webhook
, --kubeconfig
以及--require-kubeconfig
参数启动kubelet
- Kubelet在配置的APIserver上调用SubjectAccessReview
API来确定每个请求是否被授权
kubelet使用与apiserver相同的请求属性方法来授权API请求。
请求动作由http的请求方法确定:
HTTP verb | request verb |
---|---|
POST | create |
GET,HEAD | get |
PUT | update |
PATCH | patch |
DELETE | delete |
资源和子资源是根据传入请求的路径确定的:
Kubelet API | resource | subresource |
---|---|---|
/stats/* | nodes | stats |
/metrics/* | nodes | metrics |
/logs/* | nodes | log |
/spec/* | nodes | spec |
all others | nodes | proxy |
namespace和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