Link Search Menu Expand Document Documentation Menu

预测安全性

预测功能使用与异常检测相同的安全框架。本页解释了如何配置用户权限以创建、运行和查看预测器;如何限制对系统索引的访问;以及如何跨团队隔离预测结果。

在所有示例中,请将凭证、索引名称和角色名称替换为适用于您环境的值。

预测功能创建的索引

下表描述了预测 API 使用的索引及其对普通用户的可见性。

索引模式 目的 对普通用户可见?
.opensearch-forecasters 存储预测器配置。
.opensearch-forecast-checkpoints 存储模型快照(检查点)。
.opensearch-forecast-state 存储实时和一次性预测的任务元数据。
opensearch-forecast-result* 存储回测和实时预测的结果。

用户不需要直接访问 .opensearch-forecast-checkpoints;它由插件内部使用。

要查看 .opensearch-forecasters,请使用获取预测器搜索预测器 API。

要查看 .opensearch-forecast-state,请使用带 ?task=true 查询参数的获取预测器 API,或直接调用搜索任务 API。

集群权限

每个预测 API 路由都映射到特定的集群级别权限,如下表所示。您必须将这些权限授予管理或与预测器交互的角色。

路由 所需权限
POST /_plugins/_forecast/forecasters cluster:admin/plugin/forecast/forecaster/write
PUT /_plugins/_forecast/forecasters/{id} cluster:admin/plugin/forecast/forecaster/write
POST /_plugins/_forecast/forecasters/_validate cluster:admin/plugin/forecast/forecaster/validate
POST /_plugins/_forecast/forecasters/_suggest/{types} cluster:admin/plugin/forecast/forecaster/suggest
GET /_plugins/_forecast/forecasters/{id}
GET /_plugins/_forecast/forecasters/{id}?task=true
cluster:admin/plugin/forecast/forecaster/get
DELETE /_plugins/_forecast/forecasters/{id} cluster:admin/plugin/forecast/forecaster/delete
POST /_plugins/_forecast/forecasters/{id}/_start
POST /_plugins/_forecast/forecasters/{id}/_stop
cluster:admin/plugin/forecast/forecaster/jobmanagement
POST /_plugins/_forecast/forecasters/{id}/_run_once cluster:admin/plugin/forecast/forecaster/runOnce
POST /_plugins/_forecast/forecasters/_search
GET /_plugins/_forecast/forecasters/_search
cluster:admin/plugin/forecast/forecaster/search
GET /_plugins/_forecast/forecasters/tasks/_search cluster:admin/plugin/forecast/tasks/search
POST /_plugins/_forecast/forecasters/{id}/results/_topForecasts cluster:admin/plugin/forecast/result/topForecasts
GET /_plugins/_forecast/forecasters/{id}/_profile cluster:admin/plugin/forecast/forecasters/profile
GET /_plugins/_forecast/stats cluster:admin/plugin/forecast/forecaster/stats
GET /_plugins/_forecast/forecasters/count
GET /_plugins/_forecast/forecasters/match
cluster:admin/plugin/forecast/forecaster/info

所需角色

预测用户需要三种类型的权限,基于以下职责:

  • 管理预测任务
  • 读取源数据
  • 访问预测结果

这些职责对应于三个不同的安全层,如下表所示。

控制内容 典型角色
预测器控制 创建、编辑、启动、停止、删除或查看预测器配置的权限。 forecast_full_access
(管理生命周期)

forecast_read_access
(只读)
数据源读取 授予预测器查询用于训练和预测的原始指标索引的权限。 自定义角色,例如 data_source_read
结果读取 授予用户和告警监视器访问 opensearch-forecast-result* 中文档的权限。 自定义角色,例如 forecast_result_read

内置角色 forecast_full_accessforecast_read_access 仅适用于预测 API。它们包含源或结果索引的权限——这些权限必须单独授予。

预测器控制角色

