123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- [role="xpack"]
- [[authorization]]
- == Configuring role-based access control
- {security} introduces the concept of _authorization_ to {es}.
- Authorization is the process of determining whether the user behind an incoming
- request is allowed to execute it. This process takes place once a request is
- successfully authenticated and the user behind the request is identified.
- [[roles]]
- [float]
- === Roles, permissions, and privileges
- The authorization process revolves around the following 5 constructs:
- _Secured Resource_::
- A resource to which access is restricted. Indices/aliases, documents, fields,
- users and the {es} cluster itself are all examples of secured objects.
- _Privilege_::
- A named group representing one or more actions that a user may execute against a
- secured resource. Each secured resource has its own sets of available privileges.
- For example, `read` is an index privilege that represents all actions that enable
- reading the indexed/stored data. For a complete list of available privileges
- see <<security-privileges>>.
- _Permissions_::
- A set of one or more privileges against a secured resource. Permissions can
- easily be described in words, here are few examples:
- * `read` privilege on the `products` index
- * `manage` privilege on the cluster
- * `run_as` privilege on `john` user
- * `read` privilege on documents that match query X
- * `read` privilege on `credit_card` field
- _Role_::
- A named sets of permissions
- _User_::
- The authenticated user.
- A secure {es} cluster manages the privileges of users through _roles_.
- A role has a unique name and identifies a set of permissions that translate to
- privileges on resources. A user can be associated with an arbitrary number of
- roles. The total set of permissions that a user has is therefore defined by
- union of the permissions in all its roles.
- As an administrator, you will need to define the roles that you want to use,
- then assign users to the roles. These can be assigned to users in a number of
- ways depending on the realms by which the users are authenticated.
- [[built-in-roles]]
- === Built-in roles
- {security} applies a default role to all users, including
- <<anonymous-access, anonymous users>>. The default role enables users to access
- the authenticate endpoint, change their own passwords, and get information about
- themselves.
- {security} also provides a set of built-in roles you can explicitly assign
- to users. These roles have a fixed set of privileges and cannot be updated.
- [[built-in-roles-ingest-user]] `ingest_admin` ::
- Grants access to manage *all* index templates and *all* ingest pipeline configurations.
- +
- NOTE: This role does *not* provide the ability to create indices; those privileges
- must be defined in a separate role.
- [[built-in-roles-kibana-dashboard]] `kibana_dashboard_only_user` ::
- Grants access to the {kib} Dashboard and read-only permissions on the `.kibana`
- index. This role does not have access to editing tools in {kib}. For more
- information, see
- {kibana-ref}/xpack-dashboard-only-mode.html[{kib} Dashboard Only Mode].
- [[built-in-roles-kibana-system]] `kibana_system` ::
- Grants access necessary for the {kib} system user to read from and write to the
- {kib} indices, manage index templates, and check the availability of the {es} cluster.
- This role grants read access to the `.monitoring-*` indices and read and write access
- to the `.reporting-*` indices. For more information, see
- {kibana-ref}/using-kibana-with-security.html[Configuring Security in {kib}].
- +
- NOTE: This role should not be assigned to users as the granted permissions may
- change between releases.
- [[built-in-roles-kibana-user]] `kibana_user`::
- Grants the minimum privileges required for any user of {kib}. This role grants
- access to the {kib} indices and grants monitoring privileges for the cluster.
- [[built-in-roles-logstash-admin]] `logstash_admin` ::
- Grants access to the `.logstash*` indices for managing configurations.
- [[built-in-roles-logstash-system]] `logstash_system` ::
- Grants access necessary for the Logstash system user to send system-level data
- (such as monitoring) to {es}. For more information, see
- {logstash-ref}/ls-security.html[Configuring Security in Logstash].
- +
- NOTE: This role should not be assigned to users as the granted permissions may
- change between releases.
- +
- NOTE: This role does not provide access to the logstash indices and is not
- suitable for use within a Logstash pipeline.
- [[built-in-roles-beats-system]] `beats_system` ::
- Grants access necessary for the Beats system user to send system-level data
- (such as monitoring) to {es}.
- +
- NOTE: This role should not be assigned to users as the granted permissions may
- change between releases.
- +
- NOTE: This role does not provide access to the beats indices and is not
- suitable for writing beats output to {es}.
- [[built-in-roles-ml-admin]] `machine_learning_admin`::
- Grants `manage_ml` cluster privileges and read access to the `.ml-*` indices.
- [[built-in-roles-ml-user]] `machine_learning_user`::
- Grants the minimum privileges required to view {xpackml} configuration,
- status, and results. This role grants `monitor_ml` cluster privileges and
- read access to the `.ml-notifications` and `.ml-anomalies*` indices,
- which store {ml} results.
- [[built-in-roles-monitoring-user]] `monitoring_user`::
- Grants the minimum privileges required for any user of {monitoring} other than those
- required to use {kib}. This role grants access to the monitoring indices and grants
- privileges necessary for reading basic cluster information. Monitoring users should
- also be assigned the `kibana_user` role.
- [[built-in-roles-remote-monitoring-agent]] `remote_monitoring_agent`::
- Grants the minimum privileges required for a remote monitoring agent to write data
- into this cluster.
- [[built-in-roles-reporting-user]] `reporting_user`::
- Grants the specific privileges required for users of {reporting} other than those
- required to use {kib}. This role grants access to the reporting indices. Reporting
- users should also be assigned the `kibana_user` role and a role that grants them
- access to the data that will be used to generate reports with.
- [[built-in-roles-superuser]] `superuser`::
- Grants full access to the cluster, including all indices and data. A user with
- the `superuser` role can also manage users and roles and
- <<run-as-privilege, impersonate>> any other user in the system. Due to the
- permissive nature of this role, take extra care when assigning it to a user.
- [[built-in-roles-transport-client]] `transport_client`::
- Grants the privileges required to access the cluster through the Java Transport
- Client. The Java Transport Client fetches information about the nodes in the
- cluster using the _Node Liveness API_ and the _Cluster State API_ (when
- sniffing is enabled). Assign your users this role if they use the
- Transport Client.
- +
- NOTE: Using the Transport Client effectively means the users are granted access
- to the cluster state. This means users can view the metadata over all indices,
- index templates, mappings, node and basically everything about the cluster.
- However, this role does not grant permission to view the data in all indices.
- [[built-in-roles-watcher-admin]] `watcher_admin`::
- +
- Grants write access to the `.watches` index, read access to the watch history and
- the triggered watches index and allows to execute all watcher actions.
- [[built-in-roles-watcher-user]] `watcher_user`::
- +
- Grants read access to the `.watches` index, the get watch action and the watcher
- stats.
- [[defining-roles]]
- === Defining roles
- A role is defined by the following JSON structure:
- [source,js]
- -----
- {
- "run_as": [ ... ], <1>
- "cluster": [ ... ], <2>
- "indices": [ ... ] <3>
- }
- -----
- <1> A list of usernames the owners of this role can <<run-as-privilege, impersonate>>.
- <2> A list of cluster privileges. These privileges define the
- cluster level actions users with this role are able to execute. This field
- is optional (missing `cluster` privileges effectively mean no cluster level
- permissions).
- <3> A list of indices permissions entries. This field is optional (missing `indices`
- privileges effectively mean no index level permissions).
- [[valid-role-name]]
- NOTE: Role names must be at least 1 and no more than 1024 characters. They can
- contain alphanumeric characters (`a-z`, `A-Z`, `0-9`), spaces,
- punctuation, and printable symbols in the https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)[Basic Latin (ASCII) block].
- Leading or trailing whitespace is not allowed.
- The following describes the structure of an indices permissions entry:
- [source,js]
- -------
- {
- "names": [ ... ], <1>
- "privileges": [ ... ], <2>
- "field_security" : { ... }, <3>
- "query": "..." <4>
- }
- -------
- <1> A list of indices (or index name patterns) to which the permissions in this
- entry apply.
- <2> The index level privileges the owners of the role have on the associated
- indices (those indices that are specified in the `name` field)
- <3> Specification for document fields the owners of the role have read access to.
- See <<field-and-document-access-control>> for details.
- <4> A search query that defines the documents the owners of the role have read
- access to. A document within the associated indices must match this query
- in order for it to be accessible by the owners of the role.
- [TIP]
- ==============================================================================
- When specifying index names, you can use indices and aliases with their full
- names or regular expressions that refer to multiple indices.
- * Wildcard (default) - simple wildcard matching where `*` is a placeholder
- for zero or more characters, `?` is a placeholder for a single character
- and `\` may be used as an escape character.
- * Regular Expressions - A more powerful syntax for matching more complex
- patterns. This regular expression is based on Lucene's regexp automaton
- syntax. To enable this syntax, it must be wrapped within a pair of
- forward slashes (`/`). Any pattern starting with `/` and not ending with
- `/` is considered to be malformed.
- .Example Regular Expressions
- [source,yaml]
- ------------------------------------------------------------------------------
- "foo-bar": # match the literal `foo-bar`
- "foo-*": # match anything beginning with "foo-"
- "logstash-201?-*": # ? matches any one character
- "/.*-201[0-9]-.*/": # use a regex to match anything containing 2010-2019
- "/foo": # syntax error - missing final /
- ------------------------------------------------------------------------------
- ==============================================================================
- The following snippet shows an example definition of a `clicks_admin` role:
- [source,js]
- -----------
- {
- "run_as": [ "clicks_watcher_1" ]
- "cluster": [ "monitor" ],
- "indices": [
- {
- "names": [ "events-*" ],
- "privileges": [ "read" ],
- "field_security" : {
- "grant" : [ "category", "@timestamp", "message" ]
- },
- "query": "{\"match\": {\"category\": \"click\"}}"
- }
- ]
- }
- -----------
- Based on the above definition, users owning the `clicks_admin` role can:
- * Impersonate the `clicks_watcher_1` user and execute requests on its behalf.
- * Monitor the {es} cluster
- * Read data from all indices prefixed with `events-`
- * Within these indices, only read the events of the `click` category
- * Within these document, only read the `category`, `@timestamp` and `message`
- fields.
- TIP: For a complete list of available <<security-privileges, cluster and indices privileges>>
- There are two available mechanisms to define roles: using the _Role Management APIs_
- or in local files on the {es} nodes. {security} also supports implementing
- custom roles providers. If you need to integrate with another system to retrieve
- user roles, you can build a custom roles provider plugin. For more information,
- see <<custom-roles-provider, Custom Roles Provider Extension>>.
- [float]
- [[roles-management-ui]]
- === Role management UI
- {security} enables you to easily manage users and roles from within {kib}. To
- manage roles, log in to {kib} and go to *Management / Elasticsearch / Roles*.
- [float]
- [[roles-management-api]]
- === Role management API
- The _Role Management APIs_ enable you to add, update, remove and retrieve roles
- dynamically. When you use the APIs to manage roles in the `native` realm, the
- roles are stored in an internal {es} index. For more information and examples,
- see {ref}/security-api-roles.html[Role Management APIs].
- [float]
- [[roles-management-file]]
- === File-based role management
- Apart from the _Role Management APIs_, roles can also be defined in local
- `roles.yml` file located in `CONFIG_DIR`. This is a YAML file where each
- role definition is keyed by its name.
- [IMPORTANT]
- ==============================
- If the same role name is used in the `roles.yml` file and through the
- _Role Management APIs_, the role found in the file will be used.
- ==============================
- While the _Role Management APIs_ is the preferred mechanism to define roles,
- using the `roles.yml` file becomes useful if you want to define fixed roles that
- no one (beside an administrator having physical access to the {es} nodes)
- would be able to change.
- [IMPORTANT]
- ==============================
- The `roles.yml` file is managed locally by the node and is not globally by the
- cluster. This means that with a typical multi-node cluster, the exact same
- changes need to be applied on each and every node in the cluster.
- A safer approach would be to apply the change on one of the nodes and have the
- `roles.yml` distributed/copied to all other nodes in the cluster (either
- manually or using a configuration management system such as Puppet or Chef).
- ==============================
- The following snippet shows an example of the `roles.yml` file configuration:
- [source,yaml]
- -----------------------------------
- click_admins:
- run_as: [ 'clicks_watcher_1' ]
- cluster: [ 'monitor' ]
- indices:
- - names: [ 'events-*' ]
- privileges: [ 'read' ]
- field_security:
- grant: ['category', '@timestamp', 'message' ]
- query: '{"match": {"category": "click"}}'
- -----------------------------------
- {security} continuously monitors the `roles.yml` file and automatically picks
- up and applies any changes to it.
- include::alias-privileges.asciidoc[]
- include::mapping-roles.asciidoc[]
- include::field-and-document-access-control.asciidoc[]
- include::run-as-privilege.asciidoc[]
- include::custom-roles-provider.asciidoc[]
|