用户授权

edit

Elastic Stack 安全功能添加了授权,即确定传入请求背后的用户是否被允许执行请求的过程。

此过程在用户成功识别并 认证后进行。

基于角色的访问控制

edit

安全功能提供了一个基于角色的访问控制(RBAC)机制, 这使您能够通过将权限分配给角色并将角色分配给用户或组来授权用户。

This image illustrates role-based access control

授权过程围绕以下结构展开:

Secured Resource
受限制访问的资源。索引、别名、文档、字段、用户以及 Elasticsearch 集群本身都是受保护对象的示例。
Privilege
一组用户可以对受保护资源执行的一个或多个操作的命名组。每个受保护资源都有自己的可用权限集。例如,read 是一个索引权限,表示所有能够读取索引/存储数据的操作。有关可用权限的完整列表,请参阅安全权限
Permissions

针对受保护资源的一组一个或多个权限。权限可以很容易地用语言描述,这里有一些例子:

  • readproducts 数据流或索引的权限
  • manage 对集群的权限
  • run_asjohn 用户的权限
  • read 对匹配查询 X 的文档的权限
  • readcredit_card 字段的权限
Role
一组命名的权限
User
已验证的用户。
Group
用户所属的一个或多个组。某些领域(如本地、文件或PKI领域)不支持组。

角色具有唯一的名称,并标识一组权限,这些权限对应于资源上的特权。您可以将用户或组与任意数量的角色关联。当您将角色映射到组时,该组中用户的角色是分配给该组的角色与分配给该用户的角色的组合。同样,用户拥有的总权限集由其所有角色中的权限的并集定义。

分配用户角色的方法因您用于用户身份验证的领域而异。有关更多信息,请参阅将用户和组映射到角色

基于属性的访问控制

edit

安全功能还提供了一种基于属性的访问控制(ABAC)机制,使您能够使用属性来限制对搜索查询和聚合中的文档的访问。例如,您可以为用户和文档分配属性,然后在角色定义中实施访问策略。具有该角色的用户只有在拥有所有必需属性时才能读取特定文档。

更多信息,请参阅 使用 X-Pack 6.1 进行文档级基于属性的访问控制

内置角色

edit

Elastic Stack 安全功能为所有用户应用了一个默认角色,包括 匿名用户。默认角色允许用户访问 认证端点,更改自己的密码,并获取有关自己的信息。

还有一组内置角色,您可以明确地分配给用户。这些角色具有一组固定的权限,并且不能更新。

apm_system
授予APM系统用户将系统级数据(如监控)发送到Elasticsearch所需的访问权限。
apm_user
授予APM用户所需的权限(例如,readview_index_metadata 权限在 apm-*.ml-anomalies* 索引上)。 [7.13.0] 在7.13.0中已弃用。请参阅APM应用程序用户和权限以获取替代方案。
beats_admin
授予访问 .management-beats 索引的权限,该索引包含 Beats 的配置信息。
beats_system

授予Beats系统用户必要的访问权限,以便将系统级数据(如监控)发送到Elasticsearch。

  • 此角色不应分配给用户,因为授予的权限可能会在版本之间发生变化。
  • 此角色不提供对beats索引的访问权限,也不适合将beats输出写入Elasticsearch。
data_frame_transforms_admin
授予 manage_data_frame_transforms 集群权限,使您能够管理转换。此角色还包括机器学习功能的全部 Kibana 权限 [7.5.0] 在 7.5.0 中已弃用。替换为 transform_admin
data_frame_transforms_user
授予 monitor_data_frame_transforms 集群权限,使您能够使用转换。此角色还包括机器学习功能的全部 Kibana 权限 [7.5.0] 在 7.5.0 中已弃用。由 transform_user 取代
editor

授予对Kibana中所有功能(包括解决方案)的完全访问权限,并对数据索引具有只读访问权限。

  • 此角色提供对任何不以前缀为点的索引的只读访问权限。
  • 此角色会自动授予对新Kibana功能的完全访问权限,只要它们一发布。
  • 某些Kibana功能可能还需要对数据索引的创建或写访问权限。机器学习数据框分析作业就是一个例子。对于此类功能,必须在单独的角色中定义这些权限。
enrich_user
授权管理所有的丰富索引(.enrich-*)以及所有的摄取管道操作。
inference_admin
提供inference_user角色的所有权限以及{inference} API的完全使用。授予manage_inference集群权限。
inference_user
提供查看{inference}配置和执行推理所需的最小权限。授予monintor_inference集群权限。
ingest_admin

授予管理所有索引模板和所有摄取管道配置的权限。

此角色不提供创建索引的能力;这些权限必须在单独的角色中定义。

kibana_dashboard_only_user
(此角色已弃用,请改用 Kibana 功能权限 ). 授予对 Kibana 仪表板的只读访问权限,适用于每个 Kibana 中的空间。 此角色无权访问 Kibana 中的编辑工具。
kibana_system

授予Kibana系统用户读取和写入Kibana索引、管理索引模板和令牌以及检查Elasticsearch集群可用性所需的访问权限。它还允许激活、搜索和检索用户配置文件,以及更新kibana-*命名空间的用户配置文件数据。此角色授予对.monitoring-*索引的读取访问权限和对.reporting-*索引的读取和写入访问权限。有关更多信息,请参阅在Kibana中配置安全性

此角色不应分配给用户,因为授予的权限可能会在不同版本之间发生变化。

kibana_admin
授予访问 Kibana 中所有功能的权限。有关 Kibana 授权的更多信息,请参阅 Kibana 授权
kibana_user
(此角色已弃用,请改用 kibana_admin 角色。) 授予对 Kibana 中所有功能的访问权限。有关 Kibana 授权的更多信息, 请参阅 Kibana 授权
logstash_admin
授予对 .logstash* 索引的管理配置权限,并授予 logstash x-pack 插件暴露的 logstash 特定 API 所需的访问权限。
logstash_system

授予Logstash系统用户发送系统级数据(如监控)到Elasticsearch所需的必要访问权限。更多信息,请参阅 Logstash中的安全配置

  • 此角色不应分配给用户,因为授予的权限可能会在不同版本之间发生变化。
  • 此角色不提供对logstash索引的访问权限,并且不适合在Logstash管道中使用。
machine_learning_admin
提供machine_learning_user角色的所有权限以及完全使用机器学习API的权限。授予manage_ml集群权限,对.ml-anomalies*.ml-notifications*.ml-state*.ml-meta*索引的读取权限以及对.ml-annotations*索引的写入权限。机器学习管理员还需要源索引和目标索引的索引权限以及授予访问Kibana的角色。请参阅机器学习安全权限
machine_learning_user
授予查看机器学习配置、状态以及处理结果所需的最小权限。此角色授予 monitor_ml 集群权限, 对 .ml-notifications.ml-anomalies* 索引(存储机器学习结果)的读取访问权限, 以及对 .ml-annotations* 索引的写入访问权限。 机器学习用户还需要对源索引和目标索引的索引权限,以及授予访问 Kibana 的角色。请参阅 机器学习安全权限
monitoring_user
授予X-Pack监控所需的最小权限,但不包括使用Kibana所需的权限。此角色授予对监控索引的访问权限,并授予读取基本集群信息所需的权限。此角色还包括Elastic Stack监控功能的所有Kibana权限。监控用户还应被分配kibana_admin角色,或其他具有访问Kibana实例权限的角色。
remote_monitoring_agent
授予将数据写入监控索引(.monitoring-*)所需的最小权限。此角色还具有创建Metricbeat索引(metricbeat-*)并将数据写入其中的必要权限。
remote_monitoring_collector
授予收集Elastic Stack监控数据所需的最小权限。
reporting_user
授予X-Pack报告用户所需的具体权限,但不包括使用Kibana所需的权限。此角色授予对报告索引的访问权限;每个用户只能访问自己的报告。 报告用户还应被分配其他角色,以授予对Kibana的访问权限以及对用于生成报告的索引的读取权限。
rollup_admin
授予 manage_rollup 集群权限,使您能够管理和执行所有汇总操作。
rollup_user
授予 monitor_rollup 集群权限,使您能够执行与汇总相关的只读操作。
snapshot_user
授予创建所有索引快照并查看其元数据的必要权限。此角色使用户能够查看现有快照仓库的配置和快照详细信息。它不授予删除或添加仓库或恢复快照的权限。它也不允许更改索引设置或读取或更新数据流或索引数据。
superuser

