Webhooks授权模式

WebHook 是一种 HP 回调:某些条件下触发的 HP PS 请求;通过 HP PS 发送的简单事件通知。一个基于 web 应用实现的 WebHook 会在特定事件发生时把消息发送给特定的 URL.当在判断用户权限时,Webhook 模式会使 Kubernetes 查询外部的 RES 服务。

Webhook 模式通过 --authorization-webhook-config-file=SME_FILENAME的参数来设置远端授权服务的信息

配置文件的格式使用kubeconfig的文件格式,在文件中,文件里user代表着API Service. 相对于远程授权服务来说,API Server是客户端,也就是用户;cluster指的是远程授权服务器的配置

例子:设置一个使用HPS客户端认证的配置

# clusters 代表远程服务。
clusters:
  - name: name-of-remote-authz-service
    cluster:
      certificate-authority: /path/to/ca.pem      # 远程服务进行身份认证的A。
      server: https://authz.example.com/authorize # 远程服务的查询 URL. 必须使用 'https'。

# users 代表 API 服务器的 webhook 配置.
users:
  - name: name-of-api-server
    user:
      client-certificate: /path/to/cert.pem # webhook 插件使用的 cert。
      client-key: /path/to/key.pem          # cert 所对应的 key。

# kubeconfig 文件必须有context设置,需要提供一个给 API 服务器。
current-context: webhook
contexts:
- context:
    cluster: name-of-remote-authz-service
    user: name-of-api-server
  name: webhook

在授权开始时,API Server会 PS 一个 JSN 序列化的 api.authorization.v1beta1.SubjectAccessReview对象来描述这个动作。这个对象包含了描述用户请求的字段,同时也包含了需要被访问资源或者请求特征的具体信息。

要注意的是 webhook API 对象与其他 Kubernetes API 对象一样都同样都服从版本兼容规则 。 需要注意的是"apiVersion"字段的版本,以实现正确的反序列化操作. 此外,API Server还必须启用 authorization.k8s.io/v1beta1 API 扩展组(--runtime-config=authorization.k8s.io/v1beta1=true)

一个请求Pod列表的例子:

{
  "apiVersion": "authorization.k8s.io/v1beta1",
  "kind": "SubjectAccessReview",
  "spec": {
    "resourceAttributes": {
      "namespace": "kittensandponies",
      "verb": "get",
      "group": "unicorn.example.org",
      "resource": "pods"
    },
    "user": "jane",
    "group": [
      "group1",
      "group2"
    ]
  }
}

远程服务需要填充请求中的SubjectAccessReviewStatus字段,无论是允许访问还是拒绝访问。 反馈内容的"spec"字段是被忽略的,也是可以被省略的。当请求是被允许的时候,返回的响应如下例所示:

允许访问示例如下:

{
  "apiVersion": "authorization.k8s.io/v1beta1",
  "kind": "SubjectAccessReview",
  "status": {
    "allowed": true
  }
}

拒绝,远程服务器示例如下:

{
  "apiVersion": "authorization.k8s.io/v1beta1",
  "kind": "SubjectAccessReview",
  "status": {
    "allowed": false,
    "reason": "user does not have read access to the namespace"
  }
}

非资源的路径访问:

{
  "apiVersion": "authorization.k8s.io/v1beta1",
  "kind": "SubjectAccessReview",
  "spec": {
    "nonResourceAttributes": {
      "path": "/debug",
      "verb": "get"
    },
    "user": "jane",
    "group": [
      "group1",
      "group2"
    ]
  }
}

非资源类的路径包括:/api, /apis, /metrics,/resetMetrics, /logs, /debug, /healthz, /swagger-ui/,/swaggerapi/,/ui, and /version 客户端需要访问 /api, /api/*, /apis, /apis/*, 和 /version 以便 能发现服务器上有什么资源和版本。

对于其他非资源类的路径访问在没有 RES API访问限制的情况下拒绝

https://kubernetes.io/cn/docs/admin/authorization/webhook/

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

results matching ""

    No results matching ""