elasticsearch安全加固需依次启用x-pack安全模块、创建最小权限角色、配置tls/ssl加密、实施文档与字段级安全、禁用自动创建索引并设置ip白名单。

如果您正在为Elasticsearch集群配置安全策略,但发现用户可随意读写全部索引、敏感数据暴露在未加密通道中,或无法限制特定应用仅访问指定字段,则说明基础安全机制尚未启用或权限粒度控制缺失。以下是实现用户权限隔离与数据保护的多种可行方案:
一、启用X-Pack安全模块并初始化内置用户
该步骤是所有后续权限控制的前提,通过激活Elasticsearch内置的安全子系统,启用身份认证与RBAC授权框架。未启用时,集群默认处于完全开放状态,任何网络可达方均可执行任意操作。
1、编辑/etc/elasticsearch/elasticsearch.yml,添加配置项:
xpack.security.enabled: true
2、保存后重启Elasticsearch服务:
sudo systemctl restart elasticsearch
3、运行交互式密码初始化工具:
sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
4、为以下6个内置用户设置强密码:elastic(超级管理员)、kibana_system(Kibana通信专用)、logstash_system(Logstash集成)、beats_system、apm_system、remote_monitoring_user
二、创建最小权限角色并绑定用户
避免直接使用elastic账户进行日常运维或应用连接,应按职责划分创建专用角色,严格遵循最小权限原则。角色定义决定了用户可执行的操作范围,包括索引模式匹配、具体HTTP方法及集群级操作。
1、使用Kibana Dev Tools或curl调用API创建只读角色:
POST /_security/role/logs_reader
{"indices": [{"names": ["logs-*"], "privileges": ["read", "view_index_metadata"]}]}
2、创建对应用户并分配该角色:
POST /_security/user/monitoring_app
{"password": "AppPass!2026", "roles": ["logs_reader"], "full_name": "Monitoring Application"}
3、验证权限是否生效:
GET /logs-2026.05.12/_search?pretty
响应应返回结果;而执行DELETE /logs-2026.05.12将返回403 Forbidden
三、启用TLS/SSL加密传输层
防止用户名、密码、查询语句及返回数据在传输过程中被嗅探或篡改,强制所有HTTP与节点间通信走加密通道。未启用时,凭证与敏感内容以明文形式在网络中裸奔。
1、生成CA证书与节点证书:
sudo /usr/share/elasticsearch/bin/elasticsearch-certutil ca
sudo /usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
2、将生成的elastic-certificates.p12复制到/etc/elasticsearch/certs/目录,并设置属主:
sudo chown elasticsearch:elasticsearch /etc/elasticsearch/certs/elastic-certificates.p12
3、在elasticsearch.yml中添加TLS配置:
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
4、重启Elasticsearch服务使配置生效
四、配置文档级安全(DLS)与字段级安全(FLS)
在索引级别权限基础上进一步细化,实现同一索引内不同用户可见文档子集或字段子集。适用于多租户场景或需对PII字段(如身份证号、手机号)做动态脱敏的合规要求。
1、启用DLS/FLS功能:
xpack.security.dls_fls.enabled: true
xpack.security.dls.bitset.cache.size: "10%"
2、创建含查询过滤的角色:
POST /_security/role/hr_analyst
{"indices": [{"names": ["employees"], "privileges": ["read"], "query": "{\"term\":{\"department\":\"HR\"}}"}]}
3、为该角色添加字段级白名单:
"field_security": {"grant": ["name", "position", "hire_date"]}
4、创建用户hr_user并绑定hr_analyst角色,其查询employees索引时仅能获取HR部门员工记录,且仅显示授权字段
五、禁用自动创建索引并配置IP白名单
防范因误配客户端导致意外创建索引、填充垃圾数据,或抵御暴力扫描攻击。自动创建索引会绕过预设模板与生命周期策略,IP白名单则从网络层阻断非可信来源访问。
1、禁止自动创建索引:
action.auto_create_index: false
2、设置IP白名单(仅允许192.168.10.0/24网段及本地回环):
reindex.remote.whitelist: ["192.168.10.*:9200", "127.0.0.1:9200"]
3、限制HTTP访问源:
http.host: 127.0.0.1
network.host: 192.168.10.5
4、重启服务后,来自192.168.20.100的请求将被拒绝,且任何未显式创建的索引名称均无法通过PUT触发自动创建