授予对集群管理和数据索引的完全访问权限。此角色还授予对受限索引(如.security)的直接只读访问权限。拥有superuser角色的用户可以冒充系统中的任何其他用户。

在 Elastic Cloud 上,所有标准用户,包括那些拥有 superuser 角色的用户,都被限制执行 仅限操作员 的操作。

此角色可以管理安全并创建具有无限权限的角色。 在将其分配给用户时要格外小心。

transform_admin
授予 manage_transform 集群权限,使您能够管理 转换。此角色还包括所有 Kibana 权限 用于机器学习功能。
transform_user
授予 monitor_transform 集群权限,使您能够执行与转换相关的只读操作。此角色还包括机器学习功能的全部 Kibana 权限
transport_client

授予通过Java Transport Client访问集群所需的权限。Java Transport Client使用节点活性API集群状态API(当嗅探功能启用时)获取集群中节点的信息。如果用户使用Transport Client,请为他们分配此角色。

使用 Transport Client 有效地意味着用户被授予访问集群状态的权限。这意味着用户可以查看所有索引的元数据、索引模板、映射、节点以及集群的基本信息。然而,此角色不授予查看所有索引中数据的权限。

viewer

授予对 Kibana 中所有功能(包括解决方案)和数据索引的只读访问权限。

  • 此角色提供对任何不以前缀为点的索引的只读访问权限。
  • 此角色会自动授予对新 Kibana 功能的只读访问权限,一旦这些功能可用。
watcher_admin

允许用户创建和执行所有 Watcher 操作。授予对 .watches 索引的读取访问权限。还授予对监视历史记录和触发的监视索引的读取访问权限。

watcher_user

授予对 .watches 索引、获取监视操作和监视器统计信息的读取访问权限。

定义角色

edit

角色由以下JSON结构定义:

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

此角色的所有者可以冒充的用户名列表。

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

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

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

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

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

为使用API密钥模型配置的远程集群列出的集群权限条目。此字段是可选的(缺少remote_cluster权限实际上意味着对任何基于API密钥的远程集群没有额外的集群权限)。

与角色关联的元数据字段,例如 metadata.app_tag。 元数据在内部被索引为 flattened 字段类型。 这意味着所有子字段在查询和排序时都像 keyword 字段一样。 元数据值可以是简单值,但也可以是列表和映射。 此字段是可选的。

一个包含角色描述文本的字符串值。 最大长度为1000个字符。 该字段在内部被索引为文本字段类型 (使用所有参数的默认值)。 此字段是可选的。

角色名称必须至少1个字符,且不超过507个字符。它们可以包含字母数字字符(a-zA-Z0-9)、空格、标点符号以及基本拉丁(ASCII)字符块中的可打印符号。不允许有前导或尾随空格。

索引权限

edit

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

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

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

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

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

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

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

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

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

示例正则表达式。

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

全局权限

edit

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

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

用于管理应用程序权限的权限

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

用于写入任何用户配置文件的访问数据的权限

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

应用程序权限

edit

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

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

应用程序的名称。

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

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

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

角色可能引用不存在的应用程序权限——也就是说,它们尚未通过添加应用程序权限API定义(或者它们曾经被定义,但后来被删除了)。在这种情况下,该权限没有任何效果,并且不会在has privileges API中授予任何操作。

远程索引权限

edit

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

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

远程索引权限条目相比索引权限条目多了一个额外的强制性clusters字段。否则,两者的结构是相同的。 以下描述了远程索引权限条目的结构:

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

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

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

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

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

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

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

远程集群权限

edit

对于使用基于API密钥模型配置的远程集群,远程集群权限可以用于为匹配的远程集群指定额外的集群权限。

远程集群权限仅对使用API密钥模型配置的远程集群有效。 它们对使用基于证书模型配置的远程集群没有影响。

以下描述了远程集群权限条目的结构:

{
  "clusters": [ ... ], 
  "privileges": [ ... ] 
}

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

远程集群的集群级别权限。这里允许的值是集群权限的一个子集。此字段是必需的。

远程集群的 monitor_enrich 权限在版本 8.15.0 中引入。目前,这是唯一可用于远程集群的权限,并且需要启用用户在跨集群的 ES|QL 查询中使用 ENRICH 关键字。

示例

edit

以下代码片段展示了一个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节点文件中定义。您还可以实现自定义角色提供者。如果您需要与另一个系统集成以检索用户角色,您可以构建一个自定义角色提供者插件。更多信息,请参阅自定义角色和授权

角色管理界面

edit

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

角色管理 API

edit

通过角色管理API,您可以动态地添加、更新、删除和检索角色。当您使用这些API在native领域中管理角色时,角色会存储在Elasticsearch的内部索引中。更多信息和示例,请参见Roles

基于文件的角色管理

edit

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

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

虽然角色管理API是定义角色的首选机制,但如果您想定义固定角色,即除了拥有物理访问Elasticsearch节点权限的管理员之外,没有人能够更改这些角色,那么使用roles.yml文件会变得很有用。但请注意,roles.yml文件仅作为最小的管理功能提供,并不旨在涵盖所有用例的角色定义。

您无法通过使用角色管理界面角色管理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 文件,并自动获取和应用对其所做的任何更改。

角色限制

edit

角色限制可以用来指定角色应生效的条件。 当条件不满足时,角色将被禁用,这将导致访问被拒绝。 不指定限制意味着角色不受限制,因此始终有效。 这是默认行为。

目前,角色限制仅支持用于API keys, 限制条件是API密钥只能有一个角色描述符。

工作流

edit

工作流允许将角色限制为仅在调用某些REST API时有效。 调用工作流不允许的REST API将导致角色被禁用。 以下部分列出了您可以限制角色的工作流:

search_application_query
此工作流将角色限制为仅使用搜索应用程序搜索API

工作流名称区分大小写。

示例

edit

以下示例创建了一个API密钥,该密钥具有对角色限制search_application_query工作流的限制, 该限制仅允许调用搜索应用程序搜索API

POST /_security/api_key
{
  "name": "my-restricted-api-key",
  "role_descriptors": {
    "my-restricted-role-descriptor": {
      "indices": [
        {
          "names": ["my-search-app"],
          "privileges": ["read"]
        }
      ],
      "restriction":  {
        "workflows": ["search_application_query"]
      }
    }
  }
}

安全权限

edit

本节列出了可以分配给角色的权限。

集群权限

edit

全部

所有集群管理操作,如快照、节点关闭/重启、设置更新、重新路由或管理用户和角色。

取消任务

取消任务和删除异步搜索的权限。 请参阅删除异步搜索 API 以获取更多信息。

创建快照

为现有仓库创建快照的权限。还可以列出和查看现有仓库和快照的详细信息。

此权限在 Elastic Cloud serverless 中不可用。

跨集群复制

用于连接配置了基于API密钥模型的远程集群 进行跨集群复制的权限。

此权限在Elastic Cloud无服务器环境中不可用。