预测 API 包含两个内置角色,您可以直接使用它们,或将其用作创建自定义角色的模板:

  • forecast_read_access – 适用于需要预测器只读访问权限的分析师。此角色允许用户查看预测器详细信息和结果,但不能创建、修改、启动、停止或删除预测器。

  • forecast_full_access – 适用于负责管理预测器完整生命周期(包括创建、编辑、启动、停止和删除预测器)的用户。此角色授予对源索引的访问权限。要创建预测器,用户还必须具有索引级别权限,其中包括对预测器读取的任何索引或别名执行 search 操作的权限。

以下示例展示了这些角色的定义方式:

forecast_read_access:
  reserved: true
  cluster_permissions:
    - 'cluster:admin/plugin/forecast/forecaster/info'
    - 'cluster:admin/plugin/forecast/forecaster/stats'
    - 'cluster:admin/plugin/forecast/forecaster/suggest'
    - 'cluster:admin/plugin/forecast/forecaster/validate'
    - 'cluster:admin/plugin/forecast/forecasters/get'
    - 'cluster:admin/plugin/forecast/forecasters/info'
    - 'cluster:admin/plugin/forecast/forecasters/search'
    - 'cluster:admin/plugin/forecast/result/topForecasts'
    - 'cluster:admin/plugin/forecast/tasks/search'
  index_permissions:
    - index_patterns:
        - 'opensearch-forecast-result*'
      allowed_actions:
        - 'indices:admin/mappings/fields/get*'
        - 'indices:admin/resolve/index'
        - 'indices:data/read*'

forecast_full_access:
  reserved: true
  cluster_permissions:
    - 'cluster:admin/plugin/forecast/*'
    - 'cluster:admin/settings/update'
    - 'cluster_monitor'
  index_permissions:
    - index_patterns:
        - '*'
      allowed_actions:
        - 'indices:admin/aliases/get'
        - 'indices:admin/mapping/get'
        - 'indices:admin/mapping/put'
        - 'indices:admin/mappings/fields/get*'
        - 'indices:admin/mappings/get'
        - 'indices:admin/resolve/index'
        - 'indices:data/read*'
        - 'indices:data/read/field_caps*'
        - 'indices:data/read/search'
        - 'indices:data/write*'
        - 'indices_monitor'

这些角色不包含特定源或结果索引的默认 index_permissions。这是有意为之,允许您根据自己的数据访问要求添加模式。

数据源 read 角色

每个预测器都使用创建用户的凭证来查询源索引。为此,您必须授予该用户对您自己的数据索引的读取权限。

以下示例请求创建了一个最小角色,允许对 network-metrics 索引进行读取访问:

PUT _plugins/_security/api/roles/data_source_read
{
  "index_permissions": [{
    "index_patterns": ["network-metrics"],
    "allowed_actions": ["read"]
  }]
}

您可以修改 index_patterns 以匹配您的实际数据源。

Result‑read 角色

forecast_result_read 角色允许用户查看预测结果并配置查询这些结果的告警监视器。

以下示例请求定义了一个角色,该角色授予对所有匹配 opensearch-forecast-result* 模式的索引的读取访问权限:

PUT _plugins/_security/api/roles/forecast_result_read
{
  "index_permissions": [{
    "index_patterns": ["opensearch-forecast-result*"],
    "allowed_actions": ["read"]
  }]
}

如果您需要在团队之间隔离结果数据,可以使用文档级安全性 (DLS) 和后端角色过滤器来增强此角色,如下一节所示。

安全角色配置示例

以下示例请求创建了一个 devOpsEngineer 用户并为其分配了预测功能所需的所有三个角色:

PUT _plugins/_security/api/internalusers/devOpsEngineer
{
  "password": "DevOps2024!",
  "opendistro_security_roles": [
    "forecast_full_access",
    "data_source_read",
    "forecast_result_read"
  ]
}

此配置启用以下功能:

  • devOpsEngineer 可以管理预测器 (forecast_full_access)。
  • 预测器可以成功查询源索引 (data_source_read)。
  • 用户和任何配置的监视器都可以读取预测结果 (forecast_result_read)。

要授予预测器配置的只读访问权限,请将 forecast_full_access 替换为 forecast_read_access


(高级) 按后端角色限制访问

您可以使用后端角色来强制执行团队特定隔离。此模式允许不同团队独立操作预测器,同时分离配置和结果。

