定义角色编辑

角色由以下 JSON 结构定义

{
  "run_as": [ ... ], 
  "cluster": [ ... ], 
  "global": { ... }, 
  "indices": [ ... ], 
  "applications": [ ... ], 
  "remote_indices": [ ... ] 
}

此角色所有者可以模拟的用户名的列表。

集群权限的列表。这些权限定义了拥有此角色的用户能够执行的集群级别操作。此字段是可选的(缺少 cluster 权限实际上意味着没有集群级别权限)。

定义全局权限的对象。全局权限是请求敏感的集群权限形式。标准集群权限仅根据正在执行的操作进行授权决策。全局权限还会考虑请求中包含的参数。目前,对全局权限的支持仅限于应用程序权限的管理。此字段是可选的。

索引权限条目的列表。此字段是可选的(缺少 indices 权限实际上意味着没有索引级别权限)。

应用程序权限条目的列表。此字段是可选的。

用于使用基于 API 密钥的模型配置的远程集群的索引权限条目的列表。此字段是可选的(缺少 remote_indices 权限实际上意味着任何基于 API 密钥的远程集群都没有索引级别权限)。

角色名称必须至少为 1 个字符,最多为 507 个字符。它们可以包含字母数字字符 (a-z, A-Z, 0-9)、空格、标点符号和基本拉丁语(ASCII)块中的可打印符号。不允许前导或尾随空格。

索引权限编辑

以下描述了索引权限条目的结构

{
  "names": [ ... ], 
  "privileges": [ ... ], 
  "field_security" : { ... }, 
  "query": "...", 
  "allow_restricted_indices": false 
}

数据流、索引和别名的列表,这些列表将应用于此条目中的权限。支持通配符 (*)。

角色所有者在 names 参数中指定的关联数据流和索引上的索引级别权限。

角色所有者具有读取访问权限的文档字段的规范。有关详细信息,请参阅设置字段和文档级别安全性

定义角色所有者具有读取访问权限的文档的搜索查询。关联数据流和索引中的文档必须与该查询匹配,才能被角色所有者访问。

受限索引是用于存储配置数据的特殊索引类别,不应直接访问。通常,只有内部系统角色应该授予对受限索引的权限。强烈建议不要切换此标志,因为它可能有效地授予对关键数据的无限制操作,从而使整个系统不稳定或泄露敏感信息。但是,如果出于管理目的,您需要创建具有涵盖受限索引的权限的角色,则必须将此字段设置为 true(默认值为 false),然后 names 字段也将涵盖受限索引。

names 参数接受可能引用多个数据流、索引和别名的通配符和正则表达式。

  • 通配符(默认) - 简单的通配符匹配,其中 * 是零个或多个字符的占位符,? 是单个字符的占位符,\ 可用作转义字符。
  • 正则表达式 - 用于匹配更复杂模式的更强大的语法。此正则表达式基于 Lucene 的 regexp 自动机语法。要启用此语法,它必须用一对正斜杠 (/) 括起来。任何以 / 开头但不以 / 结尾的模式都被认为是格式错误的。

正则表达式示例。

"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 /

全局权限编辑

以下描述了全局权限条目的结构

{
  "application": {
    "manage": {    
      "applications": [ ... ] 
    }
  },
  "profile": {
    "write": { 
      "applications": [ ... ] 
    }
  }
}

管理应用程序权限的能力的权限