此权限不应直接授予。它由 创建跨集群API密钥更新跨集群API密钥 内部使用,以管理跨集群API密钥。

跨集群搜索

用于跨集群搜索的基于API密钥模型配置的远程集群的连接权限。

此权限在Elastic Cloud无服务器版本中不可用。

此权限不应直接授予。它由创建跨集群API密钥更新跨集群API密钥内部使用,以管理跨集群API密钥。

grant_api_key

代表其他用户创建Elasticsearch API密钥的权限。

此权限在Elastic Cloud无服务器版本中不可用。

管理

基于monitor构建,并添加了改变集群中值的集群操作。 这包括快照、更新设置和重新路由。还包括获取快照和恢复状态。此权限不包括管理安全性的能力。

manage_api_key

Elasticsearch REST API 密钥上的所有安全相关操作,包括 创建新的 API 密钥获取 API 密钥信息查询 API 密钥更新 API 密钥批量更新 API 密钥使 API 密钥失效

  • 当您创建新的 API 密钥时,它们将始终归认证用户所有。
  • 当您拥有此权限时,您可以使自己的 API 密钥和其他用户的 API 密钥失效。

manage_autoscaling

所有与管理自动扩展策略相关的操作。

此权限在 Elastic Cloud 无服务器版本中不可用。

manage_ccr

所有与管理追随者索引和自动跟随模式相关的跨集群复制操作。它还包括授予管理追随者索引和自动跟随模式所需权限的权限。此权限仅在包含追随者索引的集群上需要。

此权限在Elastic Cloud无服务器版中不可用。

manage_data_frame_transforms

所有与管理转换相关的操作。 [7.5] 在7.5中已弃用。 请改用manage_transform

此权限在Elastic Cloud无服务器环境中不可用。

manage_data_stream_global_retention

此权限无效。 [8.16] 在8.16版本中已弃用。

manage_enrich

所有与管理和执行丰富策略相关的操作。

manage_ilm

所有与管理策略相关的索引生命周期管理操作。

此权限在Elastic Cloud无服务器环境中不可用。

manage_index_templates

所有对索引模板的操作。

manage_inference

所有与管理推理相关的操作。

manage_ingest_pipelines

所有关于数据摄取管道的操作。

manage_logstash_pipelines

所有对logstash管道的操作。

manage_ml

所有机器学习操作,例如创建和删除数据馈送、作业和模型快照。

在版本6.2之前创建的数据馈送或在禁用安全功能时创建的数据馈送以具有提升权限的系统用户身份运行,包括读取所有索引的权限。较新的数据馈送以创建或更新它们的用户的安全角色运行。

manage_oidc

启用使用Elasticsearch API (OpenID Connect准备认证API, OpenID Connect认证API, 和 OpenID Connect登出API) 以代表其他用户启动和管理OpenID Connect认证。

此权限在Elastic Cloud无服务器中不可用。

manage_own_api_key

当前认证用户拥有的Elasticsearch API密钥的所有安全相关操作。这些操作包括 创建新的API密钥, 获取API密钥信息, 查询API密钥, 更新API密钥, 批量更新API密钥, 以及 使API密钥失效.

manage_pipeline

所有关于数据摄取管道的操作。

manage_rollup

所有汇总操作,包括创建、启动、停止和删除汇总作业。

此权限在 Elastic Cloud 无服务器环境中不可用。

manage_saml

启用使用内部 Elasticsearch API 来代表其他用户启动和管理 SAML 身份验证。

此权限在 Elastic Cloud 无服务器环境中不可用。

manage_search_application

搜索应用程序的所有CRUD操作。

manage_search_query_rules

查询规则的所有CRUD操作。

manage_search_synonyms

所有同义词管理操作都在 同义词API 上。

manage_security

所有与安全相关的操作,例如对用户和角色的CRUD操作以及缓存清除。

manage_service_account

所有与Elasticsearch服务账户相关的安全操作,包括 获取服务账户创建服务账户令牌删除服务账户令牌、 以及 获取服务账户凭证

此权限在Elastic Cloud无服务器版本中不可用。

manage_slm

所有快照生命周期管理(SLM)操作,包括创建和更新策略以及启动和停止SLM。

此权限在Elastic Cloud无服务器环境中不可用。

[8.15] 在8.15中已弃用。 还授予使用ILM startILM stop API启动和停止索引生命周期管理的权限。 在未来的主要版本中,此权限将不授予任何索引生命周期管理权限。

manage_token

所有与安全相关的操作,针对由 Elasticsearch Token 服务生成的令牌。

此权限在 Elastic Cloud 无服务器环境中不可用。

manage_transform

所有与管理转换相关的操作。

manage_watcher

所有观察器操作,例如放置观察器、执行、激活或确认。

此权限在 Elastic Cloud 无服务器版本中不可用。

在版本 6.1 之前创建的观察器或在禁用安全功能时创建的观察器以具有提升权限的系统用户身份运行,包括读取和写入所有索引的权限。较新的观察器以创建或更新它们的用户的安全角色运行。

监控

所有集群只读操作,如集群健康和状态、热线程、节点信息、节点和集群统计信息,以及待处理的集群任务。

monitor_data_stream_global_retention

此权限无效。 [8.16] 在8.16版本中已弃用。

monitor_enrich

所有与管理和执行富化策略相关的只读操作。

monitor_inference

所有与推理相关的只读操作。

monitor_ml

所有只读的机器学习操作,例如获取有关数据馈送、作业、模型快照或结果的信息。

monitor_rollup

所有只读汇总操作,例如查看历史和当前正在运行的汇总作业及其功能。

此权限在 Elastic Cloud 无服务器环境中不可用。

monitor_snapshot

列出和查看现有仓库和快照详情的权限。

此权限在 Elastic Cloud 无服务器环境中不可用。

monitor_text_structure

所有与查找结构API相关的只读操作。

此权限在Elastic Cloud无服务器环境中不可用。

monitor_transform

所有与转换相关的只读操作。

monitor_watcher

所有只读的观察器操作,例如获取观察器和观察器统计信息。

此权限在Elastic Cloud无服务器版本中不可用。

read_ccr

所有只读的跨集群复制操作,例如获取有关集群中领导索引的索引信息和元数据。它还包括检查用户是否具有适当的权限来跟随领导索引的权限。此权限仅在包含领导索引的集群上需要。

此权限在Elastic Cloud无服务器版中不可用。

read_ilm

所有只读索引生命周期管理操作,例如获取策略和检查索引生命周期管理的状态

此权限在 Elastic Cloud serverless 中不可用。

read_pipeline

只读访问摄取管道(获取、模拟)。

read_slm

所有只读的SLM操作,例如获取策略和检查SLM状态。

此权限在Elastic Cloud无服务器版中不可用。

[8.15] 在8.15中已弃用。 同时授予使用ILM获取状态API获取索引生命周期管理状态的权限。在未来的主要版本中,此权限将不再授予任何索引生命周期管理权限。

read_security

所有只读的安全相关操作,例如获取用户、用户配置文件、 Elasticsearch API 密钥、Elasticsearch 服务账户、角色和角色映射。 允许查询检索信息 关于所有 Elasticsearch API 密钥。

transport_client

传输客户端连接所需的所有权限。远程集群需要此权限以启用跨集群搜索

此权限在Elastic Cloud无服务器版本中不可用。

索引权限

edit

全部

对索引或数据流的任何操作。

自动配置

允许自动创建索引和数据流。自动创建操作是由于对不存在的索引或数据流进行索引批量请求,而不是显式的创建索引创建数据流请求。如果它们不与现有映射冲突,还允许自动更新索引和数据流的映射。自动更新映射操作是由于对包含可能映射的新字段的索引或数据流进行索引或批量请求,而不是显式的更新映射请求。

