资讯动态

Elasticsearch集群权限管理实战:从认证授权到角色隔离

发布时间:2026/10/13 5:23:46 来源:尧图企业网站定制
1. 项目概述与需求拆解1.1 为什么要给 Elasticsearch 集群做权限管理大部分用过 Elasticsearch 的人一开始部署集群基本都是裸奔状态9200 端口一开内网 IP 一填curl 一下就能返回所有索引的数据。前期自己搭环境、本地调试确实方便但一旦涉及多人协作、多业务方共用、或者生产环境数据上规模裸奔几乎一定会出事。我见过太多这样的情况某个业务同学往集群里写数据索引名随手起一个对着索引发了个delete_by_query把别人正在用的数据删了一半或者新来的同事不知道规矩直接GET _all把全库的数据刷了一遍内存被打满集群直接飘红。权限管理解决的就是这些问题。它要做三件事第一确认“你是谁”也就是身份认证第二决定“你能干什么”也就是授权控制第三记录“你干了什么”也就是操作审计。Elasticsearch 从 6.8 和 7.0 版本开始把安全功能免费开放给了基础版用户也就是说不需要购买企业版就能用上大部分和权限管理相关的核心能力这也让权限管理的普及率一下子高了很多。1.2 这里的权限管理具体指什么很多刚接触的人会把权限管理等同于“给用户设一个密码”。其实 ES 的权限体系比这要立体得多。它至少涉及以下几个层面传输层加密TLS客户端到节点、节点到节点之间的通信加密防止请求被截获。认证层用户名密码认证、基于证书的认证、基于文件的认证、甚至外部认证LDAP/AD等。授权层这是核心中的核心。一个用户能访问哪些索引、能在这些索引上执行哪些动作读、写、删除、管理、能访问哪些字段、能使用哪些 API全部由授权规则控制。审计层谁在什么时候从哪里执行了什么请求都在日志中有迹可循。把这四层组合起来就构成了一套完整的 ES 集群权限管理体系。我在实际工作中几乎一半的权限管理需求来自“多团队隔离”比如某金融公司有一个 ES 集群技术部、风控部、运营部都在用数据都写在同一套集群里。技术部维护系统日志索引风控部看交易数据运营部做用户行为分析。如果没有权限隔离风控的同学一个误操作删了技术部的索引或者运营部的人在 Kibana 上看到了本来没权限看的数据这都是事故级别的风险。这也是我要写这篇文章的原因我做过不少 ES 集群的权限改造项目其中踩坑不少有些配置在官方文档里写得很隐晦。这次我把整套思路和实操流程拆开逐步讲清楚。这篇文章适合这样的读者正在做 ES 集群运维的工程师、刚接手现有集群想补权限管理的开发、或者是想从零搭建一套带权限控制的 ES 环境但不知道从哪里下手的同学。文中以 7.x 版本为主不同小版本之间 API 差异不大但个别细节我会单独标注。2. 权限管理方案的整体设计思路2.1 先理清认证和授权的分层关系我建议在做权限配置之前先画一张逻辑图第一层是请求到达节点节点首先验证身份身份不过直接拒绝第二层是身份通过后检查“该身份对应的角色有哪些”一个角色定义了若干权限规则第三层是所有角色叠加后的最终权限集类似 Unix 文件权限里的 ACL 合并第四层是按权限规则过滤请求决定当前操作是否放行。这张图最大的价值在于它帮助你把“用户”和“权限”解耦。比如有十个用户都是只读权限我不需要给每个用户重复配权限而是创建一个readonly_role这十个用户都挂到这个角色下。以后要调整只读规则只需要改一个角色其他全部生效。这就是 ES 权限模型里最核心的 RBAC基于角色的权限控制思想。在 ES 中“权限”又被拆解成了更细的维度集群级权限cluster privilege负责管理集群整体行为比如查看节点状态、管理索引模板、执行 reindex 任务这类动作索引级权限index privilege负责控制用户对索引的具体操作比如读、写、删除、创建索引等。这些权限在官方文档里叫 privilege 名称比如read、write、monitor、manage。2.2 为什么用内置用户体系优先而不是接入外部认证每次做权限方案评审总有人问我用户体系有必要用 ES 自带的吗能不能对接公司现有的统一登录平台我的答案通常是可以但要分阶段。ES 基础版本身支持多种认证方式包括内置用户、文件认证、以及通过扩展接入外部认证系统。但外部认证需要额外配置而且依赖网络条件、认证服务稳定性一旦认证服务出问题整个集群的访问都会被卡住。我自己在项目初期通常建议先启用内置用户体系把权限模型建好后续再平滑扩展到外部认证。原因也很实际ES 内置用户体系非常简单内置账号包括elastic超级用户、kibana_system供 Kibana 系统使用、logstash_system供 Logstash 写入使用、beats_system等开箱即用。你只需要先修改这些内置账号的初始密码然后基于角色创建业务账号就能跑通第一套权限闭环。这样做还有一个隐藏的好处你可以在不过度依赖外部系统的前提下彻底摸清 ES 权限模型的工作原理。很多同学跳过了这一步直接接外部认证结果角色映射、权限继承等概念还没搞懂出了问题很难排查。2.3 生产环境的权限规划建议根据我跨过多个项目总结的经验一个健康的 ES 集群权限规划至少要覆盖这些维度账号分三类集群管理员、业务只读用户、业务写入用户。如有需要再加一个运维审计账号只授予查看集群健康状态和任务状态之类的只读权限。索引命名规范为不同业务方分配不同的索引前缀比如tech-logs-*、risk-trade-*、user-behavior-*。权限规则基于索引前缀匹配这样可以大幅简化授权配置。Kibana 接入控制Kibana 的使用也涉及空间权限和功能权限。不同团队应该分配独立的 Kibana 空间Space互不干扰。内置账号密码定期轮换这点经常被忽略。很多集群刚开始配了密码一年后再也没动过这相当于把大门钥匙一直挂在门口。这四个维度搭起来后权限体系的基本骨架就成型了。接下来就是动手实操。3. 核心细节解析与实操准备3.1 开启安全特性的前提检查这一步很关键我见过有人跳过配置直接重启集群就是因为在低版本上安全特性默认不生效改动配置后没报错但行为没变。ES 从 7.x 开始在elasticsearch.yml中加入xpack.security.enabled: true才能启用安全功能。如果是 6.x 版本还需要装 X-Pack 插件。现在用 7.8 以上版本基本都是自带的安全功能不需要额外装插件。但要注意在集群中启用安全特性意味着节点间通信也必须启用 TLS这是强制要求。如果你只开启了安全特性却不配置节点间加密通信节点会启动失败。这一点官方文档明确说过但我还是见过有人尝试跳过。正确做法是先为每个节点生成证书再在配置中打开 TLS。自签名证书一般有两种生成方式一种是使用 ES 自带的elasticsearch-certutil命令另一种是自己用 openssl 生成再手动指定证书文件路径。对于生产环境我建议用elasticsearch-certutil生成 CA 和节点证书因为格式和路径管理都比较标准。elasticsearch-certutil的cert子命令支持生成两种情况为每个节点生成独立证书或者为一个节点生成证书后复制到其他节点。多节点集群建议每个节点独立生成。3.2 TLS 证书生成与节点配置下面这个流程是实际环境中最常见的做法。假设有三个节点分别命名为es-node1、es-node2、es-node3。第一步生成 CA 证书./bin/elasticsearch-certutil ca --out /opt/elasticsearch/config/certs/ca.p12 --pass 生成 CA 的 p12 文件后它会自带别名后续所有节点证书都由它签发。第二步为每个节点生成证书和私钥。在某个节点上统一生成整个集群的证书然后分发到各个节点这种方式我用得最多。./bin/elasticsearch-certutil cert --ca /opt/elasticsearch/config/certs/ca.p12 --name es-node1 --dns es-node1.example.com --ip 10.0.0.1注意--dns和--ip必须写全不然节点之间可能因证书主机名不匹配导致握手失败。这是我在多节点环境踩过的一个比较典型的坑后面会在排查章节展开讲。第三步在每个节点的elasticsearch.yml里配置如下内容xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12这里verification_mode: certificate表示只验证证书本身的合法性不验证主机名。如果设置成full则 DNS/IP 也参与验证一旦券的 DNS 或者 IP 和实际配置对不上节点间通信直接失败。第四步重启所有节点。启动完成后再运行初始化密码命令./bin/elasticsearch-setup-passwords interactive这个命令会要求你给所有内置账号设置密码强烈建议把每个密码记录下来并妥善保管。3.3 Kibana 安全接入配置集群安全配置好了紧接着要解决的是 Kibana 的接入问题。Kibana 在访问 ES 时需要使用它自己的系统账号来执行一些内部请求比如保存仪表盘、管理索引模式等。在启用安全特性后Kibana 必须配置kibana_system账号的密码否则 Kibana 启动时无法连接 ES。在kibana.yml中加入elasticsearch.username: kibana_system elasticsearch.password: 这里填你设置的密码与此同时浏览器访问 Kibana 时也需要用户登录。默认情况下Kibana 会直接把用户输入的用户名密码作为认证凭据去请求 ES认证通过后继续操作。这里有一个关于 Kibana 权限的细节普通用户登录 Kibana 后只能看到自己有权限的索引对应的索引模式。所以我常对同事说Kibana 里的可视化和告警本质上都是受 ES 索引权限约束的权限在“下层”已经卡死了。3.4 基础安全配置验证配置完成后建议先做一轮基础验证再继续做角色和用户。验证方式很简单curl -u elastic:你的密码 https://localhost:9200/_cluster/health?pretty如果返回的status是green或yellow说明安全配置生效、节点间通信正常。如果出现security_exception或证书错误说明配置没有生效或证书有问题。此时先不要继续往下配角色先把基础问题排查干净否则后续所有环节都会连锁报错。4. 实操过程从角色到用户的完整权限落地4.1 创建只读角色先从一个最简单的场景开始。假设我有一个索引前缀为nginx-access-*的日志索引希望给某个同事分配“只读访问”的权限。那我先创建一个只读角色。curl -u elastic:你的密码 -X POST https://localhost:9200/_security/role/nginx_readonly_role -H Content-Type: application/json -d { indices: [ { names: [nginx-access-*], privileges: [read] } ], cluster: [monitor] } 这里我给了read权限意味着该角色账号可以对这个索引执行读取、搜索操作但不能写入、不能删除、不能修改索引配置。我通常还会送一个monitor集群权限让用户能查看集群健康度这部分对排查问题很有帮助但又不至于影响集群稳定。4.2 创建只读用户并绑定角色角色创建完成后要创建用户并把用户和角色绑定起来。curl -u elastic:你的密码 -X POST https://localhost:9200/_security/user/zhangsan_read -H Content-Type: application/json -d { password: 一个强密码至少8位包含大小写和数字, roles: [nginx_readonly_role], full_name: 张三, email: zhangsanexample.com } 这条命令完成后张三就能用zhangsan_read账号访问 ES 集群了。但他能访问的范围仅限于nginx-access-*索引的读操作其他索引一概没有权限。请求除_cluster/health之外的任何接口都会返回security_exception。这种场景非常适合开发联调、日志查看等实际工作。我自己在给团队开权限时几乎把所有开发同学都放在这种只读角色下杜绝有人随手误删线上索引。4.3 创建读写角色及限制另一个常见场景是某个业务方需要往 ES 里持续写入数据还要定期做索引维护。这时我会创建一个带写入权限的角色但注意这个角色通常不会给delete和manage这类高危险权限而是专门针对特定索引前缀授权。比如给风控团队建一个risk_trade_write角色curl -u elastic:你的密码 -X POST https://localhost:9200/_security/role/risk_trade_write_role -H Content-Type: application/json -d { indices: [ { names: [risk-trade-*], privileges: [create, index, write], field_security: [ {grant: [*]} ] } ], cluster: [monitor] } 注意这里我给的是create、index、write而不是delete和manage。这样业务方数据写入和创建索引都没问题但不能删除索引或关闭索引能在很大程度上降低误操作风险。如果需要业务方在特定场景下删除文档可以再单开一个带delete的角色但一定不要默认发放。4.4 字段级权限控制字段级权限是权限管理里非常容易被忽视但又很实用的能力。ES 允许你在角色的索引权限块里用field_security来限制用户能看到的字段。比如某个索引包含username、ip、credit_card等字段其中credit_card属于敏感信息不能让普通分析人员看到。给只读角色加上字段权限限制curl -u elastic:你的密码 -X POST https://localhost:9200/_security/role/user_analysis_readonly_role -H Content-Type: application/json -d { indices: [ { names: [user-analysis-*], privileges: [read], field_security: [ { grant: [username, ip, age, city], except: [credit_card] } ] } ] } 这里grant表示允许访问的字段列表而except是从允许名单中进一步剔除的字段。需要注意如果索引里的字段被剔除用户搜索或聚合时用到这些字段会提示Field data access is not allowed。字段级权限对数据安全来说很重要。我参与过的某个数据平台项目正是由于把包含了用户手机号和证件号的字段彻底屏蔽在只读角色之外才在内部审计时没有出现问题。很多同学以为 ES 没有这个能力其实是有的只是文档中field_security的位置藏得比较深。4.5 在 Kibana 上做空间隔离账号和角色的权限都建好了但 Kibana 界面上还可能出现一个问题所有用户进入 Kibana看到的是同一个默认空间仪表盘、可视化和索引模式全部混在一起。权限隔离做得再好界面体验也是混乱的。解决办法是启用 Kibana 空间。在 Kibana 的“Stack Management”里创建空间比如tech_space、risk_space、marketing_space然后把空间和用户角色关联起来。这里需要特别注意Kibana 空间权限不是直接在 Space 设置页面里绑定用户而是在创建/修改用户角色时通过kibana权限块来指定。角色配置需要加上 kibana 部分例如curl -u elastic:你的密码 -X POST https://localhost:9200/_security/role/risk_space_role -H Content-Type: application/json -d { indices: [ { names: [risk-trade-*], privileges: [read] } ], kibana: [ { base: [read], feature: {}, spaces: [risk_space] } ] } 这样用户登录 Kibana 后只能访问risk_space空间看到该空间内的仪表盘和其他面板而不会进入其他团队的空间。实际项目中这种“空间 索引权限”的双层隔离极大减少了团队间“串门”看数据的尴尬情况。4.6 超级用户与紧急管理账号权限体系最怕的事情是什么是把所有管理员的权限统一挂在elastic账号底下一旦密码泄露等于整个集群门户大开。因此我始终建议单独创建管理员角色而不是长期使用elastic。比如创建一个cluster_admin_rolecurl -u elastic:你的密码 -X POST https://localhost:9200/_security/role/cluster_admin_role -H Content-Type: application/json -d { cluster: [all], indices: [ { names: [*], privileges: [all] } ], run_as: [] } 然后把一个具体的账号绑定到这个角色上。对日常运维操作用cluster_admin_role账号elastic超级用户则作为紧急救援账号只在elastic密码轮换、权限模型全面重建这类场景下才拿出来用。紧急账号密码应该由两位管理员分别保管这个习惯虽然听着像是公司制度但在实践里确实能防止单点问题。5. 生产环境下的权限模型设计与避坑经验5.1 多团队索引命名规范实战我发现权限管理做得好不好一半看角色设计另一半看索引命名规范。在一个共享集群里如果索引命名毫无章法比如 A 团队建了个applogs-2024-05-01B 团队又建了个applogs-syslog-prod那权限规则按通配符匹配时要么匹配太宽要么匹配不到非常痛苦。我负责过的几个集群最终都收敛出一套命名规范。格式统一为[业务线]-[应用名]-[数据类型]-[日期]。举个例子风险团队的交易数据索引名就叫risk-trade-stream-2024.05.01技术部的 Nginx 日志索引名就叫tech-nginx-access-2024.05.01。这样角色规则的names字段里只需要用risk-trade-*或tech-nginx-*就能精准匹配。规则既短又不容易误伤其他团队的索引。当然这也需要配套一个“索引创建权限收敛”的手段。如果每个用户都能自由创建任何索引那么命名规范就是一句空话。所以在生产环境中最好只让少数几个写入账号有create_index权限其他写入账号只允许在已存在的索引上执行写入。5.2 角色权限的最小化原则权限最小化说起来人人都懂但落地时经常被嫌麻烦。比如开发同学想查日常日志给他read就够。但如果他想看几个小时内日志里的报错分布可能就要执行聚合查询这时候read权限其实是够的。可如果开发同学反馈“没权限创建索引模式”很多管理员图省事直接给他发了manage权限。在我看来这属于权限过度授出。正确的做法是明确“需求背后的真实动作是什么”而不是“他要什么就给什么”。创建索引模式是 Kibana 层面的动作和 ES 的索引管理权限不同。在 Kibana 中允许用户管理自己的索引模式可以通过kibana空间的feature权限去细化而不是直接授权 ES 的管理权限。这块我踩过不少坑我常用的一个原则是生产环境权限设计遵循“只给任务必需的最小权限集合”任何权限的追加都需要一个理由哪怕表面看起来只是“多一个查询字段”。如果要给一个用户开某个权限先在测试环境验证这个权限能否完成任务不要抱着“生产里反正遇到问题再给也不迟”的心态因为真出了事就没有后悔药。5.3 审计日志与操作追踪权限管理的最后一块拼图是审计。ES 有安全审计功能开启后会在日志目录下输出审计日志记录所有经过认证的请求。在elasticsearch.yml中开启xpack.security.audit.enabled: true默认情况下它会记录认证失败、访问拒绝等关键事件也可以调整为记录更多细节。在出事故时查看审计日志能定位“谁在什么时候执行了什么操作”对内部纠责很有帮助。需要提醒的是审计日志会带来额外的磁盘开销和性能开销。请求量特别大的集群建议在xpack.security.audit.ignore_filters中排除一些高频率且不敏感的请求比如健康检查类的请求否则日志文件会增长得很快。5.4 高可用与权限配置的联动ES 集群本身是高可用的但权限配置如果只放在某一台节点上就埋下了隐患。安全配置与用户/角色信息存储于 ES 的索引中本身具备集群复制能力但部分老版本或某些组件的配置文件是节点本地的。只要是改动elasticsearch.yml里的安全相关配置必须集群内所有节点一起改否则可能出现部分节点配置不一致导致请求路由到不同节点返回不同结果。我在一次扩容中新节点没有同步安全配置结果集群加入后客户端访问偶尔报 401。排查了很久才发现新节点的 TLS 配置和旧节点不一致。这种问题非常隐蔽因为不是每次请求都能撞上新节点报错呈现间歇性。所以扩容时有一件非常重要的事先检查新节点的elasticsearch.yml里的安全配置与其他节点完全一致再允许它加入集群。6. 常见问题与排查技巧实录6.1 用户登录返回认证失败最常见的问题就是账号密码错误。但还有一个容易被忽略的情况用户可能在连接的是旧端点而新集群启用了 TLS客户端连接时没有带上证书或证书不正确。所以遇到认证失败先区分是“密码错误”还是“通道错误”。如果curl请求时报SSL certificate problem说明客户端没有信任集群的 CA 证书。用-k参数可以跳过证书验证但这个只适合快速验证生产环境客户端必须正确配置证书信任链。如果返回missing authentication credentials大概率是请求中没带用户名密码或者 Basic Auth 头构造错了。6.2 用户有权限但 Kibana 里看不到索引这个问题出现频率很高。用户在 ES 上通过 API 查询索引有数据但在 Kibana 里的“索引模式”看不到。原因通常是用户在 Kibana 中创建索引模式时它调用的 API 是_index_patterns而索引模式创建过程中Kibana 需要用该用户角色中的索引权限来做校验。如果用户角色的索引权限里匹配不到该索引Kibana 就会认为该索引不存在。解决办法不是给用户开全部权限而是确保角色的indices.names通配符能覆盖到该索引。比如nginx-access-*如果索引实际名字是nginx_access_20240501那就匹配不到了。这是命名规范问题导致权限规则失效。遇到这种情况建议优先调整索引名而不是放宽权限通配符。6.3 修改了角色权限但没有立刻生效ES 的角色权限是缓存式的修改角色或用户的权限后通常需要等待一段时间才能生效或者在用户的运行状态下强制刷新权限。可以在 Kibana 中让用户重新登录或者调用以下接口动态刷新curl -u elastic:你的密码 -X POST https://localhost:9200/_security/role/nginx_readonly_role/_clear_cache清理缓存后再用原账号请求被拒绝访问的资源就能看到权限变化生效了。6.4 集群节点之间通信失败节点间通信失败的特征是集群一直处于yellow或red状态日志里大量handshake_exception、certificate_unknown_authority之类的错误。排查时重点检查三点CA 证书是否在所有节点上一致。各节点证书中的 DNS/IP 是否与实际网络地址匹配。xpack.security.transport.ssl.verification_mode是否为certificate或full如果为full则 DNS 必须严格匹配。如果集群中的某个节点是从旧集群迁移过来的证书生成时期的 DNS 和当前不一致也会导致持续握手失败。我以前遇到过的情况是旧集群用es-node1做主机名迁移后主机名改了但证书没重新生成结果节点一直无法通信。重新生成证书替换 p12 文件重启节点后恢复正常。6.5 忘记elastic超级用户密码这个问题的严重性不亚于数据库 root 密码丢失。ES 兼容两种解决思路如果你还有其他管理员账号可以登录后用管理员账号修改elastic密码如果所有管理员账号都不可用最粗暴但有效的方法是在一台节点上临时关闭安全特性重启启动后重置所有密码再重新开启安全特性然后重启。操作步骤如下在某个节点上暂时注释掉xpack.security.enabled: true。重启该节点此时它暂时成为无安全认证的节点。用elasticsearch-setup-passwords interactive重置所有内置账号密码。恢复配置再重启节点。需要注意这个操作非常敏感会影响整个集群的安全状态最好在维护窗口执行并且操作前确认没有其他外部请求正在访问集群。这个做法在测试环境试过没问题生产环境要格外谨慎。6.6 开启安全后性能下降安全模块会引入加解密和权限校验对性能确实有一定影响。我做过简单对比启用 TLS 和权限校验后单次查询的响应时间大约会增加 5%~10%在绝大多数业务场景下是可以接受的。但如果发现性能明显劣化需要排查是否有大量请求命中了审计日志或者某些节点的证书校验导致 CPU 暴涨。可以尝试优化比如合理设置xpack.security.audit.ignore_filters忽略心跳类请求再比如启用 HTTP 层的 TLS 时可以考虑合理配置ssl.client_authentication级别。有些业务允许 HTTP 层不做客户端证书双向验证只做 TCP 传输层的双向验证这也能减少一部分握手开销。6.7 权限规则写对了但用户还是能访问其他索引出现这个问题通常是通配符写得过宽。比如tech-*前面没加业务线前缀或者授权时直接给了read在所有索引上。ES 的通配符支持*和?在配置角色规则时写完规则一定要先用通用 API 验证一下curl -u elastic:你的密码 -X POST https://localhost:9200/_security/authorize -H Content-Type: application/json -d { username: zhangsan_read, request: { indices: [ { names: [nginx-access-2024.05.01], privileges: [read] } ] } } 返回结果如果显示authorized: true说明用户确实有这个权限。如果显示authorized: false说明规则没匹配上或者用户根本没有该权限。用这个 API 来验证权限比反复试错要高效得多。7. 权限 API 速查与常用配置模板我在实际项目中经常需要把常用 API 整理成速查清单方便团队同学使用。这里把我共享频率较高的几段命令整理出来。7.1 用户与角色查询查看所有用户curl -u elastic:密码 https://localhost:9200/_security/user?pretty查看某个用户的详情curl -u elastic:密码 https://localhost:9200/_security/user/zhangsan_read?pretty查看所有角色curl -u elastic:密码 https://localhost:9200/_security/role?pretty7.2 修改密码修改当前用户密码curl -u elastic:旧密码 -X POST https://localhost:9200/_security/user/elastic/_password -H Content-Type: application/json -d { password: 新密码 } 管理员修改其他用户密码curl -u elastic:密码 -X POST https://localhost:9200/_security/user/zhangsan_read/_password -H Content-Type: application/json -d { password: 新的强密码 } 7.3 禁用或删除用户禁用用户保留账号但无法登录curl -u elastic:密码 -X POST https://localhost:9200/_security/user/zhangsan_read/_disable删除用户curl -u elastic:密码 -X DELETE https://localhost:9200/_security/user/zhangsan_read7.4 常用角色配置模板给一个让我在项目中复用率特别高的模板。这种角色一般给“能搜索、能聚合、不能写、不能管理”的日志分析用户curl -u elastic:密码 -X POST https://localhost:9200/_security/role/readonly_base_role -H Content-Type: application/json -d { cluster: [monitor], indices: [ { names: [*], privileges: [read], field_security: [ {grant: [*]} ] } ] } 实际使用时把names和field_security按业务需求收敛。在多个团队共用集群时我一般建议不要把names设为*而是用团队专属前缀。8. 一点个人的实操心得做 ES 集群权限管理这件事其实很像是给一个高速运转的系统装上“门禁和监控”。最早我做权限改造的时候团队内部最反对的声音就是“权限配得太麻烦影响效率”。但经过一段时间运行后大家反而习惯了这种约束。因为权限规则一旦清晰每个人的工作边界就明确了再也不用担心误碰别人的索引也不用在出错时互相甩锅。在我看来权限管理不是一次性工作。集群规模在变团队人员在变索引类型也在变权限模型必须定期审视。我会建议至少每季度做一次权限复核拉出所有用户和角色逐一确认是否还有人需要这些权限。很多团队权限越积越复杂核心原因就是只加不减最后成了一个谁都不敢动的“大泥潭”。如果你现在正要开始给集群做权限管理我的建议是从最小的只读角色开始先让一两个用户用起来跑通了再逐步铺开证书和账号密码这类基础信息一定记录成文档放到有权限控制的内部知识库里权限规则能合并就合并不要让每个用户单独挂一套规则遇到奇怪的问题先看审计日志再看配置文件最后才考虑是不是代码的问题。权限管理这个方向看起来不显眼但它是 ES 集群长期稳定运行的重要基础。希望这篇内容能帮你把权限体系一次搭好少走我当年走过的弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