Elasticsearch安全认证实战:从零配置密码与Kibana集成

张开发
2026/4/16 18:42:52 15 分钟阅读

分享文章

Elasticsearch安全认证实战:从零配置密码与Kibana集成
1. Elasticsearch安全认证的必要性第一次接触Elasticsearch时很多人都会被它裸奔的默认配置吓一跳——不需要任何认证就能直接访问所有数据。这就像把家门钥匙插在锁上谁都能进来翻箱倒柜。我在给客户部署ES集群时就遇到过真实案例某公司开发环境ES暴露在公网结果被黑客扫到后删除了所有索引导致团队一周的工作成果全部丢失。Elasticsearch从6.8版本开始将X-Pack安全功能纳入了基础版授权。这意味着我们不用额外付费就能使用以下核心安全功能身份认证要求用户提供有效凭证才能访问通信加密节点间数据传输使用TLS加密权限控制细粒度的角色权限管理特别提醒生产环境一定要启用安全认证即使在内网也建议开启基础防护。去年某知名企业就因内网ES未加密导致员工信息大规模泄露。2. 从零配置Elasticsearch密码2.1 修改核心配置文件首先找到你的elasticsearch.yml配置文件通常在/etc/elasticsearch或安装目录的config下。用vim或nano编辑器添加以下关键配置# 启用安全模块 xpack.security.enabled: true # 单节点模式开发环境推荐 discovery.type: single-node # 必须开启SSL传输加密 xpack.security.transport.ssl.enabled: true这里有个坑我踩过如果只开启安全认证不配SSL启动时会报错Transport SSL must be enabled。因为基础版授权要求必须启用传输层加密。2.2 设置用户密码重启Elasticsearch服务后进入ES的bin目录执行密码设置脚本。有两种方式交互式设置推荐./elasticsearch-setup-passwords interactive系统会依次提示为6个内置用户设置密码elastic超级管理员kibana_systemKibana服务账号logstash_systemLogstash连接专用beats_systemBeats系列组件使用apm_systemAPM性能监控remote_monitoring_user远程监控自动生成随机密码./elasticsearch-setup-passwords auto生成的密码会直接显示在终端记得及时保存。我曾因为没记录随机密码不得不重置整个集群。2.3 验证认证状态用curl测试未认证访问curl http://localhost:9200应该返回401错误{ error : { reason : missing authentication credentials, header : { WWW-Authenticate : Basic realm\security\ } } }带认证的成功请求curl -u elastic:your_password http://localhost:9200现在你应该能看到熟悉的ES版本信息了。3. Kibana与安全ES的集成3.1 直接配置法适合开发环境编辑kibana.yml配置文件elasticsearch.username: kibana_system elasticsearch.password: 你设置的密码注意这里90%的人会犯两个错误误用elastic用户而非kibana_system密码与ES设置的不一致启动Kibana后访问5601端口这时应该会看到登录界面。用elastic账号和密码登录即可。3.2 密钥库存储法生产环境推荐更安全的方式是使用Kibana密钥库# 创建密钥库 ./bin/kibana-keystore create # 添加用户名 ./bin/kibana-keystore add elasticsearch.username # 输入kibana_system # 添加密码 ./bin/kibana-keystore add elasticsearch.password # 输入对应密码这种方式密码不会明文存储在配置文件中。去年某金融客户就因配置文件泄露导致安全事故后来全部改用密钥库方案。3.3 命令行参数方式临时调试用启动时直接指定凭证./bin/kibana --elasticsearch.usernameelastic --elasticsearch.passwordyour_password4. 常见问题排坑指南4.1 密码正确却认证失败可能原因Kibana版本与ES不匹配建议保持大版本一致网络问题导致连接超时检查防火墙和端口使用了过时的kibana用户7.x之后应改用kibana_system解决方案# 查看ES日志 tail -f /var/log/elasticsearch/your_cluster.log # 测试基础认证 curl -v -u username:password http://es_host:92004.2 忘记密码怎么办重置elastic用户密码# 进入ES容器或安装目录 ./bin/elasticsearch-reset-password -u elastic重置其他内置用户./bin/elasticsearch-reset-password -u kibana_system4.3 多节点集群的特殊配置生产集群需要额外配置# 所有节点相同的加密证书 xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12 # 开启节点发现 discovery.seed_hosts: [node1:9300, node2:9300] cluster.initial_master_nodes: [node1, node2]生成证书的命令./bin/elasticsearch-certutil cert -out config/certs/elastic-certificates.p12 -pass 5. 进阶安全实践5.1 自定义用户与角色通过Kibana界面创建业务用户访问Stack Management Security Users点击Create user分配适当角色如monitoring_user只读权限更精细的权限控制可以创建自定义角色POST /_security/role/business_role { indices: [ { names: [order_*], privileges: [read, index] } ] }5.2 定期轮换密码建议每90天更换密码可以通过API实现curl -u elastic -X POST localhost:9200/_security/user/elastic/_password -H Content-Type: application/json -d { password: NewComplexPassword123 }5.3 审计日志监控在elasticsearch.yml中启用xpack.security.audit.enabled: true xpack.security.audit.logfile.events.include: access_denied,anonymous_access_denied,authentication_failed典型的审计日志示例{ timestamp: 2023-08-20T08:45:12.123Z, event: authentication_failed, principal: unknown, origin: 192.168.1.100, realm: reserved, node: node-1 }我在实际运维中发现开启审计后能快速定位暴力破解等异常行为。某次就靠审计日志发现了一个尝试用常见密码字典攻击的IP及时封禁避免了风险。

更多文章