创建

索引文档的权限。

[8.0] 在8.0中已弃用。 还授予使用更新映射API或依赖于 动态字段映射来更新索引映射(但不包括数据流映射)的权限。在未来的主要版本中,此权限将不再授予任何映射更新权限。

此权限不限制索引操作仅限于创建文档,而是限制API使用仅限于索引API。索引API允许用户覆盖之前索引的文档。请参阅create_doc权限作为替代方案。

create_doc

索引文档的权限。 它不授予更新或覆盖现有文档的权限。

[8.0] 在8.0中已弃用。 还授予使用 更新映射API或通过依赖 动态字段映射更新索引映射(但不包括数据流映射)的权限。在未来的主要版本中,此权限将不授予任何映射更新权限。

此权限依赖于索引请求的op_type索引批量)。当以拥有create_doc 权限(且没有更高权限如indexwrite)的用户身份摄取文档时,您必须确保 op_type 设置为 create,通过以下方式之一:

  • 在索引或批量API中显式设置op_type
  • 使用索引API的_create端点
  • 创建带有自动生成_id的文档

create_index

创建索引或数据流的权限。创建索引请求可能包含在创建索引后要添加的别名。在这种情况下,请求还需要对索引和别名名称具有manage权限。

跨集群复制

对位于使用API密钥模型配置的远程集群上的索引执行跨集群复制的权限。 此权限应仅用于远程索引权限privileges字段。

此权限在Elastic Cloud无服务器版本中不可用。

cross_cluster_replication_internal

用于从配置了基于API密钥模型的远程集群执行跨集群复制支持操作的权限。

此权限在Elastic Cloud无服务器版本中不可用。

此权限不应直接授予。它由创建跨集群API密钥更新跨集群API密钥内部使用,以管理跨集群API密钥。

删除

删除文档的权限。

delete_index

删除索引或数据流的权限。

索引

索引和更新文档的权限。

[8.0] 在8.0中已弃用。 还授予使用 更新映射API 或依赖于 动态字段映射 来更新索引映射(但不包括数据流映射)的权限。在未来的主要版本中,此权限将不再授予任何映射更新权限。

维护

允许刷新、刷新、同步刷新和强制合并索引管理操作。 没有读取或写入索引数据或以其他方式管理索引的权限。

管理

所有monitor权限加上索引和数据流管理(别名、 分析、缓存清除、关闭、删除、存在、刷新、映射、打开、字段能力、 强制合并、刷新、设置、搜索分片、验证查询)。

管理数据流生命周期

所有与读取和管理数据流内置生命周期相关的数据流生命周期操作。 这包括向数据流添加和移除生命周期等操作。

manage_follow_index

管理跟随者索引生命周期所需的所有操作,包括创建跟随者索引、关闭它以及将其转换为常规索引。此权限仅在包含跟随者索引的集群上才需要。

此权限在 Elastic Cloud 无服务器版中不可用。

manage_ilm

所有与管理索引或数据流策略执行相关的索引生命周期管理操作。这包括重试策略和从索引或数据流中移除策略等操作。

此权限在Elastic Cloud无服务器版本中不可用。

manage_leader_index

管理领导者索引生命周期所需的所有操作,包括忘记跟随者。此权限仅在包含领导者索引的集群上才需要。

此权限在Elastic Cloud无服务器版本中不可用。

监控

所有用于监控的操作(恢复、段信息、索引统计和状态)。

读取

只读访问操作(计数、解释、获取、批量获取、获取索引脚本、 更多类似内容、多重过滤/搜索/术语向量、过滤、滚动、 清除滚动、搜索、建议、电视)。

read_cross_cluster

远程集群中对搜索操作的只读访问权限。

此权限在Elastic Cloud无服务器版本中不可用。

view_index_metadata

只读访问索引和数据流元数据(别名、存在性、字段能力、字段映射、获取索引、获取数据流、ILM解释、映射、搜索分片、设置、验证查询)。 此权限主要供Kibana用户使用。

write

执行对文档的所有写操作的权限,包括索引、更新和删除文档的权限,以及执行批量操作的权限,同时还允许动态更新索引映射。

[8.0] 在8.0中已弃用。 它还授予使用更新映射API更新索引映射(但不包括数据流映射)的权限。 这将在未来的主要版本中被撤销。

以特权运行

edit

The run_as 权限使经过身份验证的用户能够代表其他用户提交请求。该值可以是用户名或以逗号分隔的用户名列表。(您也可以将用户指定为字符串数组或 YAML 序列。)有关更多信息,请参阅 代表其他用户提交请求

此权限在 Elastic Cloud 无服务器中不可用。

应用程序权限

edit

应用程序权限在 Elasticsearch 中进行管理,可以通过 has privileges APIget application privileges API 获取。然而,它们并不授予对 Elasticsearch 中任何操作或资源的访问权限。它们的目的是使应用程序能够在 Elasticsearch 角色中表示和存储自己的权限模型。

要创建应用程序权限,请使用添加应用程序权限 API。然后,您可以将这些应用程序权限与角色关联,如定义角色中所述。

文档级安全

edit

文档级安全限制了用户可以读取的文档。 特别是,它限制了可以从基于文档的读取API访问哪些文档。

要启用文档级安全,您可以使用查询来指定每个角色可以访问的文档。文档 query 与特定的数据流、索引或通配符 (*) 模式相关联,并与为数据流和索引指定的权限一起操作。

指定的文档 query

完全省略 query 参数将禁用相应索引权限条目的文档级安全功能。

以下角色定义仅授予对属于所有events-*数据流和索引中的click类别的文档的读取访问权限:

POST /_security/role/click_role
{
  "indices": [
    {
      "names": [ "events-*" ],
      "privileges": [ "read" ],
      "query": "{\"match\": {\"category\": \"click\"}}"
    }
  ]
}

您可以使用嵌套的JSON语法编写相同的查询:

POST _security/role/click_role
{
  "indices": [
    {
      "names": [ "events-*" ],
      "privileges": [ "read" ],
      "query": {
        "match": {
          "category": "click"
        }
      }
    }
  ]
}

以下角色仅授予对department_id等于12的文档的读取访问权限:

POST /_security/role/dept_role
{
  "indices" : [
    {
      "names" : [ "*" ],
      "privileges" : [ "read" ],
      "query" : {
        "term" : { "department_id" : 12 }
      }
    }
  ]
}

字段级安全

edit

字段级安全限制了用户对字段的读取访问权限。 特别是,它限制了可以从基于文档的读取API访问哪些字段。

要启用字段级安全,请在角色定义中的索引权限部分指定每个角色可以访问的字段。字段级安全因此绑定到一组明确的数据流或索引(以及可能的一组文档)。

以下角色定义仅授予对所有events-*数据流和索引中的category@timestampmessage字段的读取访问权限。

POST /_security/role/test_role1
{
  "indices": [
    {
      "names": [ "events-*" ],
      "privileges": [ "read" ],
      "field_security" : {
        "grant" : [ "category", "@timestamp", "message" ]
      }
    }
  ]
}

始终允许访问以下元数据字段:_id_type_parent_routing_timestamp_ttl_size_index。如果指定一个空字段列表,则只能访问这些元数据字段。

完全省略 fields 条目将禁用字段级安全。

您还可以指定字段表达式。例如,以下示例授予对所有以 event_ 前缀开头的字段的读取访问权限:

POST /_security/role/test_role2
{
  "indices" : [
    {
      "names" : [ "*" ],
      "privileges" : [ "read" ],
      "field_security" : {
        "grant" : [ "event_*" ]
      }
    }
  ]
}

