177 lines
5.2 KiB
Markdown
177 lines
5.2 KiB
Markdown
---
|
|
reviewers:
|
|
- erictune
|
|
- lavalamp
|
|
- deads2k
|
|
- liggitt
|
|
title: Webhook Mode
|
|
content_type: concept
|
|
weight: 100
|
|
---
|
|
|
|
<!-- overview -->
|
|
A WebHook is an HTTP callback: an HTTP POST that occurs when something happens; a simple event-notification via HTTP POST. A web application implementing WebHooks will POST a message to a URL when certain things happen.
|
|
|
|
|
|
<!-- body -->
|
|
When specified, mode `Webhook` causes Kubernetes to query an outside REST
|
|
service when determining user privileges.
|
|
|
|
## Configuration File Format
|
|
|
|
Mode `Webhook` requires a file for HTTP configuration, specify by the
|
|
`--authorization-webhook-config-file=SOME_FILENAME` flag.
|
|
|
|
The configuration file uses the [kubeconfig](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)
|
|
file format. Within the file "users" refers to the API Server webhook and
|
|
"clusters" refers to the remote service.
|
|
|
|
A configuration example which uses HTTPS client auth:
|
|
|
|
```yaml
|
|
# Kubernetes API version
|
|
apiVersion: v1
|
|
# kind of the API object
|
|
kind: Config
|
|
# clusters refers to the remote service.
|
|
clusters:
|
|
- name: name-of-remote-authz-service
|
|
cluster:
|
|
# CA for verifying the remote service.
|
|
certificate-authority: /path/to/ca.pem
|
|
# URL of remote service to query. Must use 'https'. May not include parameters.
|
|
server: https://authz.example.com/authorize
|
|
|
|
# users refers to the API Server's webhook configuration.
|
|
users:
|
|
- name: name-of-api-server
|
|
user:
|
|
client-certificate: /path/to/cert.pem # cert for the webhook plugin to use
|
|
client-key: /path/to/key.pem # key matching the cert
|
|
|
|
# kubeconfig files require a context. Provide one for the API Server.
|
|
current-context: webhook
|
|
contexts:
|
|
- context:
|
|
cluster: name-of-remote-authz-service
|
|
user: name-of-api-server
|
|
name: webhook
|
|
```
|
|
|
|
## Request Payloads
|
|
|
|
When faced with an authorization decision, the API Server POSTs a JSON-
|
|
serialized `authorization.k8s.io/v1beta1` `SubjectAccessReview` object describing the
|
|
action. This object contains fields describing the user attempting to make the
|
|
request, and either details about the resource being accessed or requests
|
|
attributes.
|
|
|
|
Note that webhook API objects are subject to the same [versioning compatibility rules](/docs/concepts/overview/kubernetes-api/)
|
|
as other Kubernetes API objects. Implementers should be aware of looser
|
|
compatibility promises for beta objects and check the "apiVersion" field of the
|
|
request to ensure correct deserialization. Additionally, the API Server must
|
|
enable the `authorization.k8s.io/v1beta1` API extensions group (`--runtime-config=authorization.k8s.io/v1beta1=true`).
|
|
|
|
An example request body:
|
|
|
|
```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"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
The remote service is expected to fill the `status` field of
|
|
the request and respond to either allow or disallow access. The response body's
|
|
`spec` field is ignored and may be omitted. A permissive response would return:
|
|
|
|
```json
|
|
{
|
|
"apiVersion": "authorization.k8s.io/v1beta1",
|
|
"kind": "SubjectAccessReview",
|
|
"status": {
|
|
"allowed": true
|
|
}
|
|
}
|
|
```
|
|
|
|
For disallowing access there are two methods.
|
|
|
|
The first method is preferred in most cases, and indicates the authorization
|
|
webhook does not allow, or has "no opinion" about the request, but if other
|
|
authorizers are configured, they are given a chance to allow the request.
|
|
If there are no other authorizers, or none of them allow the request, the
|
|
request is forbidden. The webhook would return:
|
|
|
|
```json
|
|
{
|
|
"apiVersion": "authorization.k8s.io/v1beta1",
|
|
"kind": "SubjectAccessReview",
|
|
"status": {
|
|
"allowed": false,
|
|
"reason": "user does not have read access to the namespace"
|
|
}
|
|
}
|
|
```
|
|
|
|
The second method denies immediately, short-circuiting evaluation by other
|
|
configured authorizers. This should only be used by webhooks that have
|
|
detailed knowledge of the full authorizer configuration of the cluster.
|
|
The webhook would return:
|
|
|
|
```json
|
|
{
|
|
"apiVersion": "authorization.k8s.io/v1beta1",
|
|
"kind": "SubjectAccessReview",
|
|
"status": {
|
|
"allowed": false,
|
|
"denied": true,
|
|
"reason": "user does not have read access to the namespace"
|
|
}
|
|
}
|
|
```
|
|
|
|
Access to non-resource paths are sent as:
|
|
|
|
```json
|
|
{
|
|
"apiVersion": "authorization.k8s.io/v1beta1",
|
|
"kind": "SubjectAccessReview",
|
|
"spec": {
|
|
"nonResourceAttributes": {
|
|
"path": "/debug",
|
|
"verb": "get"
|
|
},
|
|
"user": "jane",
|
|
"group": [
|
|
"group1",
|
|
"group2"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
Non-resource paths include: `/api`, `/apis`, `/metrics`,
|
|
`/logs`, `/debug`, `/healthz`, `/livez`, `/openapi/v2`, `/readyz`, and
|
|
`/version.` Clients require access to `/api`, `/api/*`, `/apis`, `/apis/*`,
|
|
and `/version` to discover what resources and versions are present on the server.
|
|
Access to other non-resource paths can be disallowed without restricting access
|
|
to the REST api.
|
|
|
|
For further documentation refer to the authorization.v1beta1 API objects and
|
|
[webhook.go](https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook/webhook.go).
|
|
|