All methods and paths for this operation:
The role management APIs are generally the preferred way to manage roles in the native realm, rather than using file-based role management. The create or update roles API cannot update roles that are defined in roles files. File-based role management is not available in Elastic Serverless.
Required authorization
- Cluster privileges:
manage_security
Path parameters
-
The name of the role that is being created or updated. On Elasticsearch Serverless, the role name must begin with a letter or digit and can only contain letters, digits and the characters '_', '-', and '.'. Each role must have a unique name, as this will serve as the identifier for that role.
Query parameters
-
If
true(the default) then refresh the affected shards to make this operation visible to search, ifwait_forthen wait for a refresh to make this operation visible to search, iffalsethen do nothing with refreshes.Values are
true,false, orwait_for.
Body Required
-
A list of application privilege entries.
-
A list of cluster privileges. These privileges define the cluster-level actions for users with this role.
-
A list of indices permissions entries.
-
Optional metadata. Within the metadata object, keys that begin with an underscore (
_) are reserved for system use. -
A list of users that the owners of this role can impersonate. Note: in Serverless, the run-as feature is disabled. For API compatibility, you can still specify an empty
run_asfield, but a non-empty list will be rejected. -
Optional description of the role descriptor
-
Indicates roles that might be incompatible with the current cluster license, specifically roles with document and field level security. When the cluster license doesn’t allow certain features for a given role, this parameter is updated dynamically to list the incompatible features. If
enabledisfalse, the role is ignored, but is still listed in the response from the authenticate API.
POST /_security/role/my_admin_role { "description": "Grants full access to all management features within the cluster.", "cluster": ["all"], "indices": [ { "names": [ "index1", "index2" ], "privileges": ["all"], "field_security" : { // optional "grant" : [ "title", "body" ] }, "query": "{\"match\": {\"title\": \"foo\"}}" // optional } ], "applications": [ { "application": "myapp", "privileges": [ "admin", "read" ], "resources": [ "*" ] } ], "run_as": [ "other_user" ], // optional "metadata" : { // optional "version" : 1 } } resp = client.security.put_role( name="my_admin_role", description="Grants full access to all management features within the cluster.", cluster=[ "all" ], indices=[ { "names": [ "index1", "index2" ], "privileges": [ "all" ], "field_security": { "grant": [ "title", "body" ] }, "query": "{\"match\": {\"title\": \"foo\"}}" } ], applications=[ { "application": "myapp", "privileges": [ "admin", "read" ], "resources": [ "*" ] } ], run_as=[ "other_user" ], metadata={ "version": 1 }, ) const response = await client.security.putRole({ name: "my_admin_role", description: "Grants full access to all management features within the cluster.", cluster: ["all"], indices: [ { names: ["index1", "index2"], privileges: ["all"], field_security: { grant: ["title", "body"], }, query: '{"match": {"title": "foo"}}', }, ], applications: [ { application: "myapp", privileges: ["admin", "read"], resources: ["*"], }, ], run_as: ["other_user"], metadata: { version: 1, }, }); response = client.security.put_role( name: "my_admin_role", body: { "description": "Grants full access to all management features within the cluster.", "cluster": [ "all" ], "indices": [ { "names": [ "index1", "index2" ], "privileges": [ "all" ], "field_security": { "grant": [ "title", "body" ] }, "query": "{\"match\": {\"title\": \"foo\"}}" } ], "applications": [ { "application": "myapp", "privileges": [ "admin", "read" ], "resources": [ "*" ] } ], "run_as": [ "other_user" ], "metadata": { "version": 1 } } ) $resp = $client->security()->putRole([ "name" => "my_admin_role", "body" => [ "description" => "Grants full access to all management features within the cluster.", "cluster" => array( "all", ), "indices" => array( [ "names" => array( "index1", "index2", ), "privileges" => array( "all", ), "field_security" => [ "grant" => array( "title", "body", ), ], "query" => "{\"match\": {\"title\": \"foo\"}}", ], ), "applications" => array( [ "application" => "myapp", "privileges" => array( "admin", "read", ), "resources" => array( "*", ), ], ), "run_as" => array( "other_user", ), "metadata" => [ "version" => 1, ], ], ]); curl -X POST -H "Authorization: ApiKey $ELASTIC_API_KEY" -H "Content-Type: application/json" -d '{"description":"Grants full access to all management features within the cluster.","cluster":["all"],"indices":[{"names":["index1","index2"],"privileges":["all"],"field_security":{"grant":["title","body"]},"query":"{\"match\": {\"title\": \"foo\"}}"}],"applications":[{"application":"myapp","privileges":["admin","read"],"resources":["*"]}],"run_as":["other_user"],"metadata":{"version":1}}' "$ELASTICSEARCH_URL/_security/role/my_admin_role" client.security().putRole(p -> p .applications(a -> a .application("myapp") .privileges(List.of("admin","read")) .resources("*") ) .cluster("all") .description("Grants full access to all management features within the cluster.") .indices(i -> i .fieldSecurity(f -> f .grant(List.of("title","body")) ) .names(List.of("index1","index2")) .privileges("all") .query(q -> q .match(m -> m .field("title") .query(FieldValue.of("foo")) ) ) ) .metadata("version", JsonData.fromJson("1")) .name("my_admin_role") .runAs("other_user") ); { "description": "Grants full access to all management features within the cluster.", "cluster": ["all"], "indices": [ { "names": [ "index1", "index2" ], "privileges": ["all"], "field_security" : { // optional "grant" : [ "title", "body" ] }, "query": "{\"match\": {\"title\": \"foo\"}}" // optional } ], "applications": [ { "application": "myapp", "privileges": [ "admin", "read" ], "resources": [ "*" ] } ], "run_as": [ "other_user" ], // optional "metadata" : { // optional "version" : 1 } } { "cluster": ["cluster:monitor/main"], "indices": [ { "names": ["test"], "privileges": ["read", "indices:admin/get"] } ] } { "remote_indices": [ { "clusters": ["my_remote"], "names": ["logs*"], "privileges": ["read", "read_cross_cluster", "view_index_metadata"] } ], "remote_cluster": [ { "clusters": ["my_remote"], "privileges": ["monitor_stats"] } ] } { "role": { "created": true } }