使用点表示法来引用更复杂文档中的嵌套字段。例如,假设有以下文档:

{
  "customer": {
    "handle": "Jim",
    "email": "jim@mycompany.com",
    "phone": "555-555-5555"
  }
}

以下角色定义仅允许对客户 handle 字段的读取访问权限:

POST /_security/role/test_role3
{
  "indices" : [
    {
      "names" : [ "*" ],
      "privileges" : [ "read" ],
      "field_security" : {
        "grant" : [ "customer.handle" ]
      }
    }
  ]
}

这就是通配符支持大放异彩的地方。例如,使用 customer.* 来启用仅对 customer 数据的读取访问权限:

POST /_security/role/test_role4
{
  "indices" : [
    {
      "names" : [ "*" ],
      "privileges" : [ "read" ],
      "field_security" : {
        "grant" : [ "customer.*" ]
      }
    }
  ]
}

您可以使用以下语法拒绝访问字段:

POST /_security/role/test_role5
{
  "indices" : [
    {
      "names" : [ "*" ],
      "privileges" : [ "read" ],
      "field_security" : {
        "grant" : [ "*"],
        "except": [ "customer.handle" ]
      }
    }
  ]
}

以下规则适用:

  • 在角色中缺少field_security等同于*访问权限。
  • 如果已经明确授予某些字段的权限,您可以指定被拒绝的字段。被拒绝的字段必须是已授予权限字段的子集。
  • 定义被拒绝和授予的字段意味着可以访问所有授予的字段,除了那些与被拒绝字段模式匹配的字段。

例如:

POST /_security/role/test_role6
{
  "indices" : [
    {
      "names" : [ "*" ],
      "privileges" : [ "read" ],
      "field_security" : {
        "except": [ "customer.handle" ],
        "grant" : [ "customer.*" ]
      }
    }
  ]
}

在上面的示例中,用户可以读取所有带有“customer”前缀的字段,除了“customer.handle”。

对于grant的空数组(例如,"grant" : [])意味着没有授予对任何字段的访问权限。

当用户拥有多个指定字段级别权限的角色时,每个数据流或索引的最终字段级别权限是各个角色权限的并集。例如,如果合并这两个角色:

POST /_security/role/test_role7
{
  "indices" : [
    {
      "names" : [ "*" ],
      "privileges" : [ "read" ],
      "field_security" : {
        "grant": [ "a.*" ],
        "except" : [ "a.b*" ]
      }
    }
  ]
}

POST /_security/role/test_role8
{
  "indices" : [
    {
      "names" : [ "*" ],
      "privileges" : [ "read" ],
      "field_security" : {
        "grant": [ "a.b*" ],
        "except" : [ "a.b.c*" ]
      }
    }
  ]
}

生成的权限等于:

{
  // role 1 + role 2
  ...
  "indices" : [
    {
      "names" : [ "*" ],
      "privileges" : [ "read" ],
      "field_security" : {
        "grant": [ "a.*" ],
        "except" : [ "a.b.c*" ]
      }
    }
  ]
}

字段级安全不应设置在alias字段上。 要保护一个具体的字段,必须直接使用其字段名称。

有关更多信息,请参阅设置字段和文档级别的安全性

授予数据流和别名的权限

edit

Elasticsearch 安全功能允许您保护针对 数据流别名 执行的操作。

数据流权限

edit

使用索引权限来控制对数据流的访问。授予数据流的权限会同时授予其支持索引的相同权限。

例如,my-data-stream 由两个后备索引组成: .ds-my-data-stream-2099.03.07-000001.ds-my-data-stream-2099.03.08-000002

用户被授予对 my-data-streamread 权限。

{
  "names" : [ "my-data-stream" ],
  "privileges" : [ "read" ]
}

因为用户自动获得了与数据流后备索引相同的权限,用户可以直接从 .ds-my-data-stream-2099.03.08-000002中检索文档:

GET .ds-my-data-stream-2099.03.08-000002/_doc/2

稍后 my-data-stream 滚动。这将创建一个新的后备索引:.ds-my-data-stream-2099.03.09-000003。因为用户仍然拥有 my-data-streamread 权限,用户可以直接从 .ds-my-data-stream-2099.03.09-000003 检索文档:

GET .ds-my-data-stream-2099.03.09-000003/_doc/2

别名权限

edit

使用索引权限来控制对别名的访问。对索引或数据流的权限不会授予对其别名的权限。有关管理别名的信息,请参阅别名

不要使用过滤别名来代替文档级安全。Elasticsearch 并不总是应用别名过滤器。

例如,current_year 别名仅指向 2015 索引。用户被授予 2015 索引的 read 权限。

{
  "names" : [ "2015" ],
  "privileges" : [ "read" ]
}

当用户尝试从current_year别名中检索文档时,Elasticsearch会拒绝该请求。

GET current_year/_doc/1

要从current_year中检索文档,用户必须对该别名具有read索引权限。

{
  "names" : [ "current_year" ],
  "privileges" : [ "read" ]
}

将用户和组映射到角色

edit

角色映射由除nativefile之外的所有领域支持。

本地和文件领域直接将角色分配给用户。 本地领域使用用户管理API。 文件领域使用基于文件的角色管理

您可以通过角色映射API(推荐)或角色映射文件来映射角色。

PKI、LDAP、AD、Kerberos、OpenID Connect、JWT 和 SAML 领域支持 角色映射 API。仅 PKI、LDAP 和 AD 领域 支持 角色映射文件

PKI、LDAP、AD、Kerberos、OpenID Connect、JWT 和 SAML 领域也支持委托授权。你可以选择为领域映射角色或使用委托授权;但不能同时使用两者。

要使用角色映射,您需要创建角色和角色映射规则。 角色映射规则可以基于领域名称、领域类型、用户名、组、 其他用户元数据或这些值的组合。

匿名访问启用时,匿名用户的角色也会分配给所有其他用户。

如果通过API创建了角色映射规则以及角色映射文件,规则将会合并。 单个用户可能拥有通过API映射的一些角色,以及基于角色映射文件分配的其他角色。 您可以通过API定义角色映射,或通过文件进行管理。 这两个角色映射来源在Elasticsearch安全功能内部结合,因此单个用户可能拥有通过API映射的一些角色,以及其他通过文件映射的角色。

未分配角色的用户将无法执行任何操作。 换句话说,他们可能能够进行身份验证,但他们将没有任何角色。 没有角色意味着没有权限,没有权限意味着没有授权进行请求。

当您使用角色映射将角色分配给用户时,这些角色必须存在。 角色有两个来源。 可用角色应通过 角色管理API 添加或定义在 角色文件 中。无论是角色映射方法都可以使用 任何角色管理方法。例如,当您使用角色映射API时, 您可以将用户映射到API管理的角色和文件管理的角色 (同样适用于基于文件的角色映射)。

使用角色映射API

edit

您可以通过添加角色映射 API来定义角色映射。

使用角色映射文件

edit

要使用基于文件的角色映射,您必须在 YAML 文件中配置映射,并将其复制到集群中的每个节点。像 Puppet 或 Chef 这样的工具可以帮助完成此操作。

默认情况下,角色映射存储在 ES_PATH_CONF/role_mapping.yml 中, 其中 ES_PATH_CONFES_HOME/config(zip/tar 安装)或 /etc/elasticsearch(包安装)。要指定不同的位置, 您可以在 Active DirectoryLDAPPKI 领域设置中配置 elasticsearch.yml 中的 files.role_mapping 设置。

在角色映射文件中,安全角色是键,组和用户是值。映射可以具有多对多的关系。当您将角色映射到组时,该组中用户的角色是分配给该组的角色和分配给该用户的角色的组合。

