在生产环境中,Elasticsearch 集群安全加固是防止数据泄露、未授权访问、DDoS 攻击和内部滥用的关键环节。一个未加固的 ES 集群暴露在公网,可能在几分钟内被扫描并清空数据。
本文提供一份 全面、可落地的 Elasticsearch 集群安全加固指南,涵盖网络、认证、授权、加密、审计、配置等 7 大维度,适用于自建集群或云上部署。
一、安全加固目标
| 目标 | 说明 |
|---|---|
| 🔐 最小权限原则 | 用户只能访问必要资源 |
| 🔒 通信加密 | 所有节点间和客户端通信加密 |
| 🚪 访问控制 | 禁止未授权访问,限制 IP |
| 📜 审计日志 | 所有操作可追溯 |
| 🛡️ 防攻击 | 防止注入、暴力破解、慢查询 |
| 🧩 配置安全 | 关闭危险功能,启用安全默认值 |
二、1. 网络层安全
✅ 2.1 禁止公网暴露
- 严禁将
9200(HTTP)或9300(Transport)端口暴露在公网; - 使用 VPC、安全组、防火墙限制访问:
# 只允许应用服务器和跳板机访问 iptables -A INPUT -p tcp --dport 9200 -s 10.0.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 9200 -j DROP
✅ 2.2 分离网络平面
- Transport 网络(9300):节点间通信,仅内网互通;
- HTTP 网络(9200):客户端访问,通过负载均衡或反向代理暴露。
✅ 2.3 使用反向代理(可选)
- 通过 Nginx 或 Envoy 暴露 HTTP 接口,实现:
- IP 白名单
- 请求限流
- WAF 防护(防注入)
- 访问日志记录
location / {
allow 10.0.1.0/24;
deny all;
proxy_pass http://elasticsearch:9200;
}
三、2. 认证(Authentication)
启用 X-Pack Security(免费版已包含基础功能):
# elasticsearch.yml
xpack.security.enabled: true
✅ 3.1 创建专用用户
避免使用默认用户 elastic,创建角色最小化用户:
# 创建只读用户
POST /_security/user/analytics_reader
{
"password": "StrongPass123!",
"roles": [ "kibana_reader", "viewer" ],
"full_name": "Analytics Team Read-Only"
}
# 创建索引专用用户
POST /_security/user/logs_writer
{
"password": "LogPass456!",
"roles": [ "ingest_admin", "machine_learning_user" ],
"full_name": "Logstash Writer"
}
✅ 3.2 使用 API Key(推荐用于应用)
POST /_security/api_key
{
"name": "app-search-key",
"role_descriptors": {
"search_role": {
"cluster": [],
"indices": [
{
"names": [ "products-*" ],
"privileges": [ "read", "view_index_metadata" ]
}
]
}
}
}
- API Key 可过期、撤销;
- 比用户名密码更安全。
四、3. 授权(Authorization)
使用 基于角色的访问控制(RBAC):
✅ 3.1 内置角色(推荐组合使用)
| 角色 | 权限 |
|---|---|
superuser | 全部权限(慎用) |
monitor | 只读集群状态 |
viewer | 读取数据、搜索 |
kibana_admin | 管理 Kibana |
ingest_admin | 管理 ingest pipeline |
✅ 3.2 自定义角色(精细控制)
POST /_security/role/product_search_role
{
"indices": [
{
"names": [ "products-*" ],
"privileges": [ "read", "view_index_metadata" ],
"field_security": {
"grant": [ "title", "price", "category" ],
"except": [ "cost_price" ] // 敏感字段屏蔽
},
"query": "{\"term\": {\"status\": \"published\"}}" // 查询过滤
}
]
}
✅ 实现 字段级安全(Field-Level Security) 和 文档级安全(DLS)
五、4. 加密(Encryption)
✅ 4.1 启用 TLS/SSL 加密
4.1.1 HTTP 层加密(客户端 → ES)
# elasticsearch.yml
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: /path/to/http.key
xpack.security.http.ssl.certificate: /path/to/http.crt
4.1.2 Transport 层加密(节点间通信)
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.key: /path/to/transport.key
xpack.security.transport.ssl.certificate: /path/to/transport.crt
xpack.security.transport.ssl.certificate_authorities: [ "/path/to/ca.crt" ]
✅ 使用 CA 签发证书,避免自签名风险。
✅ 4.2 自动生成证书(开发/测试)
bin/elasticsearch-certutil ca
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
六、5. 安全配置加固
✅ 5.1 禁用危险配置
# 禁用动态脚本(防止注入)
script.inline: false
script.stored: false
script.file: false
# 或启用沙箱(推荐)
script.inline: true
script.stored: true
✅ 5.2 限制资源使用
# 防止大请求拖垮集群
http.max_content_length: 100mb
indices.query.bool.max_clause_count: 1024
# 限流
thread_pool.search.queue_size: 1000
thread_pool.write.queue_size: 1000
✅ 5.3 关闭调试接口
# 生产环境关闭
http.cors.enabled: false
七、6. 审计日志(Audit Logging)
记录所有安全相关事件:
# elasticsearch.yml
xpack.security.audit.enabled: true
xpack.security.audit.logfile.events.include: [
"access_denied",
"access_granted",
"authentication_failed",
"connection_denied",
"tampered_request"
]
xpack.security.audit.logfile.events.exclude: ["anonymous_access_allowed"]
审计日志示例:
[2024-06-01T10:00:00,123][AUDIT] authentication_failed
origin.type=http, origin.address=203.0.113.45:54321
principal=unknown_user
realm=realml
✅ 建议将审计日志发送到独立 SIEM 系统(如 Splunk、ELK)。
八、7. 其他安全建议
✅ 8.1 定期轮换凭证
- 定期更换用户密码;
- 撤销不再使用的 API Key;
- 使用密码策略:
xpack.security.authc.password_policy: min_length: 12 character_classes: 3
✅ 8.2 禁用默认用户
- 修改
elastic用户密码; - 或禁用:
POST /_security/user/elastic/_disable
✅ 8.3 使用 Kibana Spaces 隔离
- 为不同团队创建独立 Space;
- 结合角色实现多租户隔离。
✅ 8.4 定期安全扫描
- 使用
nmap扫描开放端口; - 使用
curl测试未授权访问; - 使用 Nessus 或 OpenVAS 进行漏洞扫描。
九、安全加固 checklist ✅
| 项目 | 是否完成 |
|---|---|
启用 xpack.security.enabled | ✅ |
| 配置 TLS 加密(HTTP + Transport) | ✅ |
创建最小权限用户,禁用 elastic | ✅ |
| 使用 API Key 替代密码 | ✅ |
| 配置角色实现 DLS/FLS | ✅ |
| 审计日志开启并集中收集 | ✅ |
| 禁用公网访问,使用防火墙 | ✅ |
| 关闭动态脚本或启用沙箱 | ✅ |
| 设置合理的资源限制 | ✅ |
| 定期轮换凭证 | ✅ |
十、应急响应流程
| 事件 | 响应措施 |
|---|---|
| 发现未授权访问 | 1. 隔离集群;2. 撤销所有凭证;3. 检查审计日志;4. 修复漏洞 |
| 数据被删除 | 1. 停止写入;2. 从 snapshot 恢复;3. 分析攻击路径 |
| 暴力破解 | 1. 启用防火墙限流;2. 启用账户锁定策略 |
十一、扩展建议
| 场景 | 建议方案 |
|---|---|
| 云环境(AWS/Aliyun) | 使用 VPC、安全组、IAM 角色 |
| 合规要求(等保、GDPR) | 启用审计、加密、访问控制 |
| 多租户隔离 | 使用 Index Pattern + Role + Space |
| 自动化加固 | 使用 Ansible/Terraform 部署安全配置 |
1237

被折叠的 条评论
为什么被折叠?



