API Server授权管理(Authorization)

当客户发起API Server调用时,API Server内核先要进行用户认证,通过授权策略来决定一个API调用是否合法.对合法用户进行授权(Authorization)并且随后在用户访问时进行鉴权.Kubernetes根据所有策略评估所有请求属性,并允许或拒绝请求。某些策略必须允许API请求的所有部分才能继续。这意味着默认情况下拒绝权限。(尽管Kubernetes使用API​​服务器,但是依赖于特定种类对象的特定字段的访问控制和策略由准入控制器处理。

配置多个授权模块时,将按顺序检查每个模块。如果任何授权人批准或拒绝请求,则立即返回该决定,并且不会咨询其他授权人。如果所有模块对请求没有意见,则拒绝该请求。拒绝返回HP状态代码403


API Server目前支持以下几种授权 通过API Server的启动参数"--authorization-mode"设置

  1. AlwaysDent:表示拒绝所有请求,一般用于测试
  2. AlwaysAllow:允许接受所有请求,如果集群里不需要授权流程,表示使用用户配置的授权规则对用户请求进行匹配和控制
  3. ABA (Attribute-Based Access ontrol):基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制
  4. Webhook: 通过调用外部RES服务对用户进行授权
  5. RBA: Role-Based Access ontrol,基于校色的访问控制

API Server 在接受到请求后,会读取该请求中的数据,生成一个访问策略对象,如果该请求中不带某些属性(如Namespace),则这些属性的值将根据属性类型的不同,设置不同的默认值(例如为字符串类型的属性设置一个空字符串;为布尔类型的属性设置false;为数值类型的属性设置0).然后将这个访问策略对象和授权策略文件中的所有访问策略对象逐条匹配,如果至少有一个策略对象被匹配,则该请求将被鉴权通过,否则终止API调用流程,并返回客户端的错误调用码.

授权

当请求被认证为来自某个特定的用户后,该请求需要被授权。 即下图 kube-auth

请求须包含请求者的用户名,请求动作,以及该动作影响的对象。 如果存在相应策略,声明该用户具有进行相应操作的权限,则该请求会被授权。

例如,如果Bob有如下策略,那么他只能够读取projectaribou命名空间下的pod资源:

{
    "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
    "kind": "Policy",
    "spec": {
        "user": "bob",
        "namespace": "projectaribou",
        "resource": "pods",
        "readonly": true
    }
}

如果Bob发起以下请求,那么请求能够通过授权,因为Bob被允许访问 projectaribou命名空间下的对象:

{
  "apiVersion": "authorization.k8s.io/v1beta1",
  "kind": "SubjectAccessReview",
  "spec": {
    "resourceAttributes": {
      "namespace": "projectaribou",
      "verb": "get",
      "group": "unicorn.example.org",
      "resource": "pods"
    }
  }
}

如果Bob对projectaribou命名空间下的对象发起一个写(create或者update)请求,那么它的授权会被拒绝。 如果Bob请求读取(get) 其他命名空间,例如projectFish下的对象,其授权也会被拒绝。

Kubernetes 支持多种授权模块,例如ABA模式,RBA模式和 Webhook模式。 管理员创建集群时,会配置API服务器应用的授权模块。 如果多种授权模式同时被启用,Kubernetes将检查所有模块,如果其中一种通过授权,则请求授权通过。 如果所有的模块全部拒绝,则请求被拒绝(HP状态码403)。

API的端口和IP 上述讨论适用于发送请求到API服务器的安全端口(典型情况)。 实际上API服务器可以通过两个端口提供服务:

默认情况下,API服务器在2个端口上提供HP服务

Localhost Port

  - 用于测试和启动,以及管理节点的其他组件
    (scheduler, controller-manager)与API的交互
  - 没有LS
  - 默认值为8080,可以通过 `--insecure-port` 标记来修改。
  - 默认的IP地址为localhost, 可以通过 `--insecure-bind-address`标记来修改。
  - 请求会 **绕过** 认证和鉴权模块。
  - 请求会被准入控制模块处理。
  - 其访问需要主机访问的权限。

Secure Port

  - 尽可能使用该端口访问
  - 应用 LS。 可以通过 `--tls-cert-file` 设置证书, 通过 `--tls-private-key-file` 设置私钥。
  - 默认值为6443,可以通过 `--secure-port` 标记来修改。
  - 默认IP是首个非本地的网络接口地址,可以通过 `--bind-address` 标记来修改。
  - 请求会经过认证和鉴权模块处理。
  - 请求会被准入控制模块处理。
  - 要求认证和授权模块正常运行。

https://kubernetes.io/cn/docs/admin/accessing-the-api/

Copyright © i4t.com 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-04-26 21:31:27

results matching ""

    No results matching ""