📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

plugins.index_management.filter_by_external_roles 配置项用于控制是否根据用户的后端角色过滤索引管理(ISM)资源的访问

索引管理包括策略(Policies)、转换(Transforms)、汇总(Rollups)等资源。当启用此配置时,用户只能访问其后端角色与资源存储的后端角色有交集的资源。这为多租户环境提供了基于角色的访问控制。

配置项属性 #

  • 配置路径: plugins.index_management.filter_by_external_roles
  • 数据类型: Boolean(布尔值)
  • 默认值: false
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: (可以动态更新,无需重启)

配置项详解 #

工作机制 #

外部角色过滤机制

禁用过滤 (false, 默认):
├── 不检查后端角色
├── 任何认证用户可访问所有资源
├── user 字段仍被存储
└── 适用于单租户环境 ✅


启用过滤 (true):
├── 检查请求用户的后端角色
├── 检查资源的后端角色字段
├── 计算交集
├── 有交集 → 允许访问 ✅
├── 无交集 → 拒绝访问 ❌
└── all_access 角色绕过过滤 ✅


资源类型:
├── ISM Policies (索引策略)
├── Transforms (数据转换)
├── Rollups (数据汇总)
└── 其他索引管理资源

访问控制流程 #

访问控制详细流程

1. 用户请求访问 ISM 资源
   GET _ilm/policy/my-policy


2. 获取用户后端角色
   用户: alice
   后端角色: [tenant-a-admin, team-dev]


3. 读取资源后端角色
   资源: my-policy
   存储角色: [tenant-a-admin, tenant-a-user]


4. 计算交集
   用户角色: [tenant-a-admin, team-dev]
   资源角色: [tenant-a-admin, tenant-a-user]
   交集: [tenant-a-admin]
   有交集 → 允许访问 ✅


5. 无交集情况
   用户: bob
   后端角色: [tenant-b-admin]
   资源角色: [tenant-a-admin, tenant-a-user]
   交集: 无
   无交集 → 拒绝访问 ❌


6. all_access 绕过
   用户: admin
   后端角色: [all_access]
   任何资源 → 允许访问 ✅

角色存储 #

资源中的后端角色存储

创建 ISM 策略:
PUT _ilm/policy/tenant-a-policy
{
  "policy": {
    "description": "Tenant A policy",
    "default_state": "hot",
    "states": [...]
  },
  "seq_no": 0,
  "primary_term": 0,
  "roles": ["tenant-a-admin", "tenant-a-user"]
}


访问控制:
├── 启用过滤后
├── 只有包含这些角色的用户可访问
├── 角色必须至少有一个匹配
└── 实现租户隔离


创建转换:
PUT _transform/tenant-a-transform
{
  "source": {...},
  "dest": {...},
  "roles": ["tenant-a-admin"]
}


同理适用于:
├── Rollups
├── 其他 ISM 资源
└── 统一的访问控制

配置建议 #

单租户环境(默认) #

plugins:
  index_management:
    filter_by_external_roles: false  # 默认值

建议: 单租户环境保持默认值 false

多租户环境 #

plugins:
  index_management:
    filter_by_external_roles: true  # 启用过滤

建议: 多租户环境启用,实现资源隔离。

开发环境 #

plugins:
  index_management:
    filter_by_external_roles: false  # 简化开发

建议: 开发环境禁用,便于调试。

生产环境(多租户) #

plugins:
  index_management:
    filter_by_external_roles: true  # 启用安全控制

建议: 生产多租户环境必须启用。

代码示例 #

easysearch.yml 基础配置 #

plugins:
  index_management:
    filter_by_external_roles: true

完整多租户配置 #

# 启用安全
xpack:
  security:
    enabled: true

# 启用 ISM 角色过滤
plugins:
  index_management:
    filter_by_external_roles: true
  snapshot_management:
    filter_by_backend_roles: true

动态更新配置 #

// 运行时更新(无需重启)
PUT /_cluster/settings
{
  "transient": {
    "plugins.index_management.filter_by_external_roles": true
  }
}

创建带角色控制的策略 #

PUT _ilm/policy/tenant-a-logs-policy
{
  "policy": {
    "description": "Tenant A logs retention policy",
    "default_state": "hot",
    "states": [
      {
        "name": "hot",
        "actions": [{"rollover": {...}}]
      },
      {
        "name": "warm",
        "actions": [{"replica_count": {...}}]
      }
    ],
    "isms": [
      {"pattern": "tenant-a-logs-*", "priority": 100}
    ]
  },
  "roles": ["tenant-a-admin", "tenant-a-ops"]
}

相关配置 #

配置项作用默认值
plugins.index_management.filter_by_external_rolesISM 角色过滤false
plugins.snapshot_management.filter_by_backend_roles快照管理角色过滤false
xpack.security.enabled安全功能开关true

多租户场景 #

多租户场景配置

场景 1: SaaS 多租户

租户 A:
├── 用户: alice
├── 后端角色: [tenant-a-admin]
└── 可访问: tenant-a-* 资源


