1244 lines
46 KiB
Markdown
1244 lines
46 KiB
Markdown
---
|
|
reviewers:
|
|
- erictune
|
|
- deads2k
|
|
- liggitt
|
|
title: Using RBAC Authorization
|
|
content_type: concept
|
|
aliases: [/rbac/]
|
|
weight: 70
|
|
---
|
|
|
|
<!-- overview -->
|
|
Role-based access control (RBAC) is a method of regulating access to computer or
|
|
network resources based on the roles of individual users within your organization.
|
|
|
|
|
|
<!-- body -->
|
|
RBAC authorization uses the `rbac.authorization.k8s.io`
|
|
{{< glossary_tooltip text="API group" term_id="api-group" >}} to drive authorization
|
|
decisions, allowing you to dynamically configure policies through the Kubernetes API.
|
|
|
|
To enable RBAC, start the {{< glossary_tooltip text="API server" term_id="kube-apiserver" >}}
|
|
with the `--authorization-mode` flag set to a comma-separated list that includes `RBAC`;
|
|
for example:
|
|
```shell
|
|
kube-apiserver --authorization-mode=Example,RBAC --other-options --more-options
|
|
```
|
|
|
|
## API objects {#api-overview}
|
|
|
|
The RBAC API declares four kinds of Kubernetes object: _Role_, _ClusterRole_,
|
|
_RoleBinding_ and _ClusterRoleBinding_. You can
|
|
[describe objects](/docs/concepts/overview/working-with-objects/kubernetes-objects/#understanding-kubernetes-objects),
|
|
or amend them, using tools such as `kubectl,` just like any other Kubernetes object.
|
|
|
|
{{< caution >}}
|
|
These objects, by design, impose access restrictions. If you are making changes
|
|
to a cluster as you learn, see
|
|
[privilege escalation prevention and bootstrapping](#privilege-escalation-prevention-and-bootstrapping)
|
|
to understand how those restrictions can prevent you making some changes.
|
|
{{< /caution >}}
|
|
|
|
### Role and ClusterRole
|
|
|
|
An RBAC _Role_ or _ClusterRole_ contains rules that represent a set of permissions.
|
|
Permissions are purely additive (there are no "deny" rules).
|
|
|
|
A Role always sets permissions within a particular {{< glossary_tooltip text="namespace" term_id="namespace" >}};
|
|
when you create a Role, you have to specify the namespace it belongs in.
|
|
|
|
ClusterRole, by contrast, is a non-namespaced resource. The resources have different names (Role
|
|
and ClusterRole) because a Kubernetes object always has to be either namespaced or not namespaced;
|
|
it can't be both.
|
|
|
|
ClusterRoles have several uses. You can use a ClusterRole to:
|
|
|
|
1. define permissions on namespaced resources and be granted within individual namespace(s)
|
|
1. define permissions on namespaced resources and be granted across all namespaces
|
|
1. define permissions on cluster-scoped resources
|
|
|
|
If you want to define a role within a namespace, use a Role; if you want to define
|
|
a role cluster-wide, use a ClusterRole.
|
|
|
|
#### Role example
|
|
|
|
Here's an example Role in the "default" namespace that can be used to grant read access to
|
|
{{< glossary_tooltip text="pods" term_id="pod" >}}:
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: Role
|
|
metadata:
|
|
namespace: default
|
|
name: pod-reader
|
|
rules:
|
|
- apiGroups: [""] # "" indicates the core API group
|
|
resources: ["pods"]
|
|
verbs: ["get", "watch", "list"]
|
|
```
|
|
|
|
#### ClusterRole example
|
|
|
|
A ClusterRole can be used to grant the same permissions as a Role.
|
|
Because ClusterRoles are cluster-scoped, you can also use them to grant access to:
|
|
|
|
* cluster-scoped resources (like {{< glossary_tooltip text="nodes" term_id="node" >}})
|
|
* non-resource endpoints (like `/healthz`)
|
|
* namespaced resources (like Pods), across all namespaces
|
|
|
|
For example: you can use a ClusterRole to allow a particular user to run
|
|
`kubectl get pods --all-namespaces`
|
|
|
|
Here is an example of a ClusterRole that can be used to grant read access to
|
|
{{< glossary_tooltip text="secrets" term_id="secret" >}} in any particular namespace,
|
|
or across all namespaces (depending on how it is [bound](#rolebinding-and-clusterrolebinding)):
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRole
|
|
metadata:
|
|
# "namespace" omitted since ClusterRoles are not namespaced
|
|
name: secret-reader
|
|
rules:
|
|
- apiGroups: [""]
|
|
#
|
|
# at the HTTP level, the name of the resource for accessing Secret
|
|
# objects is "secrets"
|
|
resources: ["secrets"]
|
|
verbs: ["get", "watch", "list"]
|
|
```
|
|
|
|
The name of a Role or a ClusterRole object must be a valid
|
|
[path segment name](/docs/concepts/overview/working-with-objects/names#path-segment-names).
|
|
|
|
### RoleBinding and ClusterRoleBinding
|
|
|
|
A role binding grants the permissions defined in a role to a user or set of users.
|
|
It holds a list of *subjects* (users, groups, or service accounts), and a reference to the
|
|
role being granted.
|
|
A RoleBinding grants permissions within a specific namespace whereas a ClusterRoleBinding
|
|
grants that access cluster-wide.
|
|
|
|
A RoleBinding may reference any Role in the same namespace. Alternatively, a RoleBinding
|
|
can reference a ClusterRole and bind that ClusterRole to the namespace of the RoleBinding.
|
|
If you want to bind a ClusterRole to all the namespaces in your cluster, you use a
|
|
ClusterRoleBinding.
|
|
|
|
The name of a RoleBinding or ClusterRoleBinding object must be a valid
|
|
[path segment name](/docs/concepts/overview/working-with-objects/names#path-segment-names).
|
|
|
|
#### RoleBinding examples {#rolebinding-example}
|
|
|
|
Here is an example of a RoleBinding that grants the "pod-reader" Role to the user "jane"
|
|
within the "default" namespace.
|
|
This allows "jane" to read pods in the "default" namespace.
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
# This role binding allows "jane" to read pods in the "default" namespace.
|
|
# You need to already have a Role named "pod-reader" in that namespace.
|
|
kind: RoleBinding
|
|
metadata:
|
|
name: read-pods
|
|
namespace: default
|
|
subjects:
|
|
# You can specify more than one "subject"
|
|
- kind: User
|
|
name: jane # "name" is case sensitive
|
|
apiGroup: rbac.authorization.k8s.io
|
|
roleRef:
|
|
# "roleRef" specifies the binding to a Role / ClusterRole
|
|
kind: Role #this must be Role or ClusterRole
|
|
name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
|
|
A RoleBinding can also reference a ClusterRole to grant the permissions defined in that
|
|
ClusterRole to resources inside the RoleBinding's namespace. This kind of reference
|
|
lets you define a set of common roles across your cluster, then reuse them within
|
|
multiple namespaces.
|
|
|
|
For instance, even though the following RoleBinding refers to a ClusterRole,
|
|
"dave" (the subject, case sensitive) will only be able to read Secrets in the "development"
|
|
namespace, because the RoleBinding's namespace (in its metadata) is "development".
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
# This role binding allows "dave" to read secrets in the "development" namespace.
|
|
# You need to already have a ClusterRole named "secret-reader".
|
|
kind: RoleBinding
|
|
metadata:
|
|
name: read-secrets
|
|
#
|
|
# The namespace of the RoleBinding determines where the permissions are granted.
|
|
# This only grants permissions within the "development" namespace.
|
|
namespace: development
|
|
subjects:
|
|
- kind: User
|
|
name: dave # Name is case sensitive
|
|
apiGroup: rbac.authorization.k8s.io
|
|
roleRef:
|
|
kind: ClusterRole
|
|
name: secret-reader
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
|
|
#### ClusterRoleBinding example
|
|
|
|
To grant permissions across a whole cluster, you can use a ClusterRoleBinding.
|
|
The following ClusterRoleBinding allows any user in the group "manager" to read
|
|
secrets in any namespace.
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
|
|
kind: ClusterRoleBinding
|
|
metadata:
|
|
name: read-secrets-global
|
|
subjects:
|
|
- kind: Group
|
|
name: manager # Name is case sensitive
|
|
apiGroup: rbac.authorization.k8s.io
|
|
roleRef:
|
|
kind: ClusterRole
|
|
name: secret-reader
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
|
|
After you create a binding, you cannot change the Role or ClusterRole that it refers to.
|
|
If you try to change a binding's `roleRef`, you get a validation error. If you do want
|
|
to change the `roleRef` for a binding, you need to remove the binding object and create
|
|
a replacement.
|
|
|
|
There are two reasons for this restriction:
|
|
|
|
1. Making `roleRef` immutable allows granting someone `update` permission on an existing binding
|
|
object, so that they can manage the list of subjects, without being able to change
|
|
the role that is granted to those subjects.
|
|
1. A binding to a different role is a fundamentally different binding.
|
|
Requiring a binding to be deleted/recreated in order to change the `roleRef`
|
|
ensures the full list of subjects in the binding is intended to be granted
|
|
the new role (as opposed to enabling or accidentally modifying only the roleRef
|
|
without verifying all of the existing subjects should be given the new role's
|
|
permissions).
|
|
|
|
The `kubectl auth reconcile` command-line utility creates or updates a manifest file containing RBAC objects,
|
|
and handles deleting and recreating binding objects if required to change the role they refer to.
|
|
See [command usage and examples](#kubectl-auth-reconcile) for more information.
|
|
|
|
### Referring to resources
|
|
|
|
In the Kubernetes API, most resources are represented and accessed using a string representation of
|
|
their object name, such as `pods` for a Pod. RBAC refers to resources using exactly the same
|
|
name that appears in the URL for the relevant API endpoint.
|
|
Some Kubernetes APIs involve a
|
|
_subresource_, such as the logs for a Pod. A request for a Pod's logs looks like:
|
|
|
|
```http
|
|
GET /api/v1/namespaces/{namespace}/pods/{name}/log
|
|
```
|
|
|
|
In this case, `pods` is the namespaced resource for Pod resources, and `log` is a
|
|
subresource of `pods`. To represent this in an RBAC role, use a slash (`/`) to
|
|
delimit the resource and subresource. To allow a subject to read `pods` and
|
|
also access the `log` subresource for each of those Pods, you write:
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: Role
|
|
metadata:
|
|
namespace: default
|
|
name: pod-and-pod-logs-reader
|
|
rules:
|
|
- apiGroups: [""]
|
|
resources: ["pods", "pods/log"]
|
|
verbs: ["get", "list"]
|
|
```
|
|
|
|
You can also refer to resources by name for certain requests through the `resourceNames` list.
|
|
When specified, requests can be restricted to individual instances of a resource.
|
|
Here is an example that restricts its subject to only `get` or `update` a
|
|
{{< glossary_tooltip term_id="ConfigMap" >}} named `my-configmap`:
|
|
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: Role
|
|
metadata:
|
|
namespace: default
|
|
name: configmap-updater
|
|
rules:
|
|
- apiGroups: [""]
|
|
#
|
|
# at the HTTP level, the name of the resource for accessing ConfigMap
|
|
# objects is "configmaps"
|
|
resources: ["configmaps"]
|
|
resourceNames: ["my-configmap"]
|
|
verbs: ["update", "get"]
|
|
```
|
|
|
|
{{< note >}}
|
|
You cannot restrict `create` or `deletecollection` requests by resourceName. For `create`, this
|
|
limitation is because the object name is not known at authorization time.
|
|
{{< /note >}}
|
|
|
|
|
|
### Aggregated ClusterRoles
|
|
|
|
You can _aggregate_ several ClusterRoles into one combined ClusterRole.
|
|
A controller, running as part of the cluster control plane, watches for ClusterRole
|
|
objects with an `aggregationRule` set. The `aggregationRule` defines a label
|
|
{{< glossary_tooltip text="selector" term_id="selector" >}} that the controller
|
|
uses to match other ClusterRole objects that should be combined into the `rules`
|
|
field of this one.
|
|
|
|
Here is an example aggregated ClusterRole:
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRole
|
|
metadata:
|
|
name: monitoring
|
|
aggregationRule:
|
|
clusterRoleSelectors:
|
|
- matchLabels:
|
|
rbac.example.com/aggregate-to-monitoring: "true"
|
|
rules: [] # The control plane automatically fills in the rules
|
|
```
|
|
|
|
If you create a new ClusterRole that matches the label selector of an existing aggregated ClusterRole,
|
|
that change triggers adding the new rules into the aggregated ClusterRole.
|
|
Here is an example that adds rules to the "monitoring" ClusterRole, by creating another
|
|
ClusterRole labeled `rbac.example.com/aggregate-to-monitoring: true`.
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRole
|
|
metadata:
|
|
name: monitoring-endpoints
|
|
labels:
|
|
rbac.example.com/aggregate-to-monitoring: "true"
|
|
# When you create the "monitoring-endpoints" ClusterRole,
|
|
# the rules below will be added to the "monitoring" ClusterRole.
|
|
rules:
|
|
- apiGroups: [""]
|
|
resources: ["services", "endpoints", "pods"]
|
|
verbs: ["get", "list", "watch"]
|
|
```
|
|
|
|
The [default user-facing roles](#default-roles-and-role-bindings) use ClusterRole aggregation. This lets you,
|
|
as a cluster administrator, include rules for custom resources, such as those served by
|
|
{{< glossary_tooltip term_id="CustomResourceDefinition" text="CustomResourceDefinitions" >}}
|
|
or aggregated API servers, to extend the default roles.
|
|
|
|
For example: the following ClusterRoles let the "admin" and "edit" default roles manage the custom resource
|
|
named CronTab, whereas the "view" role can perform only read actions on CronTab resources.
|
|
You can assume that CronTab objects are named `"crontabs"` in URLs as seen by the API server.
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRole
|
|
metadata:
|
|
name: aggregate-cron-tabs-edit
|
|
labels:
|
|
# Add these permissions to the "admin" and "edit" default roles.
|
|
rbac.authorization.k8s.io/aggregate-to-admin: "true"
|
|
rbac.authorization.k8s.io/aggregate-to-edit: "true"
|
|
rules:
|
|
- apiGroups: ["stable.example.com"]
|
|
resources: ["crontabs"]
|
|
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
|
---
|
|
kind: ClusterRole
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
metadata:
|
|
name: aggregate-cron-tabs-view
|
|
labels:
|
|
# Add these permissions to the "view" default role.
|
|
rbac.authorization.k8s.io/aggregate-to-view: "true"
|
|
rules:
|
|
- apiGroups: ["stable.example.com"]
|
|
resources: ["crontabs"]
|
|
verbs: ["get", "list", "watch"]
|
|
```
|
|
|
|
#### Role examples
|
|
|
|
The following examples are excerpts from Role or ClusterRole objects, showing only
|
|
the `rules` section.
|
|
|
|
Allow reading `"pods"` resources in the core
|
|
{{< glossary_tooltip text="API Group" term_id="api-group" >}}:
|
|
|
|
```yaml
|
|
rules:
|
|
- apiGroups: [""]
|
|
#
|
|
# at the HTTP level, the name of the resource for accessing Pod
|
|
# objects is "pods"
|
|
resources: ["pods"]
|
|
verbs: ["get", "list", "watch"]
|
|
```
|
|
|
|
Allow reading/writing Deployments (at the HTTP level: objects with `"deployments"`
|
|
in the resource part of their URL) in both the `"extensions"` and `"apps"` API groups:
|
|
|
|
```yaml
|
|
rules:
|
|
- apiGroups: ["extensions", "apps"]
|
|
#
|
|
# at the HTTP level, the name of the resource for accessing Deployment
|
|
# objects is "deployments"
|
|
resources: ["deployments"]
|
|
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
|
```
|
|
|
|
Allow reading Pods in the core API group, as well as reading or writing Job
|
|
resources in the `"batch"` or `"extensions"` API groups:
|
|
|
|
```yaml
|
|
rules:
|
|
- apiGroups: [""]
|
|
#
|
|
# at the HTTP level, the name of the resource for accessing Pod
|
|
# objects is "pods"
|
|
resources: ["pods"]
|
|
verbs: ["get", "list", "watch"]
|
|
- apiGroups: ["batch", "extensions"]
|
|
#
|
|
# at the HTTP level, the name of the resource for accessing Job
|
|
# objects is "jobs"
|
|
resources: ["jobs"]
|
|
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
|
```
|
|
|
|
Allow reading a ConfigMap named "my-config" (must be bound with a
|
|
RoleBinding to limit to a single ConfigMap in a single namespace):
|
|
|
|
```yaml
|
|
rules:
|
|
- apiGroups: [""]
|
|
#
|
|
# at the HTTP level, the name of the resource for accessing ConfigMap
|
|
# objects is "configmaps"
|
|
resources: ["configmaps"]
|
|
resourceNames: ["my-config"]
|
|
verbs: ["get"]
|
|
```
|
|
|
|
Allow reading the resource `"nodes"` in the core group (because a
|
|
Node is cluster-scoped, this must be in a ClusterRole bound with a
|
|
ClusterRoleBinding to be effective):
|
|
|
|
```yaml
|
|
rules:
|
|
- apiGroups: [""]
|
|
#
|
|
# at the HTTP level, the name of the resource for accessing Node
|
|
# objects is "nodes"
|
|
resources: ["nodes"]
|
|
verbs: ["get", "list", "watch"]
|
|
```
|
|
|
|
Allow GET and POST requests to the non-resource endpoint `/healthz` and
|
|
all subpaths (must be in a ClusterRole bound with a ClusterRoleBinding
|
|
to be effective):
|
|
|
|
```yaml
|
|
rules:
|
|
- nonResourceURLs: ["/healthz", "/healthz/*"] # '*' in a nonResourceURL is a suffix glob match
|
|
verbs: ["get", "post"]
|
|
```
|
|
|
|
### Referring to subjects
|
|
|
|
A RoleBinding or ClusterRoleBinding binds a role to subjects.
|
|
Subjects can be groups, users or
|
|
{{< glossary_tooltip text="ServiceAccounts" term_id="service-account" >}}.
|
|
|
|
Kubernetes represents usernames as strings.
|
|
These can be: plain names, such as "alice"; email-style names, like "bob@example.com";
|
|
or numeric user IDs represented as a string. It is up to you as a cluster administrator
|
|
to configure the [authentication modules](/docs/reference/access-authn-authz/authentication/)
|
|
so that authentication produces usernames in the format you want.
|
|
|
|
{{< caution >}}
|
|
The prefix `system:` is reserved for Kubernetes system use, so you should ensure
|
|
that you don't have users or groups with names that start with `system:` by
|
|
accident.
|
|
Other than this special prefix, the RBAC authorization system does not require any format
|
|
for usernames.
|
|
{{< /caution >}}
|
|
|
|
In Kubernetes, Authenticator modules provide group information.
|
|
Groups, like users, are represented as strings, and that string has no format requirements,
|
|
other than that the prefix `system:` is reserved.
|
|
|
|
[ServiceAccounts](/docs/tasks/configure-pod-container/configure-service-account/) have names prefixed
|
|
with `system:serviceaccount:`, and belong to groups that have names prefixed with `system:serviceaccounts:`.
|
|
|
|
{{< note >}}
|
|
- `system:serviceaccount:` (singular) is the prefix for service account usernames.
|
|
- `system:serviceaccounts:` (plural) is the prefix for service account groups.
|
|
{{< /note >}}
|
|
|
|
#### RoleBinding examples {#role-binding-examples}
|
|
|
|
The following examples are `RoleBinding` excerpts that only
|
|
show the `subjects` section.
|
|
|
|
For a user named `alice@example.com`:
|
|
|
|
```yaml
|
|
subjects:
|
|
- kind: User
|
|
name: "alice@example.com"
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
|
|
For a group named `frontend-admins`:
|
|
|
|
```yaml
|
|
subjects:
|
|
- kind: Group
|
|
name: "frontend-admins"
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
|
|
For the default service account in the "kube-system" namespace:
|
|
|
|
```yaml
|
|
subjects:
|
|
- kind: ServiceAccount
|
|
name: default
|
|
namespace: kube-system
|
|
```
|
|
|
|
For all service accounts in the "qa" group in any namespace:
|
|
|
|
```yaml
|
|
subjects:
|
|
- kind: Group
|
|
name: system:serviceaccounts:qa
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
For all service accounts in the "dev" group in the "development" namespace:
|
|
|
|
```yaml
|
|
subjects:
|
|
- kind: Group
|
|
name: system:serviceaccounts:dev
|
|
apiGroup: rbac.authorization.k8s.io
|
|
namespace: development
|
|
```
|
|
|
|
For all service accounts in any namespace:
|
|
|
|
```yaml
|
|
subjects:
|
|
- kind: Group
|
|
name: system:serviceaccounts
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
|
|
For all authenticated users:
|
|
|
|
```yaml
|
|
subjects:
|
|
- kind: Group
|
|
name: system:authenticated
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
|
|
For all unauthenticated users:
|
|
|
|
```yaml
|
|
subjects:
|
|
- kind: Group
|
|
name: system:unauthenticated
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
|
|
For all users:
|
|
|
|
```yaml
|
|
subjects:
|
|
- kind: Group
|
|
name: system:authenticated
|
|
apiGroup: rbac.authorization.k8s.io
|
|
- kind: Group
|
|
name: system:unauthenticated
|
|
apiGroup: rbac.authorization.k8s.io
|
|
```
|
|
|
|
## Default roles and role bindings
|
|
|
|
API servers create a set of default ClusterRole and ClusterRoleBinding objects.
|
|
Many of these are `system:` prefixed, which indicates that the resource is directly
|
|
managed by the cluster control plane.
|
|
All of the default ClusterRoles and ClusterRoleBindings are labeled with `kubernetes.io/bootstrapping=rbac-defaults`.
|
|
|
|
{{< caution >}}
|
|
Take care when modifying ClusterRoles and ClusterRoleBindings with names
|
|
that have a `system:` prefix.
|
|
Modifications to these resources can result in non-functional clusters.
|
|
{{< /caution >}}
|
|
|
|
### Auto-reconciliation
|
|
|
|
At each start-up, the API server updates default cluster roles with any missing permissions,
|
|
and updates default cluster role bindings with any missing subjects.
|
|
This allows the cluster to repair accidental modifications, and helps to keep roles and role bindings
|
|
up-to-date as permissions and subjects change in new Kubernetes releases.
|
|
|
|
To opt out of this reconciliation, set the `rbac.authorization.kubernetes.io/autoupdate`
|
|
annotation on a default cluster role or rolebinding to `false`.
|
|
Be aware that missing default permissions and subjects can result in non-functional clusters.
|
|
|
|
Auto-reconciliation is enabled by default if the RBAC authorizer is active.
|
|
|
|
### API discovery roles {#discovery-roles}
|
|
|
|
Default role bindings authorize unauthenticated and authenticated users to read API information that is deemed safe to be publicly accessible (including CustomResourceDefinitions). To disable anonymous unauthenticated access, add `--anonymous-auth=false` to the API server configuration.
|
|
|
|
To view the configuration of these roles via `kubectl` run:
|
|
|
|
```shell
|
|
kubectl get clusterroles system:discovery -o yaml
|
|
```
|
|
|
|
{{< note >}}
|
|
If you edit that ClusterRole, your changes will be overwritten on API server restart
|
|
via [auto-reconciliation](#auto-reconciliation). To avoid that overwriting,
|
|
either do not manually edit the role, or disable auto-reconciliation.
|
|
{{< /note >}}
|
|
|
|
<table>
|
|
<caption>Kubernetes RBAC API discovery roles</caption>
|
|
<colgroup><col style="width: 25%;" /><col style="width: 25%;" /><col /></colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>Default ClusterRole</th>
|
|
<th>Default ClusterRoleBinding</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><b>system:basic-user</b></td>
|
|
<td><b>system:authenticated</b> group</td>
|
|
<td>Allows a user read-only access to basic information about themselves. Prior to v1.14, this role was also bound to <tt>system:unauthenticated</tt> by default.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:discovery</b></td>
|
|
<td><b>system:authenticated</b> group</td>
|
|
<td>Allows read-only access to API discovery endpoints needed to discover and negotiate an API level. Prior to v1.14, this role was also bound to <tt>system:unauthenticated</tt> by default.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:public-info-viewer</b></td>
|
|
<td><b>system:authenticated</b> and <b>system:unauthenticated</b> groups</td>
|
|
<td>Allows read-only access to non-sensitive information about the cluster. Introduced in Kubernetes v1.14.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
### User-facing roles
|
|
|
|
Some of the default ClusterRoles are not `system:` prefixed. These are intended to be user-facing roles.
|
|
They include super-user roles (`cluster-admin`), roles intended to be granted cluster-wide
|
|
using ClusterRoleBindings, and roles intended to be granted within particular
|
|
namespaces using RoleBindings (`admin`, `edit`, `view`).
|
|
|
|
User-facing ClusterRoles use [ClusterRole aggregation](#aggregated-clusterroles) to allow admins to include
|
|
rules for custom resources on these ClusterRoles. To add rules to the `admin`, `edit`, or `view` roles, create
|
|
a ClusterRole with one or more of the following labels:
|
|
|
|
```yaml
|
|
metadata:
|
|
labels:
|
|
rbac.authorization.k8s.io/aggregate-to-admin: "true"
|
|
rbac.authorization.k8s.io/aggregate-to-edit: "true"
|
|
rbac.authorization.k8s.io/aggregate-to-view: "true"
|
|
```
|
|
|
|
<table>
|
|
<colgroup><col style="width: 25%;" /><col style="width: 25%;" /><col /></colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>Default ClusterRole</th>
|
|
<th>Default ClusterRoleBinding</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><b>cluster-admin</b></td>
|
|
<td><b>system:masters</b> group</td>
|
|
<td>Allows super-user access to perform any action on any resource.
|
|
When used in a <b>ClusterRoleBinding</b>, it gives full control over every resource in the cluster and in all namespaces.
|
|
When used in a <b>RoleBinding</b>, it gives full control over every resource in the role binding's namespace, including the namespace itself.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>admin</b></td>
|
|
<td>None</td>
|
|
<td>Allows admin access, intended to be granted within a namespace using a <b>RoleBinding</b>.
|
|
If used in a <b>RoleBinding</b>, allows read/write access to most resources in a namespace,
|
|
including the ability to create roles and role bindings within the namespace.
|
|
This role does not allow write access to resource quota or to the namespace itself.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>edit</b></td>
|
|
<td>None</td>
|
|
<td>Allows read/write access to most objects in a namespace.
|
|
|
|
This role does not allow viewing or modifying roles or role bindings.
|
|
However, this role allows accessing Secrets and running Pods as any ServiceAccount in
|
|
the namespace, so it can be used to gain the API access levels of any ServiceAccount in
|
|
the namespace.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>view</b></td>
|
|
<td>None</td>
|
|
<td>Allows read-only access to see most objects in a namespace.
|
|
It does not allow viewing roles or role bindings.
|
|
|
|
This role does not allow viewing Secrets, since reading
|
|
the contents of Secrets enables access to ServiceAccount credentials
|
|
in the namespace, which would allow API access as any ServiceAccount
|
|
in the namespace (a form of privilege escalation).</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
### Core component roles
|
|
|
|
<table>
|
|
<colgroup><col style="width: 25%;" /><col style="width: 25%;" /><col /></colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>Default ClusterRole</th>
|
|
<th>Default ClusterRoleBinding</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><b>system:kube-scheduler</b></td>
|
|
<td><b>system:kube-scheduler</b> user</td>
|
|
<td>Allows access to the resources required by the {{< glossary_tooltip term_id="kube-scheduler" text="scheduler" >}} component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:volume-scheduler</b></td>
|
|
<td><b>system:kube-scheduler</b> user</td>
|
|
<td>Allows access to the volume resources required by the kube-scheduler component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:kube-controller-manager</b></td>
|
|
<td><b>system:kube-controller-manager</b> user</td>
|
|
<td>Allows access to the resources required by the {{< glossary_tooltip term_id="kube-controller-manager" text="controller manager" >}} component.
|
|
The permissions required by individual controllers are detailed in the <a href="#controller-roles">controller roles</a>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:node</b></td>
|
|
<td>None</td>
|
|
<td>Allows access to resources required by the kubelet, <b>including read access to all secrets, and write access to all pod status objects</b>.
|
|
|
|
You should use the <a href="/docs/reference/access-authn-authz/node/">Node authorizer</a> and <a href="/docs/reference/access-authn-authz/admission-controllers/#noderestriction">NodeRestriction admission plugin</a> instead of the <tt>system:node</tt> role, and allow granting API access to kubelets based on the Pods scheduled to run on them.
|
|
|
|
The <tt>system:node</tt> role only exists for compatibility with Kubernetes clusters upgraded from versions prior to v1.8.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:node-proxier</b></td>
|
|
<td><b>system:kube-proxy</b> user</td>
|
|
<td>Allows access to the resources required by the {{< glossary_tooltip term_id="kube-proxy" text="kube-proxy" >}} component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
### Other component roles
|
|
|
|
<table>
|
|
<colgroup><col style="width: 25%;" /><col style="width: 25%;" /><col /></colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>Default ClusterRole</th>
|
|
<th>Default ClusterRoleBinding</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><b>system:auth-delegator</b></td>
|
|
<td>None</td>
|
|
<td>Allows delegated authentication and authorization checks.
|
|
This is commonly used by add-on API servers for unified authentication and authorization.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:heapster</b></td>
|
|
<td>None</td>
|
|
<td>Role for the <a href="https://github.com/kubernetes/heapster">Heapster</a> component (deprecated).</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:kube-aggregator</b></td>
|
|
<td>None</td>
|
|
<td>Role for the <a href="https://github.com/kubernetes/kube-aggregator">kube-aggregator</a> component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:kube-dns</b></td>
|
|
<td><b>kube-dns</b> service account in the <b>kube-system</b> namespace</td>
|
|
<td>Role for the <a href="/docs/concepts/services-networking/dns-pod-service/">kube-dns</a> component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:kubelet-api-admin</b></td>
|
|
<td>None</td>
|
|
<td>Allows full access to the kubelet API.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:node-bootstrapper</b></td>
|
|
<td>None</td>
|
|
<td>Allows access to the resources required to perform
|
|
<a href="/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/">kubelet TLS bootstrapping</a>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:node-problem-detector</b></td>
|
|
<td>None</td>
|
|
<td>Role for the <a href="https://github.com/kubernetes/node-problem-detector">node-problem-detector</a> component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:persistent-volume-provisioner</b></td>
|
|
<td>None</td>
|
|
<td>Allows access to the resources required by most <a href="/docs/concepts/storage/persistent-volumes/#provisioner">dynamic volume provisioners</a>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>system:monitoring</b></td>
|
|
<td><b>system:monitoring</b> group</td>
|
|
<td>Allows read access to control-plane monitoring endpoints (i.e. {{< glossary_tooltip term_id="kube-apiserver" text="kube-apiserver" >}} liveness and readiness endpoints (<tt>/healthz</tt>, <tt>/livez</tt>, <tt>/readyz</tt>), the individual health-check endpoints (<tt>/healthz/*</tt>, <tt>/livez/*</tt>, <tt>/readyz/*</tt>), and <tt>/metrics</tt>). Note that individual health check endpoints and the metric endpoint may expose sensitive information.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
### Roles for built-in controllers {#controller-roles}
|
|
|
|
The Kubernetes {{< glossary_tooltip term_id="kube-controller-manager" text="controller manager" >}} runs
|
|
{{< glossary_tooltip term_id="controller" text="controllers" >}} that are built in to the Kubernetes
|
|
control plane.
|
|
When invoked with `--use-service-account-credentials`, kube-controller-manager starts each controller
|
|
using a separate service account.
|
|
Corresponding roles exist for each built-in controller, prefixed with `system:controller:`.
|
|
If the controller manager is not started with `--use-service-account-credentials`, it runs all control loops
|
|
using its own credential, which must be granted all the relevant roles.
|
|
These roles include:
|
|
|
|
* `system:controller:attachdetach-controller`
|
|
* `system:controller:certificate-controller`
|
|
* `system:controller:clusterrole-aggregation-controller`
|
|
* `system:controller:cronjob-controller`
|
|
* `system:controller:daemon-set-controller`
|
|
* `system:controller:deployment-controller`
|
|
* `system:controller:disruption-controller`
|
|
* `system:controller:endpoint-controller`
|
|
* `system:controller:expand-controller`
|
|
* `system:controller:generic-garbage-collector`
|
|
* `system:controller:horizontal-pod-autoscaler`
|
|
* `system:controller:job-controller`
|
|
* `system:controller:namespace-controller`
|
|
* `system:controller:node-controller`
|
|
* `system:controller:persistent-volume-binder`
|
|
* `system:controller:pod-garbage-collector`
|
|
* `system:controller:pv-protection-controller`
|
|
* `system:controller:pvc-protection-controller`
|
|
* `system:controller:replicaset-controller`
|
|
* `system:controller:replication-controller`
|
|
* `system:controller:resourcequota-controller`
|
|
* `system:controller:root-ca-cert-publisher`
|
|
* `system:controller:route-controller`
|
|
* `system:controller:service-account-controller`
|
|
* `system:controller:service-controller`
|
|
* `system:controller:statefulset-controller`
|
|
* `system:controller:ttl-controller`
|
|
|
|
## Privilege escalation prevention and bootstrapping
|
|
|
|
The RBAC API prevents users from escalating privileges by editing roles or role bindings.
|
|
Because this is enforced at the API level, it applies even when the RBAC authorizer is not in use.
|
|
|
|
### Restrictions on role creation or update
|
|
|
|
You can only create/update a role if at least one of the following things is true:
|
|
|
|
1. You already have all the permissions contained in the role, at the same scope as the object being modified
|
|
(cluster-wide for a ClusterRole, within the same namespace or cluster-wide for a Role).
|
|
2. You are granted explicit permission to perform the `escalate` verb on the `roles` or `clusterroles` resource in the `rbac.authorization.k8s.io` API group.
|
|
|
|
For example, if `user-1` does not have the ability to list Secrets cluster-wide, they cannot create a ClusterRole
|
|
containing that permission. To allow a user to create/update roles:
|
|
|
|
1. Grant them a role that allows them to create/update Role or ClusterRole objects, as desired.
|
|
2. Grant them permission to include specific permissions in the roles they create/update:
|
|
* implicitly, by giving them those permissions (if they attempt to create or modify a Role or ClusterRole with permissions they themselves have not been granted, the API request will be forbidden)
|
|
* or explicitly allow specifying any permission in a `Role` or `ClusterRole` by giving them permission to perform the `escalate` verb on `roles` or `clusterroles` resources in the `rbac.authorization.k8s.io` API group
|
|
|
|
### Restrictions on role binding creation or update
|
|
|
|
You can only create/update a role binding if you already have all the permissions contained in the referenced role
|
|
(at the same scope as the role binding) *or* if you have been authorized to perform the `bind` verb on the referenced role.
|
|
For example, if `user-1` does not have the ability to list Secrets cluster-wide, they cannot create a ClusterRoleBinding
|
|
to a role that grants that permission. To allow a user to create/update role bindings:
|
|
|
|
1. Grant them a role that allows them to create/update RoleBinding or ClusterRoleBinding objects, as desired.
|
|
2. Grant them permissions needed to bind a particular role:
|
|
* implicitly, by giving them the permissions contained in the role.
|
|
* explicitly, by giving them permission to perform the `bind` verb on the particular Role (or ClusterRole).
|
|
|
|
For example, this ClusterRole and RoleBinding would allow `user-1` to grant other users the `admin`, `edit`, and `view` roles in the namespace `user-1-namespace`:
|
|
|
|
```yaml
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRole
|
|
metadata:
|
|
name: role-grantor
|
|
rules:
|
|
- apiGroups: ["rbac.authorization.k8s.io"]
|
|
resources: ["rolebindings"]
|
|
verbs: ["create"]
|
|
- apiGroups: ["rbac.authorization.k8s.io"]
|
|
resources: ["clusterroles"]
|
|
verbs: ["bind"]
|
|
# omit resourceNames to allow binding any ClusterRole
|
|
resourceNames: ["admin","edit","view"]
|
|
---
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: RoleBinding
|
|
metadata:
|
|
name: role-grantor-binding
|
|
namespace: user-1-namespace
|
|
roleRef:
|
|
apiGroup: rbac.authorization.k8s.io
|
|
kind: ClusterRole
|
|
name: role-grantor
|
|
subjects:
|
|
- apiGroup: rbac.authorization.k8s.io
|
|
kind: User
|
|
name: user-1
|
|
```
|
|
|
|
When bootstrapping the first roles and role bindings, it is necessary for the initial user to grant permissions they do not yet have.
|
|
To bootstrap initial roles and role bindings:
|
|
|
|
* Use a credential with the "system:masters" group, which is bound to the "cluster-admin" super-user role by the default bindings.
|
|
* If your API server runs with the insecure port enabled (`--insecure-port`), you can also make API calls via that port, which does not enforce authentication or authorization.
|
|
|
|
## Command-line utilities
|
|
|
|
### `kubectl create role`
|
|
|
|
Creates a Role object defining permissions within a single namespace. Examples:
|
|
|
|
* Create a Role named "pod-reader" that allows users to perform `get`, `watch` and `list` on pods:
|
|
|
|
```shell
|
|
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
|
|
```
|
|
|
|
* Create a Role named "pod-reader" with resourceNames specified:
|
|
|
|
```shell
|
|
kubectl create role pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod
|
|
```
|
|
|
|
* Create a Role named "foo" with apiGroups specified:
|
|
|
|
```shell
|
|
kubectl create role foo --verb=get,list,watch --resource=replicasets.apps
|
|
```
|
|
|
|
* Create a Role named "foo" with subresource permissions:
|
|
|
|
```shell
|
|
kubectl create role foo --verb=get,list,watch --resource=pods,pods/status
|
|
```
|
|
|
|
* Create a Role named "my-component-lease-holder" with permissions to get/update a resource with a specific name:
|
|
|
|
```shell
|
|
kubectl create role my-component-lease-holder --verb=get,list,watch,update --resource=lease --resource-name=my-component
|
|
```
|
|
|
|
### `kubectl create clusterrole`
|
|
|
|
Creates a ClusterRole. Examples:
|
|
|
|
* Create a ClusterRole named "pod-reader" that allows user to perform `get`, `watch` and `list` on pods:
|
|
|
|
```shell
|
|
kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods
|
|
```
|
|
|
|
* Create a ClusterRole named "pod-reader" with resourceNames specified:
|
|
|
|
```shell
|
|
kubectl create clusterrole pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod
|
|
```
|
|
|
|
* Create a ClusterRole named "foo" with apiGroups specified:
|
|
|
|
```shell
|
|
kubectl create clusterrole foo --verb=get,list,watch --resource=replicasets.apps
|
|
```
|
|
|
|
* Create a ClusterRole named "foo" with subresource permissions:
|
|
|
|
```shell
|
|
kubectl create clusterrole foo --verb=get,list,watch --resource=pods,pods/status
|
|
```
|
|
|
|
* Create a ClusterRole named "foo" with nonResourceURL specified:
|
|
|
|
```shell
|
|
kubectl create clusterrole "foo" --verb=get --non-resource-url=/logs/*
|
|
```
|
|
|
|
* Create a ClusterRole named "monitoring" with an aggregationRule specified:
|
|
|
|
```shell
|
|
kubectl create clusterrole monitoring --aggregation-rule="rbac.example.com/aggregate-to-monitoring=true"
|
|
```
|
|
|
|
### `kubectl create rolebinding`
|
|
|
|
Grants a Role or ClusterRole within a specific namespace. Examples:
|
|
|
|
* Within the namespace "acme", grant the permissions in the "admin" ClusterRole to a user named "bob":
|
|
|
|
```shell
|
|
kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=bob --namespace=acme
|
|
```
|
|
|
|
* Within the namespace "acme", grant the permissions in the "view" ClusterRole to the service account in the namespace "acme" named "myapp":
|
|
|
|
```shell
|
|
kubectl create rolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp --namespace=acme
|
|
```
|
|
|
|
* Within the namespace "acme", grant the permissions in the "view" ClusterRole to a service account in the namespace "myappnamespace" named "myapp":
|
|
|
|
```shell
|
|
kubectl create rolebinding myappnamespace-myapp-view-binding --clusterrole=view --serviceaccount=myappnamespace:myapp --namespace=acme
|
|
```
|
|
|
|
### `kubectl create clusterrolebinding`
|
|
|
|
Grants a ClusterRole across the entire cluster (all namespaces). Examples:
|
|
|
|
* Across the entire cluster, grant the permissions in the "cluster-admin" ClusterRole to a user named "root":
|
|
|
|
```shell
|
|
kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --user=root
|
|
```
|
|
|
|
* Across the entire cluster, grant the permissions in the "system:node-proxier" ClusterRole to a user named "system:kube-proxy":
|
|
|
|
```shell
|
|
kubectl create clusterrolebinding kube-proxy-binding --clusterrole=system:node-proxier --user=system:kube-proxy
|
|
```
|
|
|
|
* Across the entire cluster, grant the permissions in the "view" ClusterRole to a service account named "myapp" in the namespace "acme":
|
|
|
|
```shell
|
|
kubectl create clusterrolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp
|
|
```
|
|
|
|
### `kubectl auth reconcile` {#kubectl-auth-reconcile}
|
|
|
|
Creates or updates `rbac.authorization.k8s.io/v1` API objects from a manifest file.
|
|
|
|
Missing objects are created, and the containing namespace is created for namespaced objects, if required.
|
|
|
|
Existing roles are updated to include the permissions in the input objects,
|
|
and remove extra permissions if `--remove-extra-permissions` is specified.
|
|
|
|
Existing bindings are updated to include the subjects in the input objects,
|
|
and remove extra subjects if `--remove-extra-subjects` is specified.
|
|
|
|
Examples:
|
|
|
|
* Test applying a manifest file of RBAC objects, displaying changes that would be made:
|
|
|
|
```
|
|
kubectl auth reconcile -f my-rbac-rules.yaml --dry-run=client
|
|
```
|
|
|
|
* Apply a manifest file of RBAC objects, preserving any extra permissions (in roles) and any extra subjects (in bindings):
|
|
|
|
```shell
|
|
kubectl auth reconcile -f my-rbac-rules.yaml
|
|
```
|
|
|
|
* Apply a manifest file of RBAC objects, removing any extra permissions (in roles) and any extra subjects (in bindings):
|
|
|
|
```shell
|
|
kubectl auth reconcile -f my-rbac-rules.yaml --remove-extra-subjects --remove-extra-permissions
|
|
```
|
|
|
|
## ServiceAccount permissions {#service-account-permissions}
|
|
|
|
Default RBAC policies grant scoped permissions to control-plane components, nodes,
|
|
and controllers, but grant *no permissions* to service accounts outside the `kube-system` namespace
|
|
(beyond discovery permissions given to all authenticated users).
|
|
|
|
This allows you to grant particular roles to particular ServiceAccounts as needed.
|
|
Fine-grained role bindings provide greater security, but require more effort to administrate.
|
|
Broader grants can give unnecessary (and potentially escalating) API access to
|
|
ServiceAccounts, but are easier to administrate.
|
|
|
|
In order from most secure to least secure, the approaches are:
|
|
|
|
1. Grant a role to an application-specific service account (best practice)
|
|
|
|
This requires the application to specify a `serviceAccountName` in its pod spec,
|
|
and for the service account to be created (via the API, application manifest, `kubectl create serviceaccount`, etc.).
|
|
|
|
For example, grant read-only permission within "my-namespace" to the "my-sa" service account:
|
|
|
|
```shell
|
|
kubectl create rolebinding my-sa-view \
|
|
--clusterrole=view \
|
|
--serviceaccount=my-namespace:my-sa \
|
|
--namespace=my-namespace
|
|
```
|
|
|
|
2. Grant a role to the "default" service account in a namespace
|
|
|
|
If an application does not specify a `serviceAccountName`, it uses the "default" service account.
|
|
|
|
{{< note >}}
|
|
Permissions given to the "default" service account are available to any pod
|
|
in the namespace that does not specify a `serviceAccountName`.
|
|
{{< /note >}}
|
|
|
|
For example, grant read-only permission within "my-namespace" to the "default" service account:
|
|
|
|
```shell
|
|
kubectl create rolebinding default-view \
|
|
--clusterrole=view \
|
|
--serviceaccount=my-namespace:default \
|
|
--namespace=my-namespace
|
|
```
|
|
|
|
Many [add-ons](/docs/concepts/cluster-administration/addons/) run as the
|
|
"default" service account in the `kube-system` namespace.
|
|
To allow those add-ons to run with super-user access, grant cluster-admin
|
|
permissions to the "default" service account in the `kube-system` namespace.
|
|
|
|
{{< caution >}}
|
|
Enabling this means the `kube-system` namespace contains Secrets
|
|
that grant super-user access to your cluster's API.
|
|
{{< /caution >}}
|
|
|
|
```shell
|
|
kubectl create clusterrolebinding add-on-cluster-admin \
|
|
--clusterrole=cluster-admin \
|
|
--serviceaccount=kube-system:default
|
|
```
|
|
|
|
3. Grant a role to all service accounts in a namespace
|
|
|
|
If you want all applications in a namespace to have a role, no matter what service account they use,
|
|
you can grant a role to the service account group for that namespace.
|
|
|
|
For example, grant read-only permission within "my-namespace" to all service accounts in that namespace:
|
|
|
|
```shell
|
|
kubectl create rolebinding serviceaccounts-view \
|
|
--clusterrole=view \
|
|
--group=system:serviceaccounts:my-namespace \
|
|
--namespace=my-namespace
|
|
```
|
|
|
|
4. Grant a limited role to all service accounts cluster-wide (discouraged)
|
|
|
|
If you don't want to manage permissions per-namespace, you can grant a cluster-wide role to all service accounts.
|
|
|
|
For example, grant read-only permission across all namespaces to all service accounts in the cluster:
|
|
|
|
```shell
|
|
kubectl create clusterrolebinding serviceaccounts-view \
|
|
--clusterrole=view \
|
|
--group=system:serviceaccounts
|
|
```
|
|
|
|
5. Grant super-user access to all service accounts cluster-wide (strongly discouraged)
|
|
|
|
If you don't care about partitioning permissions at all, you can grant super-user access to all service accounts.
|
|
|
|
{{< warning >}}
|
|
This allows any application full access to your cluster, and also grants
|
|
any user with read access to Secrets (or the ability to create any pod)
|
|
full access to your cluster.
|
|
{{< /warning >}}
|
|
|
|
```shell
|
|
kubectl create clusterrolebinding serviceaccounts-cluster-admin \
|
|
--clusterrole=cluster-admin \
|
|
--group=system:serviceaccounts
|
|
```
|
|
|
|
## Upgrading from ABAC
|
|
|
|
Clusters that originally ran older Kubernetes versions often used
|
|
permissive ABAC policies, including granting full API access to all
|
|
service accounts.
|
|
|
|
Default RBAC policies grant scoped permissions to control-plane components, nodes,
|
|
and controllers, but grant *no permissions* to service accounts outside the `kube-system` namespace
|
|
(beyond discovery permissions given to all authenticated users).
|
|
|
|
While far more secure, this can be disruptive to existing workloads expecting to automatically receive API permissions.
|
|
Here are two approaches for managing this transition:
|
|
|
|
### Parallel authorizers
|
|
|
|
Run both the RBAC and ABAC authorizers, and specify a policy file that contains
|
|
the [legacy ABAC policy](/docs/reference/access-authn-authz/abac/#policy-file-format):
|
|
|
|
```
|
|
--authorization-mode=...,RBAC,ABAC --authorization-policy-file=mypolicy.json
|
|
```
|
|
|
|
To explain that first command line option in detail: if earlier authorizers, such as Node,
|
|
deny a request, then the RBAC authorizer attempts to authorize the API request. If RBAC
|
|
also denies that API request, the ABAC authorizer is then run. This means that any request
|
|
allowed by *either* the RBAC or ABAC policies is allowed.
|
|
|
|
When the kube-apiserver is run with a log level of 5 or higher for the RBAC component
|
|
(`--vmodule=rbac*=5` or `--v=5`), you can see RBAC denials in the API server log
|
|
(prefixed with `RBAC`).
|
|
You can use that information to determine which roles need to be granted to which users, groups, or service accounts.
|
|
|
|
Once you have [granted roles to service accounts](#service-account-permissions) and workloads
|
|
are running with no RBAC denial messages in the server logs, you can remove the ABAC authorizer.
|
|
|
|
### Permissive RBAC permissions
|
|
|
|
You can replicate a permissive ABAC policy using RBAC role bindings.
|
|
|
|
{{< warning >}}
|
|
The following policy allows **ALL** service accounts to act as cluster administrators.
|
|
Any application running in a container receives service account credentials automatically,
|
|
and could perform any action against the API, including viewing secrets and modifying permissions.
|
|
This is not a recommended policy.
|
|
|
|
```shell
|
|
kubectl create clusterrolebinding permissive-binding \
|
|
--clusterrole=cluster-admin \
|
|
--user=admin \
|
|
--user=kubelet \
|
|
--group=system:serviceaccounts
|
|
```
|
|
{{< /warning >}}
|
|
|
|
After you have transitioned to use RBAC, you should adjust the access controls
|
|
for your cluster to ensure that these meet your information security needs.
|