控制对 Kubernetes API 的访问
本页面概述了如何控制对 Kubernetes API 的访问。
用户使用 kubectl、客户端库或发出 REST 请求来访问 Kubernetes API。人类用户和 Kubernetes 服务帐户 都可以被授权访问 API。当请求到达 API 时,它会经历几个阶段,如下图所示
传输安全
默认情况下,Kubernetes API 服务器在第一个非本地主机网络接口上的 6443 端口上侦听,并受 TLS 保护。在典型的生产 Kubernetes 集群中,API 在 443 端口上提供服务。可以使用 --secure-port 更改端口,并使用 --bind-address 标志更改侦听 IP 地址。
API 服务器会提供一个证书。该证书可以使用私有证书颁发机构 (CA) 进行签名,或者基于链接到公认的 CA 的公钥基础设施。可以使用 --tls-cert-file 和 --tls-private-key-file 标志设置证书和相应的私钥。
如果你的集群使用私有证书颁发机构,则需要在客户端的 ~/.kube/config 中配置该 CA 证书的副本,以便你可以信任连接并确信它没有被拦截。
你的客户端可以在此阶段提供 TLS 客户端证书。
身份验证
建立 TLS 后,HTTP 请求将移至身份验证步骤。这在图中显示为步骤 1。集群创建脚本或集群管理员会配置 API 服务器以运行一个或多个身份验证器模块。有关身份验证器的详细描述,请参阅身份验证。
身份验证步骤的输入是整个 HTTP 请求;但是,它通常会检查标头和/或客户端证书。
身份验证模块包括客户端证书、密码、纯令牌、引导令牌和 JSON Web 令牌(用于服务帐户)。
可以指定多个身份验证模块,在这种情况下,会按顺序尝试每个模块,直到其中一个模块成功。
如果无法对请求进行身份验证,则会使用 HTTP 状态代码 401 拒绝该请求。否则,用户会被验证为特定的 username,并且用户名可供后续步骤在其决策中使用。某些身份验证器还会提供用户的组成员身份,而其他身份验证器则不提供。
虽然 Kubernetes 使用用户名进行访问控制决策并在请求日志中记录,但它没有 User 对象,也不会在其 API 中存储用户名或其他有关用户的信息。
授权
在请求被验证为来自特定用户之后,必须授权该请求。这在图中显示为步骤 2。
请求必须包含请求者的用户名、请求的操作以及受该操作影响的对象。如果现有策略声明用户有权完成请求的操作,则该请求将被授权。
例如,如果 Bob 具有以下策略,则他只能读取 projectCaribou 命名空间中的 Pod
{
"apiVersion": "abac.authorization.kubernetes.io/v1beta1",
"kind": "Policy",
"spec": {
"user": "bob",
"namespace": "projectCaribou",
"resource": "pods",
"readonly": true
}
}
如果 Bob 发出以下请求,则该请求将被授权,因为他被允许读取 projectCaribou 命名空间中的对象
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"resourceAttributes": {
"namespace": "projectCaribou",
"verb": "get",
"group": "unicorn.example.org",
"resource": "pods"
}
}
}
如果 Bob 请求写入 (create 或 update) projectCaribou 命名空间中的对象,则他的授权将被拒绝。如果 Bob 请求读取 (get) 另一个命名空间(例如 projectFish)中的对象,则他的授权将被拒绝。
Kubernetes 授权要求你使用常见的 REST 属性来与现有的组织级或云提供商级访问控制系统进行交互。使用 REST 格式非常重要,因为这些控制系统可能会与 Kubernetes API 之外的其他 API 交互。
Kubernetes 支持多个授权模块,例如 ABAC 模式、RBAC 模式和 Webhook 模式。当管理员创建集群时,他们会配置应在 API 服务器中使用的授权模块。如果配置了多个授权模块,则 Kubernetes 会检查每个模块,如果任何模块授权请求,则可以继续执行该请求。如果所有模块都拒绝该请求,则该请求将被拒绝(HTTP 状态代码 403)。
要了解有关 Kubernetes 授权的更多信息,包括有关使用受支持的授权模块创建策略的详细信息,请参阅授权。
准入控制
准入控制模块是可以修改或拒绝请求的软件模块。除了授权模块可用的属性之外,准入控制模块还可以访问正在创建或修改的对象的内容。
准入控制器对创建、修改、删除或连接(代理)到对象的请求进行操作。准入控制器不对仅读取对象的请求进行操作。配置多个准入控制器时,会按顺序调用它们。
这在图中显示为步骤 3。
与身份验证和授权模块不同,如果任何准入控制器模块拒绝,则会立即拒绝该请求。
除了拒绝对象之外,准入控制器还可以为字段设置复杂的默认值。
有关可用的准入控制模块的描述,请参阅准入控制器。
一旦请求通过所有准入控制器,就会使用相应 API 对象的验证例程对其进行验证,然后写入对象存储(显示为步骤 4)。
审计
Kubernetes 审计提供了一组与安全相关的按时间顺序排列的记录,记录了集群中的操作序列。集群会对用户、使用 Kubernetes API 的应用程序以及控制平面本身生成的活动进行审计。
有关详细信息,请参阅审计。
下一步
阅读有关身份验证、授权和 API 访问控制的更多文档
您可以了解
- Pod 如何使用密钥来获取 API 凭据。