可以管理的应用程序名称列表。此列表支持通配符(例如 "myapp-*")和正则表达式(例如 "/app[0-9]*/"

写入任何用户配置文件的 accessdata 的能力的权限

写入权限限制到的名称、通配符和正则表达式的列表

应用程序权限编辑

以下描述了应用程序权限条目的结构

{
  "application": "my_app", 
  "privileges": [ ... ],   
  "resources": [ ... ]     
}

应用程序的名称。

要授予此角色的应用程序权限名称列表。

这些权限适用的资源。这些资源的处理方式与 indices 权限中的索引名称模式相同。这些资源对 Elasticsearch 安全功能没有任何特殊含义。

有关这些字段的验证规则的详细信息,请参阅添加应用程序权限 API

角色可以引用不存在的应用程序权限 - 也就是说,它们尚未通过添加应用程序权限 API 定义(或者它们已定义,但后来已删除)。在这种情况下,该权限无效,并且不会在具有权限 API中授予任何操作。

远程索引权限编辑

对于使用基于 API 密钥的模型配置的远程集群,远程索引权限可用于指定匹配远程集群的所需索引权限。最终有效的索引权限将是远程索引权限和跨集群 API 密钥的索引权限的交集。

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

索引权限条目相比,远程索引权限条目多了一个必需的 clusters 字段。否则,两者具有相同的结构。以下描述了远程索引权限条目的结构

{
  "clusters": [ ... ], 
  "names": [ ... ], 
  "privileges": [ ... ], 
  "field_security" : { ... }, 
  "query": "...", 
  "allow_restricted_indices": false 
}

远程集群别名的列表。它支持文字字符串以及通配符正则表达式。此字段是必需的。

数据流、索引和别名的列表,这些列表将应用于此条目中的权限。支持通配符 (*)。

角色所有者在 names 参数中指定的关联数据流和索引上的索引级别权限。

角色所有者具有读取访问权限的文档字段的规范。有关详细信息,请参阅设置字段和文档级别安全性

定义角色所有者具有读取访问权限的文档的搜索查询。关联数据流和索引中的文档必须与该查询匹配,才能被角色所有者访问。

受限索引是用于存储配置数据的特殊索引类别,不应直接访问。通常,只有内部系统角色应该授予对受限索引的权限。强烈建议不要切换此标志,因为它可能有效地授予对关键数据的无限制操作,从而使整个系统不稳定或泄露敏感信息。但是,如果出于管理目的,您需要创建具有涵盖受限索引的权限的角色,则必须将此字段设置为 true(默认值为 false),然后 names 字段也将涵盖受限索引。

示例编辑

以下代码段显示了 clicks_admin 角色的示例定义

POST /_security/role/clicks_admin
{
  "run_as": [ "clicks_watcher_1" ],
  "cluster": [ "monitor" ],
  "indices": [
    {
      "names": [ "events-*" ],
      "privileges": [ "read" ],
      "field_security" : {
        "grant" : [ "category", "@timestamp", "message" ]
      },
      "query": "{\"match\": {\"category\": \"click\"}}"
    }
  ]
}

根据以上定义,拥有 clicks_admin 角色的用户可以

  • 模拟 clicks_watcher_1 用户并代表其执行请求。
  • 监控 Elasticsearch 集群
  • 从所有以 events- 为前缀的索引中读取数据
  • 在这些索引中,仅读取 click 类别的事件
  • 在这些文档中,仅读取 category@timestampmessage 字段。

有关可用集群和索引权限的完整列表

有两种可用的机制来定义角色:使用角色管理 API 或在 Elasticsearch 节点的本地文件中。您还可以实现自定义角色提供程序。如果您需要与另一个系统集成以检索用户角色,则可以构建自定义角色提供程序插件。有关更多信息,请参阅自定义角色和授权

角色管理 UI编辑

您可以在 Kibana 中轻松管理用户和角色。要管理角色,请登录 Kibana 并转到管理 / 安全 / 角色

角色管理 API编辑

角色管理 API 使您能够动态添加、更新、删除和检索角色。当您使用 API 在 native 领域中管理角色时,角色将存储在内部 Elasticsearch 索引中。有关更多信息和示例,请参阅角色

基于文件的角色管理编辑

除了角色管理 API 之外,角色还可以定义在位于 ES_PATH_CONF 中的本地 roles.yml 文件中。这是一个 YAML 文件,其中每个角色定义都以其名称为键。

如果在 roles.yml 文件和角色管理 API 中使用相同的角色名称,则将使用文件中找到的角色。

虽然角色管理 API 是定义角色的首选机制,但如果您想定义没有人(除了拥有 Elasticsearch 节点物理访问权限的管理员)可以更改的固定角色,则使用 roles.yml 文件会很有用。但是请注意,roles.yml 文件作为最小管理功能提供,并非旨在涵盖和用于定义所有用例的角色。

您无法使用 角色管理 UI角色管理 API 查看、编辑或删除在 roles.yml 中定义的任何角色。

roles.yml 文件由节点本地管理,而不是由集群全局管理。这意味着在典型的多节点集群中,需要在集群中的每个节点上应用完全相同的更改。

更安全的方法是在其中一个节点上应用更改,并将 roles.yml 分发/复制到集群中的所有其他节点(手动或使用配置管理系统,例如 Puppet 或 Chef)。

以下代码段显示了 roles.yml 文件配置的示例

click_admins:
  run_as: [ 'clicks_watcher_1' ]
  cluster: [ 'monitor' ]
  indices:
    - names: [ 'events-*' ]
      privileges: [ 'read' ]
      field_security:
        grant: ['category', '@timestamp', 'message' ]
      query: '{"match": {"category": "click"}}'

Elasticsearch 持续监控 roles.yml 文件,并自动获取并应用对它的任何更改。