Kubernetes API 的访问控制

翻译自官方文档

用户使用 kubectl 或 REST 请求访问 API、客户端库。人类用户和service account 二者可以授权访问 API。当请求到达API,它经过若干步骤。
image

传输安全

典型的 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步。

请求必须包含请求者的用户名,请求的动作和动作影响的对象。如果有已存在的策略声明这个用户有权完成请求的动作,请求就被授权了。

扫描二维码关注公众号,回复: 12241868 查看本文章

例如,如果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修改
    • 请求被认证和授权模块处理
    • 请求被准入控制模块处理
    • 认证和授权模块运行

猜你喜欢

转载自blog.csdn.net/qq_35753140/article/details/105930817