创建或更新角色 API

编辑

在原生 realm 中添加和更新角色。

请求

编辑

POST /_security/role/<name>

PUT /_security/role/<name>

先决条件

编辑
  • 要使用此 API,您必须至少拥有 manage_security 集群权限。

描述

编辑

角色管理 API 通常是管理角色的首选方式,而不是使用 基于文件的角色管理。创建或更新角色 API 不能更新在角色文件中定义的角色。

路径参数

编辑
name
(string) 角色的名称。

请求体

编辑

以下参数可以在 PUT 或 POST 请求的主体中指定,并与添加角色相关

applications

(list) 应用程序权限条目的列表。

application (必需)
(string) 此条目适用的应用程序的名称
privileges
(list) 字符串列表,其中每个元素是应用程序权限或操作的名称。
resources
(list) 应用权限的资源列表。
cluster
(list) 集群权限的列表。这些权限定义了拥有此角色的用户能够执行的集群级操作。
description
(string) 角色的描述。最大长度为 1000 个字符。
global
(object) 定义全局权限的对象。全局权限是一种请求感知的集群权限形式。目前,对全局权限的支持仅限于管理应用程序权限。此字段是可选的。
indices

(list) 索引权限条目的列表。

field_security
(object) 角色所有者拥有读取权限的文档字段。有关更多信息,请参阅 设置字段和文档级别安全性
names (必需)
(list) 此条目中的权限适用的索引(或索引名称模式)的列表。
privileges(必需)
(list) 角色所有者在指定索引上拥有的索引级别权限。
query
一个搜索查询,定义角色所有者具有读取权限的文档。指定索引中的文档必须与此查询匹配,角色所有者才能访问该文档。
metadata
(object) 可选的元数据。在 metadata 对象中,以 _ 开头的键保留供系统使用。
run_as
(list) 此角色的所有者可以模拟的用户列表。有关更多信息,请参阅 代表其他用户提交请求
remote_indices

(list) 远程索引权限条目的列表。

远程索引对于使用 API 密钥模型配置的远程集群有效。对于基于证书模型配置的远程集群,它们不起作用。

clusters (必需)
(list) 此条目中的权限适用的集群别名列表。
field_security
(object) 角色所有者拥有读取权限的文档字段。有关更多信息,请参阅 设置字段和文档级别安全性
names (必需)
(list) 远程集群(使用 clusters 指定)上,此条目中的权限适用的索引(或索引名称模式)列表。
privileges(必需)
(list) 角色所有者在指定索引上拥有的索引级别权限。
query
一个搜索查询,定义角色所有者具有读取权限的文档。指定索引中的文档必须与此查询匹配,角色所有者才能访问该文档。
remote_cluster

(list) 远程集群权限条目的列表。

远程集群权限对于使用 API 密钥模型配置的远程集群有效。对于基于证书模型配置的远程集群,它们不起作用。

clusters (必需)
(list) 此条目中的权限适用的集群别名列表。
privileges(必需)
(list) 角色所有者在指定集群中拥有的集群级别权限。注意 - 只有一部分集群权限支持远程集群。内置权限 API 可用于确定每个版本允许的权限。

有关更多信息,请参阅 定义角色

示例

编辑

以下示例添加一个名为 my_admin_role 的角色

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
    },
)
print(resp)
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,
  },
});
console.log(response);
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
  }
}

成功的调用将返回一个 JSON 结构,显示角色是已创建还是已更新。

{
  "role": {
    "created": true 
  }
}

当更新现有角色时,created 设置为 false。

以下示例配置一个可以在 JDBC 中运行 SQL 的角色

resp = client.security.put_role(
    name="cli_or_drivers_minimal",
    cluster=[
        "cluster:monitor/main"
    ],
    indices=[
        {
            "names": [
                "test"
            ],
            "privileges": [
                "read",
                "indices:admin/get"
            ]
        }
    ],
)
print(resp)
const response = await client.security.putRole({
  name: "cli_or_drivers_minimal",
  cluster: ["cluster:monitor/main"],
  indices: [
    {
      names: ["test"],
      privileges: ["read", "indices:admin/get"],
    },
  ],
});
console.log(response);
POST /_security/role/cli_or_drivers_minimal
{
  "cluster": ["cluster:monitor/main"],
  "indices": [
    {
      "names": ["test"],
      "privileges": ["read", "indices:admin/get"]
    }
  ]
}

以下示例配置一个具有远程索引和远程集群权限的角色,用于远程集群

resp = client.security.put_role(
    name="only_remote_access_role",
    remote_indices=[
        {
            "clusters": [
                "my_remote"
            ],
            "names": [
                "logs*"
            ],
            "privileges": [
                "read",
                "read_cross_cluster",
                "view_index_metadata"
            ]
        }
    ],
    remote_cluster=[
        {
            "clusters": [
                "my_remote"
            ],
            "privileges": [
                "monitor_stats"
            ]
        }
    ],
)
print(resp)
const response = await client.security.putRole({
  name: "only_remote_access_role",
  remote_indices: [
    {
      clusters: ["my_remote"],
      names: ["logs*"],
      privileges: ["read", "read_cross_cluster", "view_index_metadata"],
    },
  ],
  remote_cluster: [
    {
      clusters: ["my_remote"],
      privileges: ["monitor_stats"],
    },
  ],
});
console.log(response);
POST /_security/role/only_remote_access_role
{
  "remote_indices": [
    {
      "clusters": ["my_remote"], 
      "names": ["logs*"], 
      "privileges": ["read", "read_cross_cluster", "view_index_metadata"] 
    }
  ],
  "remote_cluster": [
    {
      "clusters": ["my_remote"], 
      "privileges": ["monitor_stats"]  
    }
  ]
}

远程索引和远程集群权限适用于别名为 my_remote 的远程集群。

为远程集群 (my_remote) 上与模式 logs* 匹配的索引授予权限。

my_remote 上的 logs* 授予的实际索引权限

my_remote 授予的实际集群权限。注意 - 只有一部分集群权限支持远程集群。