Kubernetes API 的访问控制
翻译自官方文档
用户使用 kubectl 或 REST 请求访问 API、客户端库。人类用户和service account 二者可以授权访问 API。当请求到达API,它经过若干步骤。
传输安全
典型的 Kubernetes 集群中,API Server 位于6443端口。API Server 出示证书。此证书通常是自签名的,所以用户机器上的$USER/.kube/config
通常包含API Server证书的根证书,在指定的时候用这个根证书来替代系统的默认根证书。这个证书通常在你创建集群的时候自动写入$USER/.kube/config
。如果集群有多个用户,那么创建者需要将证书分享给他们。
认证
当TLS连接建立以后,HTTP请求进入认证步骤。如上图中的第1步。集群的创建脚本或集群管理员配置API Server运行一个或多个认证模块。这些模块在这里详述。
认证步骤的输入是整个HTTP请求,然而,通常只检查头部和/或客户端证书。
认证模块包括客户端证书、密码、明文Token、自助Token和JWT Token(service account使用)。
可以指定多个认证模块,此时每一个模块按顺序尝试认证,直到其中之一通过认证。
如果请求不能通过认证,它被HTTP状态码401拒绝。否则,用户被认证为一个指定的username
,用户名可用于后续步骤中进行决策。有些认证者也提供用户组认证。
尽管Kubernetes使用username
来进行访问控制决策和将请求记录进日志,但它没有用户对象,也没有在其对象存储中存储用户名或其他有关用户的信息。
授权
请求通过认证以后必须被授权。如上图中的第2步。
请求必须包含请求者的用户名,请求的动作和动作影响的对象。如果有已存在的策略声明这个用户有权完成请求的动作,请求就被授权了。
例如,如果Bob拥有以下策略,那么他只能读取projectCaribou
命名空间的pod信息:
{
"apiVersion": "abac.authorization.kubernetes.io/v1beta1",
"kind": "Policy",
"spec": {
"user": "bob",
"namespace": "projectCaribou",
"resource": "pods",
"readonly": true
}
}
如果Bob做了如下请求,这个请求时被授权允许的:
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"resourceAttributes": {
"namespace": "projectCaribou",
"verb": "get",
"group": "unicorn.example.org",
"resource": "pods"
}
}
}
如果Bob请求写入该命名空间的对象,他的授权被拒绝。如果他请求读取其他命名空间的资源也被拒绝。
Kubernetes要求使用REST属性与现有的组织(根证书里的O)或云提供商访问控制系统交互。使用REST格式很重要,因为这些控制系统可能与Kubernetes API以外的其他API交互。
Kubernetes支持多种授权模块如ABAC模式、RBAC模式和Webhook模式。管理员创建集群的时候配置API Server采用的授权模块。如果配置了多个,Kubernetes会检查每一个,任何一个模块授权了请求,请求就可以进行。如果所有模块都拒绝了请求,纳闷请求就被禁止了。(HTTP状态码403)
更多关于Kubernetes授权,详见授权概述
准入控制
准入控制模块是可以修改或者拒绝请求的软件模块。除了授权模块可用的属性,准入控制模块可以访问正在被创建或更新的对象。它们作用于正在创建,删除,更新或连接(代理)的对象,但不读取。
可以配置多个准入控制器,按序逐个调用。
如图中第3步所示。
不同于认证和授权模块,如果被任何一个准入控制模块拒绝了,那么请求就立即被拒绝。
除了拒绝对象外,准入控制器还可以为字段设置复杂的默认值。
可用的准入控制模块在这里描述。
请求通过所有准入控制器后,将使用相应API对象的验证例程对其进行验证,然后写入对象存储(图中第4步)。
API Server 的IP和端口
API Server 实际上可以服务于两个端口:
- 本地端口:
- 用于测试和bootstrap,以及其他主节点的组件与API server 通信
- 非TLS
- 默认端口是8080,
--insecure-port
参数修改 - 默认IP是 localhost,
--insecure-bind-address
参数修改 - 请求绕过认证和授权模块
- 请求被准入控制模块处理
- 受需要访问主机的保护
- 安全端口
- 尽可能使用
- 使用TLS。–tls-cert-file 参数和 --tls-private-key-file 参数设置证书
- 默认端口6443,–secure-port参数修改
- 默认IP是第一个非localhost的网卡的IP,–bind-address修改
- 请求被认证和授权模块处理
- 请求被准入控制模块处理
- 认证和授权模块运行