租户 B:
├── 用户: bob
├── 后端角色: [tenant-b-admin]
└── 可访问: tenant-b-* 资源


配置:
plugins:
  index_management:
    filter_by_external_roles: true


效果:
├── alice 不能访问 tenant-b 资源 ✅
├── bob 不能访问 tenant-a 资源 ✅
└── 租户完全隔离


场景 2: 部门隔离

部门 A:
├── 用户: team-a-lead
├── 后端角色: [dept-a-admin]
└── 资源: dept-a-*


部门 B:
├── 用户: team-b-lead
├── 后端角色: [dept-b-admin]
└── 资源: dept-b-*


效果:
├── 部门间完全隔离
├── 各自管理自己的策略
└── 提高安全性

使用场景 #

推荐启用角色过滤的场景 #

  • 多租户 SaaS: 需要租户间完全隔离
  • 企业部门隔离: 不同部门管理各自的策略
  • 外部认证: 使用 LDAP/AD/SAML 等外部认证
  • 合规要求: 需要严格的访问控制
  • 托管服务: 为多个客户托管 Easysearch

推荐禁用角色过滤的场景 #

  • 单租户环境: 只有一个组织使用
  • 内部开发: 开发和测试环境
  • 完全信任环境: 所有用户都信任

安全考虑 #

安全配置建议

1. 启用外部认证
   xpack:
     security:
       authc:
         realms:
           ldap:
             my-ldap: {...}


2. 配置角色映射
   security:
     authz:
       roles:
         tenant-a-admin:
           indices: [...]
           roles: ["tenant-a-admin"]


3. 启用 ISM 过滤
   plugins:
     index_management:
       filter_by_external_roles: true


4. 创建带角色的资源
   PUT _ilm/policy/...
   {"roles": ["tenant-a-admin"]}


5. 验证隔离
   ├── 使用不同用户测试
   ├── 验证访问限制
   └── 审计日志

注意事项 #

  1. 默认值: 默认值为 false,不启用过滤。

  2. 动态更新: 支持动态更新,无需重启。

  3. 后端角色: 依赖于外部认证系统的角色。

  4. all_access: 拥有 all_access 角色的用户绕过过滤。

  5. 现有资源: 启用后,没有角色的现有资源可能无法访问。

  6. 资源创建: 创建资源时应指定 roles 字段。

  7. 性能影响: 启用后会有轻微的性能开销。

  8. 测试验证: 启用前应充分测试。

  9. 审计日志: 配合审计日志监控访问。

  10. 快照管理: 同时考虑 snapshot_management 的类似配置。

故障排查 #

常见问题排查

问题 1: 启用后无法访问资源

现象:
403 Forbidden when accessing ISM policies


原因:
├── 用户的角色与资源角色无交集
├── 资源未设置 roles 字段
└── 或 roles 配置错误


解决:
├── 检查用户的后端角色
├── 检查资源的 roles 字段
├── 确保有角色交集
└── 或临时禁用过滤


问题 2: 创建资源时未指定角色

后果:
├── 资源创建成功
├── 但启用过滤后可能无法访问
└── 需要更新资源添加角色


解决:
├── 创建时指定 roles
├── 或更新现有资源
├── 测试访问
└── 文档化角色分配


问题 3: 角色配置错误

检查:
GET /_ilm/policy/my-policy

查看 roles 字段:
{
  "roles": ["tenant-a-admin"]
}


验证用户:
GET /_security/user/alice

查看后端角色:
{
  "username": "alice",
  "backend_roles": ["tenant-a-admin", ...]
}


确保有交集

最佳实践 #

角色过滤最佳实践

1. 多租户部署
   plugins:
     index_management:
       filter_by_external_roles: true

   ├── 启用过滤
   ├── 按租户定义角色
   ├── 资源创建时指定角色
   └── 测试隔离 ✅


2. 资源命名规范
   ├── 租户 A: tenant-a-*
   ├── 租户 B: tenant-b-*
   ├── 配合角色过滤
   └── 双重隔离


3. 角色设计
   ├── 每个租户: tenant-*-admin
   ├── 跨租户: tenant-*-readonly
   ├── 管理员: all_access
   └── 清晰的权限模型


4. 创建资源规范
   PUT _ilm/policy/...
   {
     "policy": {...},
     "roles": ["tenant-a-admin"]
   }

   ├── 始终指定 roles
   ├── 文档化角色分配
   └── 审计变更


5. 测试流程
   ├── 单元测试: 验证权限
   ├── 集成测试: 多租户场景
   ├── 渗透测试: 尝试跨租户
   └── 定期审计

与快照管理的配合 #

统一的访问控制配置

同时启用两个过滤:
plugins:
  index_management:
    filter_by_external_roles: true
  snapshot_management:
    filter_by_backend_roles: true


效果:
├── ISM 策略: 角色过滤
├── 快照仓库: 角色过滤
├── 统一的安全模型
└── 一致的用户体验


最佳实践:
├── 两个都启用
├── 使用相同的角色体系
├── 统一管理
└── 简化运维