From 63dc6f48cc91d214d5c34e41344a10117ee1aac4 Mon Sep 17 00:00:00 2001 From: jiajie Date: Tue, 27 Nov 2018 18:59:41 +0800 Subject: [PATCH] zh-trans content/en/docs/reference/access-authn-authz/webhook.md (#11351) * zh-trans content/en/docs/reference/access-authn-authz/webhook.md * Update webhook.md * Update webhook.md --- .../reference/access-authn-authz/webhook.md | 239 ++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 content/zh/docs/reference/access-authn-authz/webhook.md diff --git a/content/zh/docs/reference/access-authn-authz/webhook.md b/content/zh/docs/reference/access-authn-authz/webhook.md new file mode 100644 index 0000000000..d9f4f10662 --- /dev/null +++ b/content/zh/docs/reference/access-authn-authz/webhook.md @@ -0,0 +1,239 @@ +--- +title: Webhook 模式 +content_template: templates/concept +weight: 95 +--- + + + +{{% capture overview %}} + +WebHook 是一种 HTTP 回调:一种当有事情发生时的 HTTP POST 请求;一种基于 HTTP POST 方式完成的事件通知。实现了 WebHook 的 Web 应用会在特定事件发生时通过 POST 向某 URL 发送消息。 +{{% /capture %}} + +{{% capture body %}} + +当 `Webhook` 模式被启用时,Kubernetes 会在需要确定用户权限时访问外部 REST 服务。 + + +## 配置文件格式 + + +`Webhook` 模式需要一个通过 `--authorization-webhook-config-file=SOME_FILENAME` 参数指定的 HTTP 配置文件。 + + +配置文件使用 [kubeconfig](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) 文件格式。在文件中,"users" 对应 API 服务器 webhook,"clusters" 指远程服务。 + + +使用 HTTPS 客户端鉴权的配置文件示例: + + + +```yaml +# Kubernetes API 版本 +apiVersion: v1 +# API 对象类型 +kind: Config +# 远程服务对应的集群。 +clusters: + - name: name-of-remote-authz-service + cluster: + # 远程服务验证所需 CA + certificate-authority: /path/to/ca.pem + # 用来访问远程服务的 URL。必须使用 'https'。不可以包含参数。 + server: https://authz.example.com/authorize + +# API 服务器的 webhook 配置对应的用户 +users: + - name: name-of-api-server + user: + client-certificate: /path/to/cert.pem # webhook 插件所使用的证书 + client-key: /path/to/key.pem # 与证书对应的密钥 + +# kubeconfig 文件所需上下文。提供给 API 服务器使用。 +current-context: webhook +contexts: +- context: + cluster: name-of-remote-authz-service + user: name-of-api-server + name: webhook +``` + + +## 请求的载荷 + + +鉴权时,API 服务器使用 POST 方式发送一条 JSON-序列化的 `authorization.k8s.io/v1beta1` `SubjectAccessReview` 对象来描述操作。此对象包含了描述发出请求的用户的字段,还包含了将要被访问的资源信息或请求属性。 + + +请注意,webhook API 对象和其它 Kubernetes API 对象一样遵循[版本兼容性规则](/docs/concepts/overview/kubernetes-api/)。 +实现者应当注意 beta 版本对象的兼容性承诺是相当宽松的,并检查请求的 "apiVersion" 字段来保证正确的反序列化。此外,API服务器必须启用 `authorization.k8s.io/v1beta1` API 扩展组 (`--runtime-config=authorization.k8s.io/v1beta1=true`)。 + + +请求体示例: + +```json +{ + "apiVersion": "authorization.k8s.io/v1beta1", + "kind": "SubjectAccessReview", + "spec": { + "resourceAttributes": { + "namespace": "kittensandponies", + "verb": "get", + "group": "unicorn.example.org", + "resource": "pods" + }, + "user": "jane", + "group": [ + "group1", + "group2" + ] + } +} +``` + + +远程服务应当填写请求的 `status` 字段,并且返回是否允许访问的响应。响应体的 `spec` 字段应当被忽略,且可以被省略。允许访问的响应返回格式如下: + +```json +{ + "apiVersion": "authorization.k8s.io/v1beta1", + "kind": "SubjectAccessReview", + "status": { + "allowed": true + } +} +``` + + +远程服务拒绝访问的返回格式如下: + +```json +{ + "apiVersion": "authorization.k8s.io/v1beta1", + "kind": "SubjectAccessReview", + "status": { + "allowed": false, + "reason": "user does not have read access to the namespace" + } +} +``` + + +对非资源路径的请求格式如下: + +```json +{ + "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` 和 `/version`。 +客户端需要访问 `/api`、`/api/*`、`/apis`、`/apis/*` 和 `/version` 来获取服务器上存在资源和版本列表。 +对其它非资源路径的访问可以被禁止;这样做并不会影响对 REST API 的访问。 + + +关于 Webhook 模式的更多信息可参阅 authorization.v1beta1 API 对象的参考指南和 [webhook.go](https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook/webhook.go) 文件。 + +{{% /capture %}}