默认情况下,Elasticsearch 每 5 秒检查一次角色映射文件的更改。 您可以通过更改 elasticsearch.yml 文件中的 resource.reload.interval.high 设置来更改此默认行为。由于 这是 Elasticsearch 中的常见设置,更改其值可能会影响系统中的其他 调度。

虽然角色映射API是管理角色映射的首选方式,但在以下几种情况下,使用role_mapping.yml文件会变得非常有用:

  1. 如果你想定义固定的角色映射,除了具有物理访问Elasticsearch节点权限的管理员外,没有人能够更改。
  2. 如果集群管理依赖于来自外部领域的用户,并且这些用户即使在集群状态为RED时也需要将角色映射给他们。例如,通过LDAP或PKI进行身份验证并被分配管理员角色的管理员,以便他们能够执行纠正措施。

请注意,role_mapping.yml 文件作为最小的管理功能提供,并不旨在涵盖所有用例并用于定义角色。

您无法通过角色映射API查看、编辑或删除在角色映射文件中定义的任何角色。

领域特定细节

edit
Active Directory 和 LDAP 领域
edit

要在角色映射中指定用户和组,您可以使用它们的专有名称(DN)。DN是一个唯一标识用户或组的字符串,例如"cn=John Doe,cn=contractors,dc=example,dc=com"

Elasticsearch 安全功能仅支持 Active Directory 安全组。 您不能将分发组映射到角色。

例如,以下代码片段使用基于文件的方法将admins组映射到monitoring角色,并将John Doe用户、users组和admins组映射到user角色。

monitoring: 
  - "cn=admins,dc=example,dc=com" 
user:
  - "cn=John Doe,cn=contractors,dc=example,dc=com" 
  - "cn=users,dc=example,dc=com"
  - "cn=admins,dc=example,dc=com"

角色的名称。

LDAP 组或 Active Directory 安全组的专有名称。

LDAP 或 Active Directory 用户的专有名称。

您可以使用角色映射 API 来定义等效映射,如下所示:

PUT /_security/role_mapping/admins
{
  "roles" : [ "monitoring", "user" ],
  "rules" : { "field" : { "groups" : "cn=admins,dc=example,dc=com" } },
  "enabled": true
}
PUT /_security/role_mapping/basic_users
{
  "roles" : [ "user" ],
  "rules" : { "any" : [
      { "field" : { "dn" : "cn=John Doe,cn=contractors,dc=example,dc=com" } },
      { "field" : { "groups" : "cn=users,dc=example,dc=com" } }
  ] },
  "enabled": true
}
PKI 领域
edit

PKI 领域支持将用户映射到角色,但不能映射组,因为 PKI 领域没有组的概。

这是一个使用基于文件的映射的示例:

monitoring:
  - "cn=Admin,ou=example,o=com"
user:
  - "cn=John Doe,ou=example,o=com"

以下示例使用API创建等效映射:

PUT /_security/role_mapping/admin_user
{
  "roles" : [ "monitoring" ],
  "rules" : { "field" : { "dn" : "cn=Admin,ou=example,o=com" } },
  "enabled": true
}
PUT /_security/role_mapping/basic_user
{
  "roles" : [ "user" ],
  "rules" : { "field" : { "dn" : "cn=John Doe,ou=example,o=com" } },
  "enabled": true
}

设置字段和文档级别的安全性

edit

您可以通过向角色添加字段和文档级别的安全权限来控制对数据流或索引中数据的访问。 字段级别安全权限限制对文档中特定字段的访问。 文档级别安全权限限制对特定文档的访问。

文档和字段级别的安全性目前旨在与只读特权账户一起操作。启用了数据流或索引的文档和字段级别安全性的用户不应执行写操作。

角色可以基于每个索引定义字段和文档级别的权限。 一个没有指定字段级别权限的角色将授予对所有字段的访问权限。 同样,一个没有指定文档级别权限的角色将授予对索引中所有文档的访问权限。

在为用户分配多个角色时,请注意不要无意中授予比预期更广泛的访问权限。每个用户在每个数据流或索引中都有一组单独的字段级和文档级权限。请参阅具有文档和字段级安全性的多个角色

具有文档和字段级安全性的多角色

edit

用户可以拥有多个角色,每个角色可以对相同的数据流或索引定义不同的权限。在这种情况下,理解文档级和字段级安全性的行为非常重要。

文档级安全考虑用户持有的每个角色,并将给定数据流或索引的每个文档级安全查询与“或”组合。这意味着只需一个角色查询匹配即可返回文档。例如,如果一个角色授予对没有文档级安全的索引的访问权限,而另一个角色授予具有文档级安全的访问权限,则不会应用文档级安全;同时拥有这两个角色的用户可以访问索引中的所有文档。

字段级安全考虑用户拥有的每个角色,并将所有列出的字段组合成每个数据流或索引的单一集合。例如,如果一个角色授予对索引的访问权限而没有字段级安全,而另一个角色授予带有字段级安全的访问权限,则不会对该索引应用字段级安全;拥有这两个角色的用户可以访问该索引中的所有字段。

例如,假设role_a仅授予对index1文档中的address字段的访问权限;它没有指定任何文档限制。相反,role_b限制了对index1文档子集的访问;它没有指定任何字段限制。如果你为用户分配了这两个角色,role_a使用户可以访问所有文档,而role_b使用户可以访问所有字段。

如果您需要限制对文档和字段的访问,请考虑按索引拆分文档。

模板化角色查询

edit

当您创建角色时,您可以指定一个查询来定义 文档级安全权限。您可以选择在角色查询中使用 Mustache 模板,将当前经过身份验证的用户的用户名插入到角色中。与其他支持模板或脚本的 Elasticsearch 部分一样,您可以指定内联、存储或基于文件的模板,并定义自定义参数。您可以通过 _user 参数访问当前经过身份验证的用户的详细信息。

例如,以下角色查询使用模板来插入当前已验证用户的用户名:

POST /_security/role/example1
{
  "indices" : [
    {
      "names" : [ "my-index-000001" ],
      "privileges" : [ "read" ],
      "query" : {
        "template" : {
          "source" : {
            "term" : { "acl.username" : "{{_user.username}}" }
          }
        }
      }
    }
  ]
}

您可以通过 _user 变量访问以下信息:

Property Description

_user.username

当前认证用户的用户名。

_user.full_name

如果指定,当前已认证用户的完整姓名。

_user.email

如果指定,则为当前已认证用户的电子邮件。

_user.roles

如果相关联,当前已认证用户的角色名称列表。

_user.metadata

如果指定,一个包含当前已认证用户自定义元数据的哈希。

您还可以访问自定义用户元数据。例如,如果您在用户元数据中维护了一个 group_id,您可以根据文档中的 group.id 字段应用文档级安全:

POST /_security/role/example2
{
  "indices" : [
    {
      "names" : [ "my-index-000001" ],
      "privileges" : [ "read" ],
      "query" : {
        "template" : {
          "source" : {
            "term" : { "group.id" : "{{_user.metadata.group_id}}" }
          }
        }
      }
    }
  ]
}

