控制对 Kubernetes API 的访问
本页面概述了如何控制对 Kubernetes API 的访问。
用户使用 kubectl
、客户端库或通过发送 REST 请求来访问 Kubernetes API。人类用户和 Kubernetes 服务账号都可以被授权访问 API。当请求到达 API 时,它会经历几个阶段,如下图所示。
传输安全
默认情况下,Kubernetes API 服务器在第一个非本地主机网络接口上的 6443 端口监听,受 TLS 保护。在典型的生产 Kubernetes 集群中,API 在 443 端口提供服务。端口可以通过 --secure-port
标志修改,监听 IP 地址可以通过 --bind-address
标志修改。
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 如何使用 Secret 获取 API 凭据。