该模型包括三个层:

  1. 配置隔离 – 预测 API 仅限于具有匹配后端角色的用户。
  2. 结果隔离 – DLS 限制对 opensearch-forecast-result* 中预测结果的访问。
  3. 源数据访问 – 一个最小的只读角色使每个预测器能够扫描其自己的索引。

以下各节解释了如何配置每一层。

为用户分配后端角色

在大多数环境中,后端角色通过 LDAP 或 SAML 分配。但是,如果您使用内部用户数据库,则可以手动设置它们,如下例所示:

# Analyst
PUT _plugins/_security/api/internalusers/alice
{
  "password": "alice",
  "backend_roles": ["analyst"]
}

# HR staff
PUT _plugins/_security/api/internalusers/bob
{
  "password": "bob",
  "backend_roles": ["human-resources"]
}

然后,这些后端角色可用于按团队控制对预测器和预测结果的访问。

启用后端角色过滤以进行配置访问

要按团队隔离预测器配置,请在集群级别启用后端角色过滤:

PUT _cluster/settings
{
  "persistent": {
    "plugins.forecast.filter_by_backend_roles": true
  }
}

启用此设置后,OpenSearch 会在每个预测器文档中记录创建者的后端角色。只有具有匹配后端角色的用户才能查看、编辑或删除该预测器。

为每个团队创建 result‑access 角色

预测结果存储在共享索引中,因此请使用 DLS 根据后端角色限制访问。

以下示例请求创建了一个角色,该角色允许具有 analyst 后端角色的用户只读写其团队的预测结果:

PUT _plugins/_security/api/roles/forecast_analyst_result_access
{
  "index_permissions": [{
    "index_patterns": ["opensearch-forecast-result*"],
    "dls": """
    {
      "bool": {
        "filter": [{
          "nested": {
            "path": "user",
            "query": {
              "term": {
                "user.backend_roles.keyword": "analyst"
              }
            },
            "score_mode": "none"
          }
        }]
      }
    }""",
    "allowed_actions": ["read","write"]
  }]
}

要隔离另一个团队(例如 human-resources)的结果,请创建一个单独的角色(例如,forecast_human_resources_result_access),并更新术语值以匹配相应的后端角色。

定义 data-source 读取访问权限

data_source_read 角色的定义方式与前面的示例相同。它授予每个预测器用于训练和预测的指标索引的最小读取访问权限。

如果您需要按索引限制,可以在团队之间重用此角色,或者创建单独的版本。

将用户映射到三个角色

以下示例将用户 alice 映射到所有三个所需角色——full_accessresult_accessdata_source_read——使用 analyst 后端角色:

PUT _plugins/_security/api/internalusers/alice
{
  "password": "alice",
  "backend_roles": ["analyst"],
  "opendistro_security_roles": [
    "forecast_full_access",
    "forecast_analyst_result_access",
    "data_source_read"
  ]
}

通过此配置,Alice 可以:

  • 仅创建、启动、停止和删除标有 analyst 后端角色的预测器。
  • 仅查看标有 analyst 后端角色的预测结果。
  • 读取 network-metrics 索引作为其预测器的来源。

要配置第二个用户(例如来自 HR 团队的 bob),请使用并行设置,并使用 human-resources 后端角色和 forecast_human_resources_result_access

没有后端角色的用户

如果用户具有 forecast_read_access 角色但没有后端角色,则他们无法查看任何预测器。后端角色过滤强制严格匹配,并阻止访问与用户角色不一致的配置。


选择具有精细访问控制的远程索引

要使用远程索引作为预测器的数据源,请遵循跨集群搜索文档的身份验证流程部分中概述的步骤。

要成功,用户必须:

  • 使用在本地和远程集群中都存在的安全角色。
  • 在两个集群中都将该角色映射到相同的用户名。

示例:在本地集群中创建新用户

使用以下命令在本地集群中创建一个可以创建预测器的新用户:

curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://:9200/_plugins/_security/api/internalusers/forecastuser' \
  -H 'Content-Type: application/json' \
  -d '{"password":"password"}'

