用户授权
edit用户授权
editElastic Stack 安全功能添加了授权,即确定传入请求背后的用户是否被允许执行请求的过程。
此过程在用户成功识别并 认证后进行。
基于角色的访问控制
edit安全功能提供了一个基于角色的访问控制(RBAC)机制, 这使您能够通过将权限分配给角色并将角色分配给用户或组来授权用户。
授权过程围绕以下结构展开:
- Secured Resource
- 受限制访问的资源。索引、别名、文档、字段、用户以及 Elasticsearch 集群本身都是受保护对象的示例。
- Privilege
-
一组用户可以对受保护资源执行的一个或多个操作的命名组。每个受保护资源都有自己的可用权限集。例如,
read是一个索引权限,表示所有能够读取索引/存储数据的操作。有关可用权限的完整列表,请参阅安全权限。 - Permissions
-
针对受保护资源的一组一个或多个权限。权限可以很容易地用语言描述,这里有一些例子:
-
read对products数据流或索引的权限 -
manage对集群的权限 -
run_as对john用户的权限 -
read对匹配查询 X 的文档的权限 -
read对credit_card字段的权限
-
- Role
- 一组命名的权限
- User
- 已验证的用户。
- Group
- 用户所属的一个或多个组。某些领域(如本地、文件或PKI领域)不支持组。
角色具有唯一的名称,并标识一组权限,这些权限对应于资源上的特权。您可以将用户或组与任意数量的角色关联。当您将角色映射到组时,该组中用户的角色是分配给该组的角色与分配给该用户的角色的组合。同样,用户拥有的总权限集由其所有角色中的权限的并集定义。
分配用户角色的方法因您用于用户身份验证的领域而异。有关更多信息,请参阅将用户和组映射到角色。
基于属性的访问控制
edit安全功能还提供了一种基于属性的访问控制(ABAC)机制,使您能够使用属性来限制对搜索查询和聚合中的文档的访问。例如,您可以为用户和文档分配属性,然后在角色定义中实施访问策略。具有该角色的用户只有在拥有所有必需属性时才能读取特定文档。
更多信息,请参阅 使用 X-Pack 6.1 进行文档级基于属性的访问控制。
内置角色
editElastic Stack 安全功能为所有用户应用了一个默认角色,包括 匿名用户。默认角色允许用户访问 认证端点,更改自己的密码,并获取有关自己的信息。
还有一组内置角色,您可以明确地分配给用户。这些角色具有一组固定的权限,并且不能更新。
-
apm_system - 授予APM系统用户将系统级数据(如监控)发送到Elasticsearch所需的访问权限。
-
apm_user -
授予APM用户所需的权限(例如,
read和view_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": "..."
}
|
此角色的所有者可以冒充的用户名列表。 |
|
|
集群权限列表。这些权限定义了拥有此角色的用户能够在集群级别执行的操作。此字段是可选的(缺少 |
|
|
定义全局权限的对象。全局权限是一种请求敏感的集群权限形式。标准的集群权限仅基于正在执行的操作进行授权决策。全局权限还会考虑请求中包含的参数。目前,对全局权限的支持仅限于应用程序权限的管理。此字段是可选的。 |
|
|
索引权限条目的列表。此字段是可选的(缺少 |
|
|
应用程序权限条目列表。此字段是可选的。 |
|
|
为使用API密钥模型配置的远程集群的索引权限条目列表。
使用API密钥认证配置的远程集群。
此字段是可选的(缺少 |
|
|
为使用API密钥模型配置的远程集群列出的集群权限条目。此字段是可选的(缺少 |
|
|
与角色关联的元数据字段,例如 |
|
|
一个包含角色描述文本的字符串值。
最大长度为 |
角色名称必须至少1个字符,且不超过507个字符。它们可以包含字母数字字符(a-z、A-Z、0-9)、空格、标点符号以及基本拉丁(ASCII)字符块中的可打印符号。不允许有前导或尾随空格。
索引权限
edit以下描述了索引权限条目的结构:
{
"names": [ ... ],
"privileges": [ ... ],
"field_security" : { ... },
"query": "...",
"allow_restricted_indices": false
}
|
此条目中权限适用的数据流、索引和别名的列表。支持通配符( |
|
|
角色所有者在 |
|
|
文档字段的规范,角色所有者具有读取权限。 详情请参阅设置字段和文档级别的安全性。 |
|
|
定义角色所有者具有读取访问权限的文档的搜索查询。关联的数据流和索引中的文档必须匹配此查询,才能被角色所有者访问。 |
|
|
受限索引是一种特殊类别的索引,用于内部存储配置数据,不应直接访问。通常只有内部系统角色才能授予对受限索引的权限。
强烈不建议切换此标志,因为它可能会有效地授予对关键数据的无限制操作,从而使整个系统不稳定或泄露敏感信息。
然而,如果出于管理目的,您需要创建一个覆盖受限索引权限的角色,则必须将此字段设置为 |
参数 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以下描述了全局权限条目的结构:
应用程序权限
edit以下描述了应用程序权限条目的结构:
|
应用程序的名称。 |
|
|
授予此角色的应用程序权限名称列表。 |
|
|
这些权限适用的资源。它们的处理方式与 |
有关这些字段的验证规则的详细信息,请参阅添加应用程序权限 API。
角色可能引用不存在的应用程序权限——也就是说,它们尚未通过添加应用程序权限API定义(或者它们曾经被定义,但后来被删除了)。在这种情况下,该权限没有任何效果,并且不会在has privileges API中授予任何操作。
远程索引权限
edit对于使用基于API密钥模型的远程集群,远程索引权限可用于指定匹配远程集群所需的索引权限。最终的有效索引权限将是远程索引权限与跨集群API密钥的索引权限的交集。
远程索引对于使用API密钥模型配置的远程集群是有效的。 它们对于使用基于证书模型配置的远程集群没有效果。
远程索引权限条目相比索引权限条目多了一个额外的强制性clusters字段。否则,两者的结构是相同的。
以下描述了远程索引权限条目的结构:
{
"clusters": [ ... ],
"names": [ ... ],
"privileges": [ ... ],
"field_security" : { ... },
"query": "...",
"allow_restricted_indices": false
}
|
此条目中权限适用的数据流、索引和别名的列表。支持通配符( |
|
|
角色所有者在 |
|
|
文档字段的规范,角色所有者具有读取权限。 详情请参阅设置字段和文档级别的安全性。 |
|
|
定义角色所有者具有读取访问权限的文档的搜索查询。关联的数据流和索引中的文档必须匹配此查询,才能被角色所有者访问。 |
|
|
受限索引是一种特殊类别的索引,用于内部存储配置数据,不应直接访问。通常只有内部系统角色才能授予对受限索引的权限。
强烈不建议切换此标志,因为它可能会有效地授予对关键数据的无限制操作,从而使整个系统不稳定或泄露敏感信息。
然而,如果出于管理目的,您需要创建一个覆盖受限索引权限的角色,则必须将此字段设置为 |
远程集群权限
edit对于使用基于API密钥模型配置的远程集群,远程集群权限可以用于为匹配的远程集群指定额外的集群权限。
远程集群权限仅对使用API密钥模型配置的远程集群有效。 它们对使用基于证书模型配置的远程集群没有影响。
以下描述了远程集群权限条目的结构:
远程集群的 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、@timestamp和message字段。
有关可用集群和索引权限的完整列表
有两种可用的机制来定义角色:使用角色管理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文件仅作为最小的管理功能提供,并不旨在涵盖所有用例的角色定义。
文件 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密钥。 |
|
|
代表其他用户创建Elasticsearch API密钥的权限。 此权限在Elastic Cloud无服务器版本中不可用。 |
|
|
基于 |
|
|
Elasticsearch REST API 密钥上的所有安全相关操作,包括 创建新的 API 密钥、 获取 API 密钥信息、 查询 API 密钥、 更新 API 密钥、 批量更新 API 密钥 和 使 API 密钥失效。
|
|
|
所有与管理自动扩展策略相关的操作。 此权限在 Elastic Cloud 无服务器版本中不可用。 |
|
|
所有与管理追随者索引和自动跟随模式相关的跨集群复制操作。它还包括授予管理追随者索引和自动跟随模式所需权限的权限。此权限仅在包含追随者索引的集群上需要。 此权限在Elastic Cloud无服务器版中不可用。 |
|
|
所有与管理转换相关的操作。
[7.5]
在7.5中已弃用。
请改用 此权限在Elastic Cloud无服务器环境中不可用。 |
|
|
此权限无效。 [8.16] 在8.16版本中已弃用。 |
|
|
所有与管理和执行丰富策略相关的操作。 |
|
|
所有与管理策略相关的索引生命周期管理操作。 此权限在Elastic Cloud无服务器环境中不可用。 |
|
|
所有对索引模板的操作。 |
|
|
所有与管理推理相关的操作。 |
|
|
所有关于数据摄取管道的操作。 |
|
|
所有对logstash管道的操作。 |
|
|
所有机器学习操作,例如创建和删除数据馈送、作业和模型快照。 在版本6.2之前创建的数据馈送或在禁用安全功能时创建的数据馈送以具有提升权限的系统用户身份运行,包括读取所有索引的权限。较新的数据馈送以创建或更新它们的用户的安全角色运行。 |
|
|
启用使用Elasticsearch API (OpenID Connect准备认证API, OpenID Connect认证API, 和 OpenID Connect登出API) 以代表其他用户启动和管理OpenID Connect认证。 此权限在Elastic Cloud无服务器中不可用。 |
|
|
当前认证用户拥有的Elasticsearch API密钥的所有安全相关操作。这些操作包括 创建新的API密钥, 获取API密钥信息, 查询API密钥, 更新API密钥, 批量更新API密钥, 以及 使API密钥失效. |
|
|
所有关于数据摄取管道的操作。 |
|
|
所有汇总操作,包括创建、启动、停止和删除汇总作业。 此权限在 Elastic Cloud 无服务器环境中不可用。 |
|
|
启用使用内部 Elasticsearch API 来代表其他用户启动和管理 SAML 身份验证。 此权限在 Elastic Cloud 无服务器环境中不可用。 |
|
|
对搜索应用程序的所有CRUD操作。 |
|
|
对查询规则的所有CRUD操作。 |
|
|
所有同义词管理操作都在 同义词API 上。 |
|
|
所有与安全相关的操作,例如对用户和角色的CRUD操作以及缓存清除。 |
|
|
所有与Elasticsearch服务账户相关的安全操作,包括 获取服务账户、 创建服务账户令牌、删除服务账户令牌、 以及 获取服务账户凭证。 此权限在Elastic Cloud无服务器版本中不可用。 |
|
|
所有快照生命周期管理(SLM)操作,包括创建和更新策略以及启动和停止SLM。 此权限在Elastic Cloud无服务器环境中不可用。 [8.15] 在8.15中已弃用。 还授予使用ILM start和ILM stop API启动和停止索引生命周期管理的权限。 在未来的主要版本中,此权限将不授予任何索引生命周期管理权限。 |
|
|
所有与安全相关的操作,针对由 Elasticsearch Token 服务生成的令牌。 此权限在 Elastic Cloud 无服务器环境中不可用。 |
|
|
所有与管理转换相关的操作。 |
|
|
所有观察器操作,例如放置观察器、执行、激活或确认。 此权限在 Elastic Cloud 无服务器版本中不可用。 在版本 6.1 之前创建的观察器或在禁用安全功能时创建的观察器以具有提升权限的系统用户身份运行,包括读取和写入所有索引的权限。较新的观察器以创建或更新它们的用户的安全角色运行。 |
|
|
所有集群只读操作,如集群健康和状态、热线程、节点信息、节点和集群统计信息,以及待处理的集群任务。 |
|
|
此权限无效。 [8.16] 在8.16版本中已弃用。 |
|
|
所有与管理和执行富化策略相关的只读操作。 |
|
|
所有与推理相关的只读操作。 |
|
|
所有只读的机器学习操作,例如获取有关数据馈送、作业、模型快照或结果的信息。 |
|
|
所有只读汇总操作,例如查看历史和当前正在运行的汇总作业及其功能。 此权限在 Elastic Cloud 无服务器环境中不可用。 |
|
|
列出和查看现有仓库和快照详情的权限。 此权限在 Elastic Cloud 无服务器环境中不可用。 |
|
|
所有与查找结构API相关的只读操作。 此权限在Elastic Cloud无服务器环境中不可用。 |
|
|
所有与转换相关的只读操作。 |
|
|
所有只读的观察器操作,例如获取观察器和观察器统计信息。 此权限在Elastic Cloud无服务器版本中不可用。 |
|
|
所有只读的跨集群复制操作,例如获取有关集群中领导索引的索引信息和元数据。它还包括检查用户是否具有适当的权限来跟随领导索引的权限。此权限仅在包含领导索引的集群上需要。 此权限在Elastic Cloud无服务器版中不可用。 |
|
|
所有只读索引生命周期管理操作,例如获取策略和检查索引生命周期管理的状态 此权限在 Elastic Cloud serverless 中不可用。 |
|
|
只读访问摄取管道(获取、模拟)。 |
|
|
所有只读的SLM操作,例如获取策略和检查SLM状态。 此权限在Elastic Cloud无服务器版中不可用。 [8.15] 在8.15中已弃用。 同时授予使用ILM获取状态API获取索引生命周期管理状态的权限。在未来的主要版本中,此权限将不再授予任何索引生命周期管理权限。 |
|
|
所有只读的安全相关操作,例如获取用户、用户配置文件、 Elasticsearch API 密钥、Elasticsearch 服务账户、角色和角色映射。 允许查询和检索信息 关于所有 Elasticsearch API 密钥。 |
|
|
传输客户端连接所需的所有权限。远程集群需要此权限以启用跨集群搜索。 此权限在Elastic Cloud无服务器版本中不可用。 |
索引权限
edit|
|
对索引或数据流的任何操作。 |
|
|
允许自动创建索引和数据流。自动创建操作是由于对不存在的索引或数据流进行索引或批量请求,而不是显式的创建索引或创建数据流请求。如果它们不与现有映射冲突,还允许自动更新索引和数据流的映射。自动更新映射操作是由于对包含可能映射的新字段的索引或数据流进行索引或批量请求,而不是显式的更新映射请求。 |
|
|
索引文档的权限。 [8.0] 在8.0中已弃用。 还授予使用更新映射API或依赖于 动态字段映射来更新索引映射(但不包括数据流映射)的权限。在未来的主要版本中,此权限将不再授予任何映射更新权限。 此权限不限制索引操作仅限于创建文档,而是限制API使用仅限于索引API。索引API允许用户覆盖之前索引的文档。请参阅 |
|
|
索引文档的权限。 它不授予更新或覆盖现有文档的权限。 [8.0] 在8.0中已弃用。 还授予使用 更新映射API或通过依赖 动态字段映射更新索引映射(但不包括数据流映射)的权限。在未来的主要版本中,此权限将不授予任何映射更新权限。 |
|
|
创建索引或数据流的权限。创建索引请求可能包含在创建索引后要添加的别名。在这种情况下,请求还需要对索引和别名名称具有 |
|
|
对位于使用API密钥模型配置的远程集群上的索引执行跨集群复制的权限。
此权限应仅用于远程索引权限的 此权限在Elastic Cloud无服务器版本中不可用。 |
|
|
用于从配置了基于API密钥模型的远程集群执行跨集群复制支持操作的权限。 此权限在Elastic Cloud无服务器版本中不可用。 此权限不应直接授予。它由创建跨集群API密钥和更新跨集群API密钥内部使用,以管理跨集群API密钥。 |
|
|
删除文档的权限。 |
|
|
删除索引或数据流的权限。 |
|
|
索引和更新文档的权限。 [8.0] 在8.0中已弃用。 还授予使用 更新映射API 或依赖于 动态字段映射 来更新索引映射(但不包括数据流映射)的权限。在未来的主要版本中,此权限将不再授予任何映射更新权限。 |
|
|
允许刷新、刷新、同步刷新和强制合并索引管理操作。 没有读取或写入索引数据或以其他方式管理索引的权限。 |
|
|
所有 |
|
|
所有与读取和管理数据流内置生命周期相关的数据流生命周期操作。 这包括向数据流添加和移除生命周期等操作。 |
|
|
管理跟随者索引生命周期所需的所有操作,包括创建跟随者索引、关闭它以及将其转换为常规索引。此权限仅在包含跟随者索引的集群上才需要。 此权限在 Elastic Cloud 无服务器版中不可用。 |
|
|
所有与管理索引或数据流策略执行相关的索引生命周期管理操作。这包括重试策略和从索引或数据流中移除策略等操作。 此权限在Elastic Cloud无服务器版本中不可用。 |
|
|
管理领导者索引生命周期所需的所有操作,包括忘记跟随者。此权限仅在包含领导者索引的集群上才需要。 此权限在Elastic Cloud无服务器版本中不可用。 |
|
|
所有用于监控的操作(恢复、段信息、索引统计和状态)。 |
|
|
只读访问操作(计数、解释、获取、批量获取、获取索引脚本、 更多类似内容、多重过滤/搜索/术语向量、过滤、滚动、 清除滚动、搜索、建议、电视)。 |
|
|
从远程集群中对搜索操作的只读访问权限。 此权限在Elastic Cloud无服务器版本中不可用。 |
|
|
只读访问索引和数据流元数据(别名、存在性、字段能力、字段映射、获取索引、获取数据流、ILM解释、映射、搜索分片、设置、验证查询)。 此权限主要供Kibana用户使用。 |
|
|
执行对文档的所有写操作的权限,包括索引、更新和删除文档的权限,以及执行批量操作的权限,同时还允许动态更新索引映射。 [8.0] 在8.0中已弃用。 它还授予使用更新映射API更新索引映射(但不包括数据流映射)的权限。 这将在未来的主要版本中被撤销。 |
以特权运行
editThe run_as 权限使经过身份验证的用户能够代表其他用户提交请求。该值可以是用户名或以逗号分隔的用户名列表。(您也可以将用户指定为字符串数组或 YAML 序列。)有关更多信息,请参阅 代表其他用户提交请求。
此权限在 Elastic Cloud 无服务器中不可用。
应用程序权限
edit应用程序权限在 Elasticsearch 中进行管理,可以通过 has privileges API 和 get application privileges API 获取。然而,它们并不授予对 Elasticsearch 中任何操作或资源的访问权限。它们的目的是使应用程序能够在 Elasticsearch 角色中表示和存储自己的权限模型。
要创建应用程序权限,请使用添加应用程序权限 API。然后,您可以将这些应用程序权限与角色关联,如定义角色中所述。
文档级安全
edit文档级安全限制了用户可以读取的文档。 特别是,它限制了可以从基于文档的读取API访问哪些文档。
要启用文档级安全,您可以使用查询来指定每个角色可以访问的文档。文档 query 与特定的数据流、索引或通配符 (*) 模式相关联,并与为数据流和索引指定的权限一起操作。
指定的文档 query:
- 期望与在搜索请求中定义的格式相同
- 支持模板化角色查询,可以访问当前已认证用户的详细信息
- 接受以字符串值或嵌套JSON编写的查询
- 支持大多数Elasticsearch的查询领域特定语言(DSL),但在字段和文档级别安全方面存在一些限制
完全省略 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、@timestamp和message字段的读取访问权限。
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字段上。
要保护一个具体的字段,必须直接使用其字段名称。
有关更多信息,请参阅设置字段和文档级别的安全性。
授予数据流和别名的权限
editElasticsearch 安全功能允许您保护针对 数据流 和 别名 执行的操作。
数据流权限
edit使用索引权限来控制对数据流的访问。授予数据流的权限会同时授予其支持索引的相同权限。
例如,my-data-stream 由两个后备索引组成:
.ds-my-data-stream-2099.03.07-000001 和
.ds-my-data-stream-2099.03.08-000002。
用户被授予对 my-data-stream 的 read 权限。
{
"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-stream 的 read 权限,用户可以直接从 .ds-my-data-stream-2099.03.09-000003 检索文档:
GET .ds-my-data-stream-2099.03.09-000003/_doc/2
别名权限
edit使用索引权限来控制对别名的访问。对索引或数据流的权限不会授予对其别名的权限。有关管理别名的信息,请参阅别名。
例如,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角色映射由除native和file之外的所有领域支持。
本地和文件领域直接将角色分配给用户。 本地领域使用用户管理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_CONF 是 ES_HOME/config(zip/tar 安装)或
/etc/elasticsearch(包安装)。要指定不同的位置,
您可以在 Active Directory、
LDAP 和
PKI 领域设置中配置
elasticsearch.yml 中的 files.role_mapping 设置。
在角色映射文件中,安全角色是键,组和用户是值。映射可以具有多对多的关系。当您将角色映射到组时,该组中用户的角色是分配给该组的角色和分配给该用户的角色的组合。
默认情况下,Elasticsearch 每 5 秒检查一次角色映射文件的更改。
您可以通过更改 elasticsearch.yml 文件中的 resource.reload.interval.high 设置来更改此默认行为。由于
这是 Elasticsearch 中的常见设置,更改其值可能会影响系统中的其他
调度。
虽然角色映射API是管理角色映射的首选方式,但在以下几种情况下,使用role_mapping.yml文件会变得非常有用:
- 如果你想定义固定的角色映射,除了具有物理访问Elasticsearch节点权限的管理员外,没有人能够更改。
- 如果集群管理依赖于来自外部领域的用户,并且这些用户即使在集群状态为RED时也需要将角色映射给他们。例如,通过LDAP或PKI进行身份验证并被分配管理员角色的管理员,以便他们能够执行纠正措施。
请注意,role_mapping.yml 文件作为最小的管理功能提供,并不旨在涵盖所有用例并用于定义角色。
您无法通过角色映射API查看、编辑或删除在角色映射文件中定义的任何角色。
领域特定细节
editActive 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"
您可以使用角色映射 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 领域
editPKI 领域支持将用户映射到角色,但不能映射组,因为 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 |
|---|---|
|
当前认证用户的用户名。 |
|
如果指定,当前已认证用户的完整姓名。 |
|
如果指定,则为当前已认证用户的电子邮件。 |
|
如果相关联,当前已认证用户的角色名称列表。 |
|
如果指定,一个包含当前已认证用户自定义元数据的哈希。 |
您还可以访问自定义用户元数据。例如,如果您在用户元数据中维护了一个
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_name 和 metadata )到当前文档,通过预处理摄取。当
您使用摄取管道索引数据时,用户详细信息会自动附加到文档中。如果身份验证凭据是API密钥,则API密钥
id, name 和 metadata(如果存在且非空)也会附加到
文档中。
更多信息请参见 Ingest pipelines 和 Set security user
使用跨集群 API 密钥的字段和文档级安全
edit跨集群API密钥 可以用于验证对远程集群的请求。search 参数定义了跨集群搜索的权限。replication 参数定义了跨集群复制的权限。
replication 不支持任何字段或文档级别的安全性。search 支持字段和文档级别的安全性。
由于与具有文档和字段级安全性的多个角色中描述的类似原因,
如果search参数定义了文档或字段级安全性,则无法创建同时具有search和replication参数的单个跨集群API密钥。
如果你需要同时使用这两个参数,并且需要为search参数定义文档或字段级别的安全性,
请创建两个单独的跨集群API密钥,一个使用search参数,
另一个使用replication参数。你还需要设置两个不同的
远程连接到同一个集群,每个命名连接使用适当的跨集群API密钥。
代表其他用户提交请求
editElasticsearch 角色支持 run_as 权限,该权限允许经过身份验证的用户代表其他用户提交请求。例如,如果您的外部应用程序被信任来验证用户,Elasticsearch 可以验证该外部应用程序,并使用 run as 机制代表其他用户发出授权请求,而无需重新验证每个用户。
要“以”(模拟)另一个用户的身份运行,第一个用户(认证用户)必须通过支持运行委托的机制进行认证。第二个用户(run_as 用户)必须通过支持通过用户名进行委托运行查找的机制进行授权。
The run_as 权限本质上类似于一种次要形式的
委托授权。委托授权适用于进行身份验证的用户,而 run_as 权限适用于被模拟的用户。
- Authenticating user
对于认证用户,以下领域(加上API密钥)都支持run_as委托:native、file、Active Directory、JWT、Kerberos、LDAP和PKI。
服务令牌、Elasticsearch 令牌服务、SAML 2.0 和 OIDC 1.0 不支持 run_as 委托。
-
run_asuser
Elasticsearch 支持任何支持用户查找的领域使用 run_as。并非所有领域都支持用户查找。请参阅支持的领域列表,并确保您希望使用的领域已配置为支持用户查找。
必须从领域中检索run_as用户 - 不能以
服务账户、
API密钥或
访问令牌的身份运行。
要代表其他用户提交请求,您需要在您的角色中拥有run_as权限。例如,以下请求创建了一个my_director角色,该角色授予代表jacknich或redeniro提交请求的权限:
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_user或analyst_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_realm 和 lookup_realm 都指定了 native 领域,因为 admin_user 和 analyst_user 都来自该领域。如果这两个用户位于不同的领域,则 authentication_realm 和 lookup_realm 的值将不同(例如 pki 和 native)。
配置授权委托
edit在某些情况下,用户通过某个领域进行身份验证后,我们可能希望将用户查找和角色分配委托给另一个领域。任何支持用户查找(无需用户凭据)的领域都可以用作授权领域。
例如,通过Kerberos领域进行身份验证的用户可以在LDAP领域中查找。LDAP领域负责在LDAP中搜索用户并确定其角色。在这种情况下,LDAP领域充当授权领域。
作为授权域的LDAP域
edit以下是可作为授权领域使用的LDAP领域的一个示例配置。此LDAP领域在用户搜索模式下配置,并指定了一个过滤器。
有关配置LDAP领域的更多信息,请参阅LDAP用户认证。
配置为委托授权的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
自定义角色和授权
edit如果您需要从一个不受开箱即用支持的系统中检索用户角色,或者如果Elasticsearch安全功能提供的授权系统不符合您的需求,可以实现一个SPI加载的安全扩展来定制角色检索和/或授权系统。SPI加载的安全扩展是一个普通的elasticsearch插件的一部分。
实现自定义角色提供程序
edit要创建自定义角色提供程序:
-
实现接口
BiConsumer。 也就是说,实现包括一个方法,该方法接受一组字符串,这些字符串是要解析的角色名称,以及一个ActionListener,在解析的角色描述符集作为响应传递时使用。, ActionListener >> -
自定义角色提供程序实现必须特别注意不要在任何I/O操作上阻塞。实现有责任确保异步行为和非阻塞调用,这通过提供
ActionListener来发送响应,当角色已解析且响应准备好时,变得更容易。
将您的自定义角色提供程序打包为插件:
-
为您的角色提供者实现一个扩展类,该类实现了
org.elasticsearch.xpack.core.security.SecurityExtension。在那里,您需要重写以下一个或多个方法:@Override public List
, ActionListener >>> getRolesProviders(Settings settings, ResourceWatcherService resourceWatcherService) { ... } 方法
getRolesProviders用于提供一组自定义角色提供程序,这些提供程序将在无法通过保留角色或本地角色存储解析角色名称时使用。返回的列表应按照自定义角色提供程序应被调用以解析角色的顺序排列。例如,如果getRolesProviders返回两个角色提供程序实例,并且它们都能够解析角色A,那么将用于角色A的解析角色描述符将是列表中第一个角色提供程序解析的那个。
实现授权引擎
edit要创建一个授权引擎,您需要:
-
在具有所需授权行为的类中实现
org.elasticsearch.xpack.core.security.authz.AuthorizationEngine接口。 -
在包含授权请求所需信息的类中实现
org.elasticsearch.xpack.core.security.authz.Authorization.AuthorizationInfo接口。
将您的授权引擎打包为插件:
-
为您的授权引擎实现一个扩展类,该类扩展了
org.elasticsearch.xpack.core.security.SecurityExtension。在那里,您需要重写以下方法:@Override public AuthorizationEngine getAuthorizationEngine(Settings settings) { ... }The
getAuthorizationEngine方法用于提供授权引擎实现。
提供了示例代码,展示了自定义授权引擎的结构和实现,位于GitHub上的 elasticsearch 仓库中。您可以使用此代码作为创建自己的授权引擎的起点。
实现一个elasticsearch插件
edit为了为您的自定义角色提供程序或授权引擎注册安全扩展,您还需要实现一个包含该扩展的elasticsearch插件:
-
实现一个扩展
org.elasticsearch.plugins.Plugin的插件类 - 为插件创建一个构建配置文件;我们推荐使用Gradle。
-
按照插件作者帮助中的描述,创建一个
plugin-descriptor.properties文件。 -
为扩展创建一个
META-INF/services/org.elasticsearch.xpack.core.security.SecurityExtension描述符文件,其中包含您的org.elasticsearch.xpack.core.security.SecurityExtension实现的完全限定类名 - 将所有内容打包到一个zip文件中。
使用安全扩展
edit要使用安全扩展:
-
在集群中的每个节点上安装带有扩展的插件。您运行
bin/elasticsearch-plugin并使用install子命令,并指定指向包含扩展的zip文件的URL。例如:bin/elasticsearch-plugin install file:///
/my-extension-plugin-1.0.zip -
将扩展中的任何配置参数添加到
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接口中的方法。 - 重启 Elasticsearch。