预测安全性
预测功能使用与异常检测相同的安全框架。本页解释了如何配置用户权限以创建、运行和查看预测器;如何限制对系统索引的访问;以及如何跨团队隔离预测结果。
在所有示例中,请将凭证、索引名称和角色名称替换为适用于您环境的值。
预测功能创建的索引
下表描述了预测 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_access
和 forecast_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
。
(高级) 按后端角色限制访问
您可以使用后端角色来强制执行团队特定隔离。此模式允许不同团队独立操作预测器,同时分离配置和结果。
该模型包括三个层:
- 配置隔离 – 预测 API 仅限于具有匹配后端角色的用户。
- 结果隔离 – DLS 限制对
opensearch-forecast-result*
中预测结果的访问。 - 源数据访问 – 一个最小的只读角色使每个预测器能够扫描其自己的索引。
以下各节解释了如何配置每一层。
为用户分配后端角色
在大多数环境中,后端角色通过 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_access
、result_access
和 data_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"]}'
在两个集群中授予源索引读取权限
要创建预测器,用户还需要对预测器读取的每个源索引、别名或模式具有 search
或 read
操作组 的索引级别权限。读取远程索引时,权限检查在两个集群中都会发生。在两个位置定义并映射相同的角色。
在本地集群中,定义一个授予源索引访问权限的 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、身份验证后端、租户隔离和审计日志的更多信息,请参阅安全插件文档。