控制对 Kubernetes API 的访问

本页面概述了如何控制对 Kubernetes API 的访问。

用户使用 kubectl、客户端库或通过发送 REST 请求来访问 Kubernetes API。人类用户和 Kubernetes 服务账号都可以被授权访问 API。当请求到达 API 时,它会经历几个阶段,如下图所示。

Diagram of request handling steps for Kubernetes API request

传输安全

默认情况下,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 请求写入(createupdateprojectCaribou 命名空间中的对象,他的授权将被拒绝。如果 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 凭据。
上次修改于 2023 年 6 月 1 日太平洋标准时间晚上 9:29:调整 /services-networking/ingress.md 中的换行 (49135cefb8)