使用以下命令将新用户映射到 forecast_full_access 角色:

curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://:9200/_plugins/_security/api/rolesmapping/forecast_full_access' \
  -H 'Content-Type: application/json' \
  -d '{"users":["forecastuser"]}'

在远程集群中,创建相同的用户并将 forecast_full_access 映射到该角色,如下所示:

# Create the user
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://:9250/_plugins/_security/api/internalusers/forecastuser' \
  -H 'Content-Type: application/json' \
  -d '{"password":"password"}'

# Map the role
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://:9250/_plugins/_security/api/rolesmapping/forecast_full_access' \
  -H 'Content-Type: application/json' \
  -d '{"users":["forecastuser"]}'

在两个集群中授予源索引读取权限

要创建预测器,用户还需要对预测器读取的每个源索引、别名或模式具有 searchread 操作组 的索引级别权限。读取远程索引时,权限检查在两个集群中都会发生。在两个位置定义并映射相同的角色。

在本地集群中,定义一个授予源索引访问权限的 read 角色,并将其映射到预测用户,如下所示:

# Create a role that can search the data
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://:9200/_plugins/_security/api/roles/data_source_read' \
  -H 'Content-Type: application/json' \
  -d '{
        "index_permissions":[{
          "index_patterns":["network-requests"],
          "allowed_actions":["search"]
        }]
      }'

# Map the role to forecastuser
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://:9200/_plugins/_security/api/rolesmapping/data_source_read' \
  -H 'Content-Type: application/json' \
  -d '{"users":["forecastuser"]}'

在远程集群中,定义相同的角色并将其映射到相同的用户,以确保权限在集群之间镜像,如下所示:

# Create the identical role
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://:9250/_plugins/_security/api/roles/data_source_read' \
  -H 'Content-Type: application/json' \
  -d '{
        "index_permissions":[{
          "index_patterns":["network-requests"],
          "allowed_actions":["search"]
        }]
      }'

# Map the role to the same user
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://:9250/_plugins/_security/api/rolesmapping/data_source_read' \
  -H 'Content-Type: application/json' \
  -d '{"users":["forecastuser"]}'

将远程集群注册到本地集群

使用 cluster.remote.<alias>.seeds 设置下的种子节点将远程集群注册到本地集群。在 OpenSearch 中,这称为添加一个 follower 集群。

假设远程集群正在侦听传输端口 9350,请在本地集群中运行以下命令:

curl -X PUT "https://:9200/_cluster/settings" \
  -H "Content-Type: application/json" \
  -u "admin:<custom-admin-password>" \
  -d '{
    "persistent": {
      "cluster.remote": {
        "follower": {
          "seeds": [ "127.0.0.1:9350" ]
        }
      }
    }
  }'

  • 如果远程节点位于不同的主机上,请将 127.0.0.1 替换为远程节点的传输层 IP。
  • 别名 follower 可以是您选择的任何名称,并将在引用远程索引或配置跨集群复制时使用。

自定义结果索引权限

您可以为预测结果指定一个自定义索引,而不是使用默认结果索引。如果自定义索引尚不存在,当您创建预测器并启动实时分析或测试运行后,它将自动创建。

如果自定义索引已存在,预测 API 会检查索引映射是否与预期的预测结果结构匹配。为确保兼容性,索引必须符合 forecast-results.json 文件中定义的架构。

当用户创建预测器时(无论是在 OpenSearch Dashboards 中还是通过调用预测 API),系统都会验证该用户对自定义索引是否具有以下索引级别权限:

  • indices:admin/create – 创建和滚动自定义结果索引所需。
  • indices:admin/aliases – 创建和管理索引别名所需。
  • indices:data/write/index – 将预测结果写入索引所需(单流预测器)。
  • indices:data/read/search – 在显示预测结果时搜索自定义索引所需。
  • indices:data/write/delete – 删除旧的预测结果和管理磁盘使用所需。
  • indices:data/write/bulk* – 插件使用批量 API 写入结果所需。

下一步

有关 TLS、身份验证后端、租户隔离和审计日志的更多信息,请参阅安全插件文档