Elasticsearch 集群安全加固指南

在生产环境中,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 部署安全配置
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值