如果你的元数据字段包含对象或数组,你可以使用{{#toJson}}parameter{{/toJson}}函数来访问它。

POST /_security/role/example3
{
  "indices" : [
    {
      "names" : [ "my-index-000001" ],
      "privileges" : [ "read" ],
      "query" : {
        "template" : {
          "source" : "{ \"terms\": { \"group.statuses\": {{#toJson}}_user.metadata.statuses{{/toJson}} }}"
        }
      }
    }
  ]
}

预处理文档以添加安全细节

edit

为了确保用户只能阅读自己的文档,设置文档级安全是有意义的。在这种情况下,每个文档都必须与用户名或角色名相关联,以便角色查询可以使用这些信息进行文档级安全控制。这是一个可以使用设置安全用户处理器摄取处理器的情况。

文档级安全不适用于写入API。您必须为每个使用相同数据流或索引的用户使用唯一ID,否则他们可能会覆盖其他用户的文档。摄取处理器仅为当前经过身份验证的用户添加属性到正在索引的文档中。

The set security user processor 附加与当前经过身份验证的用户相关的详细信息(例如 username, roles, email, full_namemetadata )到当前文档,通过预处理摄取。当 您使用摄取管道索引数据时,用户详细信息会自动附加到文档中。如果身份验证凭据是API密钥,则API密钥 id, namemetadata(如果存在且非空)也会附加到 文档中。

更多信息请参见 Ingest pipelinesSet security user

使用跨集群 API 密钥的字段和文档级安全

edit

跨集群API密钥 可以用于验证对远程集群的请求。search 参数定义了跨集群搜索的权限。replication 参数定义了跨集群复制的权限。

replication 不支持任何字段或文档级别的安全性。search 支持字段和文档级别的安全性。

由于与具有文档和字段级安全性的多个角色中描述的类似原因, 如果search参数定义了文档或字段级安全性,则无法创建同时具有searchreplication参数的单个跨集群API密钥。

如果你需要同时使用这两个参数,并且需要为search参数定义文档或字段级别的安全性, 请创建两个单独的跨集群API密钥,一个使用search参数, 另一个使用replication参数。你还需要设置两个不同的 远程连接到同一个集群,每个命名连接使用适当的跨集群API密钥。

代表其他用户提交请求

edit

Elasticsearch 角色支持 run_as 权限,该权限允许经过身份验证的用户代表其他用户提交请求。例如,如果您的外部应用程序被信任来验证用户,Elasticsearch 可以验证该外部应用程序,并使用 run as 机制代表其他用户发出授权请求,而无需重新验证每个用户。

要“以”(模拟)另一个用户的身份运行,第一个用户(认证用户)必须通过支持运行委托的机制进行认证。第二个用户(run_as 用户)必须通过支持通过用户名进行委托运行查找的机制进行授权。

The run_as 权限本质上类似于一种次要形式的 委托授权。委托授权适用于进行身份验证的用户,而 run_as 权限适用于被模拟的用户。

Authenticating user

对于认证用户,以下领域(加上API密钥)都支持run_as委托:nativefile、Active Directory、JWT、Kerberos、LDAP和PKI。

服务令牌、Elasticsearch 令牌服务、SAML 2.0 和 OIDC 1.0 不支持 run_as 委托。

run_as user

Elasticsearch 支持任何支持用户查找的领域使用 run_as。并非所有领域都支持用户查找。请参阅支持的领域列表,并确保您希望使用的领域已配置为支持用户查找。

必须从领域中检索run_as用户 - 不能以 服务账户API密钥访问令牌的身份运行。

要代表其他用户提交请求,您需要在您的角色中拥有run_as权限。例如,以下请求创建了一个my_director角色,该角色授予代表jacknichredeniro提交请求的权限:

POST /_security/role/my_director?refresh=true
{
  "cluster": ["manage"],
  "indices": [
    {
      "names": [ "index1", "index2" ],
      "privileges": [ "manage" ]
    }
  ],
  "run_as": [ "jacknich", "rdeniro" ],
  "metadata" : {
    "version" : 1
  }
}

要代表另一个用户提交请求,您可以在请求头中指定用户,例如:

curl -H "es-security-runas-user: jacknich" -u es-admin -X GET http://localhost:9200/

通过 es-security-runas-user 头传递的 run_as 用户必须来自支持通过用户名进行委派授权查找的领域。 不支持用户查找的领域不能被其他领域的 run_as 委派使用。

例如,JWT realms 可以验证JWTs中指定的外部用户,并在 native realm 中以 run_as 用户的身份执行请求。Elasticsearch 将检索指定的 runas 用户,并使用其角色执行请求。

run_as权限应用于角色

edit

您可以在使用创建或更新角色 API创建角色时应用run_as权限。被分配了包含run_as权限的角色的用户将继承其角色的所有权限,并且还可以代表指定的用户提交请求。

已认证用户和run_as用户的角色不会合并。如果用户在认证时未指定run_as参数,则仅使用已认证用户的角色。如果用户认证并且其角色包含run_as参数,则仅使用run_as用户的角色。

用户成功认证到 Elasticsearch 后,授权过程会确定传入请求背后的用户是否被允许运行该请求。如果已认证的用户在其权限列表中具有 run_as 权限,并指定了 run-as 头,Elasticsearch 将丢弃已认证的用户及其关联角色。然后,它会在领域链中的每个配置领域中查找,直到找到与 run_as 用户关联的用户名,并使用这些角色来执行任何请求。

考虑一个管理员角色和一个分析师角色。管理员角色拥有更高的权限,但也可能希望以其他用户身份提交请求来测试和验证他们的权限。

首先,我们将创建一个名为 my_admin_role 的管理角色。该角色在整个集群和部分索引上具有 manage 权限。此角色还包含 run_as 权限,该权限允许任何拥有此角色的用户代表指定的 analyst_user 提交请求。

POST /_security/role/my_admin_role?refresh=true
{
  "cluster": ["manage"],
  "indices": [
    {
      "names": [ "index1", "index2" ],
      "privileges": [ "manage" ]
    }
  ],
  "applications": [
    {
      "application": "myapp",
      "privileges": [ "admin", "read" ],
      "resources": [ "*" ]
    }
  ],
  "run_as": [ "analyst_user" ],
  "metadata" : {
    "version" : 1
  }
}

接下来,我们将创建一个名为 my_analyst_role 的分析师角色,该角色具有更多限制性的 monitor 集群权限和部分索引上的 manage 权限。

POST /_security/role/my_analyst_role?refresh=true
{
  "cluster": [ "monitor"],
  "indices": [
    {
      "names": [ "index1", "index2" ],
      "privileges": ["manage"]
    }
  ],
  "applications": [
    {
      "application": "myapp",
      "privileges": [ "read" ],
      "resources": [ "*" ]
    }
  ],
  "metadata" : {
    "version" : 1
  }
}

我们将创建一个管理员用户,并为其分配名为 my_admin_role 的角色, 该角色允许此用户以 analyst_user 的身份提交请求。

POST /_security/user/admin_user?refresh=true
{
  "password": "l0ng-r4nd0m-p@ssw0rd",
  "roles": [ "my_admin_role" ],
  "full_name": "Eirian Zola",
  "metadata": { "intelligence" : 7}
}

我们也可以创建一个分析师用户并为他们分配名为my_analyst_role的角色。

POST /_security/user/analyst_user?refresh=true
{
  "password": "l0nger-r4nd0mer-p@ssw0rd",
  "roles": [ "my_analyst_role" ],
  "full_name": "Monday Jaffe",
  "metadata": { "innovation" : 8}
}

然后,您可以以admin_useranalyst_user的身份向Elasticsearch进行身份验证。然而,admin_user可以选择代表analyst_user提交请求。以下请求使用Basic授权令牌向Elasticsearch进行身份验证,并以analyst_user的身份提交请求:

curl -s -X GET -H "Authorization: Basic YWRtaW5fdXNlcjpsMG5nLXI0bmQwbS1wQHNzdzByZA==" -H "es-security-runas-user: analyst_user" https://localhost:9200/_security/_authenticate

响应表明,analyst_user 提交了这个请求,使用了分配给该用户的 my_analyst_role。当 admin_user 提交请求时,Elasticsearch 验证了该用户,丢弃了他们的角色,然后使用了 run_as 用户的角色。

{"username":"analyst_user","roles":["my_analyst_role"],"full_name":"Monday Jaffe","email":null,
"metadata":{"innovation":8},"enabled":true,"authentication_realm":{"name":"native",
"type":"native"},"lookup_realm":{"name":"native","type":"native"},"authentication_type":"realm"}
%

响应中的 authentication_realmlookup_realm 都指定了 native 领域,因为 admin_useranalyst_user 都来自该领域。如果这两个用户位于不同的领域,则 authentication_realmlookup_realm 的值将不同(例如 pkinative)。

配置授权委托

edit

在某些情况下,用户通过某个领域进行身份验证后,我们可能希望将用户查找和角色分配委托给另一个领域。任何支持用户查找(无需用户凭据)的领域都可以用作授权领域。

例如,通过Kerberos领域进行身份验证的用户可以在LDAP领域中查找。LDAP领域负责在LDAP中搜索用户并确定其角色。在这种情况下,LDAP领域充当授权领域

作为授权域的LDAP域

edit

以下是可作为授权领域使用的LDAP领域的一个示例配置。此LDAP领域在用户搜索模式下配置,并指定了一个过滤器。

有关配置LDAP领域的更多信息,请参阅LDAP用户认证

xpack:
  security:
    authc:
      realms:
        ldap:
          ldap1:
            order: 0
            authentication.enabled: true 
            user_search:
              base_dn: "dc=example,dc=org"
              filter: "(cn={0})"
            group_search:
              base_dn: "dc=example,dc=org"
            files:
              role_mapping: "ES_PATH_CONF/role_mapping.yml"
            unmapped_groups_as_roles: false

在这里,我们明确允许使用LDAP领域进行身份验证(即用户可以使用他们的LDAP用户名和密码进行身份验证)。如果我们希望这个LDAP领域仅用于授权,那么我们将此设置为false

配置为委托授权的Kerberos领域

edit

以下是一个配置示例,其中Kerberos领域对用户进行身份验证,然后将授权委托给LDAP领域。Kerberos领域对用户进行身份验证并提取用户主体名称(通常格式为user@REALM)。在此示例中,我们启用了remove_realm_name设置,以从用户主体名称中删除@REALM部分,从而获取用户名。此用户名用于通过配置的授权领域(在本例中为LDAP领域)进行用户查找。

有关Kerberos领域的更多信息,请参阅Kerberos认证

xpack:
  security:
    authc:
      realms:
        kerberos:
          kerb1:
            order: 1
            keytab.path: "ES_PATH_CONF/es.keytab"
            remove_realm_name: true
            authorization_realms: ldap1

配置为委托授权的PKI领域

edit

我们同样可以配置PKI领域以将授权委托给LDAP领域。用户由PKI领域进行身份验证,而授权则委托给LDAP领域。在此示例中,用户名是从客户端证书的DN中提取的通用名称(CN)。LDAP领域使用此用户名来查找用户并分配角色。

有关PKI领域的更多信息,请参阅PKI用户认证

xpack:
  security:
    authc:
      realms:
        pki:
          pki1:
            order: 2
            authorization_realms: ldap1

与上述示例类似,我们可以配置领域以将授权委托给授权领域(这些领域具有通过用户名查找用户并分配角色的能力)。

自定义角色和授权

edit

如果您需要从一个不受开箱即用支持的系统中检索用户角色,或者如果Elasticsearch安全功能提供的授权系统不符合您的需求,可以实现一个SPI加载的安全扩展来定制角色检索和/或授权系统。SPI加载的安全扩展是一个普通的elasticsearch插件的一部分。

实现自定义角色提供程序

edit

要创建自定义角色提供程序:

  1. 实现接口 BiConsumer, ActionListener>>。 也就是说,实现包括一个方法,该方法接受一组字符串,这些字符串是要解析的角色名称,以及一个ActionListener,在解析的角色描述符集作为响应传递时使用。
  2. 自定义角色提供程序实现必须特别注意不要在任何I/O操作上阻塞。实现有责任确保异步行为和非阻塞调用,这通过提供ActionListener来发送响应,当角色已解析且响应准备好时,变得更容易。

将您的自定义角色提供程序打包为插件:

  1. 为您的角色提供者实现一个扩展类,该类实现了org.elasticsearch.xpack.core.security.SecurityExtension。在那里,您需要重写以下一个或多个方法:

    @Override
    public List, ActionListener>>>
    getRolesProviders(Settings settings, ResourceWatcherService resourceWatcherService) {
        ...
    }

    方法getRolesProviders用于提供一组自定义角色提供程序,这些提供程序将在无法通过保留角色或本地角色存储解析角色名称时使用。返回的列表应按照自定义角色提供程序应被调用以解析角色的顺序排列。例如,如果getRolesProviders返回两个角色提供程序实例,并且它们都能够解析角色A,那么将用于角色A的解析角色描述符将是列表中第一个角色提供程序解析的那个。

实现授权引擎

edit

要创建一个授权引擎,您需要:

  1. 在具有所需授权行为的类中实现org.elasticsearch.xpack.core.security.authz.AuthorizationEngine接口。
  2. 在包含授权请求所需信息的类中实现org.elasticsearch.xpack.core.security.authz.Authorization.AuthorizationInfo接口。

将您的授权引擎打包为插件:

  1. 为您的授权引擎实现一个扩展类,该类扩展了org.elasticsearch.xpack.core.security.SecurityExtension。在那里,您需要重写以下方法:

    @Override
    public AuthorizationEngine getAuthorizationEngine(Settings settings) {
        ...
    }

    The getAuthorizationEngine 方法用于提供授权引擎实现。

提供了示例代码,展示了自定义授权引擎的结构和实现,位于GitHub上的 elasticsearch 仓库中。您可以使用此代码作为创建自己的授权引擎的起点。

实现一个elasticsearch插件

edit

为了为您的自定义角色提供程序或授权引擎注册安全扩展,您还需要实现一个包含该扩展的elasticsearch插件:

  1. 实现一个扩展org.elasticsearch.plugins.Plugin的插件类
  2. 为插件创建一个构建配置文件;我们推荐使用Gradle。
  3. 按照插件作者帮助中的描述,创建一个plugin-descriptor.properties文件。
  4. 为扩展创建一个META-INF/services/org.elasticsearch.xpack.core.security.SecurityExtension描述符文件,其中包含您的org.elasticsearch.xpack.core.security.SecurityExtension实现的完全限定类名
  5. 将所有内容打包到一个zip文件中。

使用安全扩展

edit

要使用安全扩展:

  1. 在集群中的每个节点上安装带有扩展的插件。您运行bin/elasticsearch-plugin并使用install子命令,并指定指向包含扩展的zip文件的URL。例如:

    bin/elasticsearch-plugin install file:////my-extension-plugin-1.0.zip
  2. 将扩展中的任何配置参数添加到 elasticsearch.yml 文件中。这些设置没有命名空间,您在构建扩展时可以访问任何设置,尽管建议为扩展使用命名空间约定,以使您的 elasticsearch.yml 配置易于理解。

    例如,如果您有一个自定义角色提供程序,该提供程序通过从AWS上的S3存储桶中读取blob来解析角色,那么您将在elasticsearch.yml中指定设置,例如:

    custom_roles_provider.s3_roles_provider.bucket: roles
    custom_roles_provider.s3_roles_provider.region: us-east-1
    custom_roles_provider.s3_roles_provider.secret_key: xxx
    custom_roles_provider.s3_roles_provider.access_key: xxx

    这些设置作为参数传递给SecurityExtension接口中的方法。

  3. 重启 Elasticsearch。