欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kubernetes API 的访问控制

程序员文章站 2024-03-19 13:27:40
...

翻译自官方文档

用户使用 kubectl 或 REST 请求访问 API、客户端库。人类用户和service account 二者可以授权访问 API。当请求到达API,它经过若干步骤。
Kubernetes 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 实际上可以服务于两个端口:

  1. 本地端口:
    • 用于测试和bootstrap,以及其他主节点的组件与API server 通信
    • 非TLS
    • 默认端口是8080,--insecure-port参数修改
    • 默认IP是 localhost,--insecure-bind-address参数修改
    • 请求绕过认证和授权模块
    • 请求被准入控制模块处理
    • 受需要访问主机的保护
  2. 安全端口
    • 尽可能使用
    • 使用TLS。–tls-cert-file 参数和 --tls-private-key-file 参数设置证书
    • 默认端口6443,–secure-port参数修改
    • 默认IP是第一个非localhost的网卡的IP,–bind-address修改
    • 请求被认证和授权模块处理
    • 请求被准入控制模块处理
    • 认证和授权模块运行