每次部署Elasticsearch集群时,最让我头疼的就是安全配置环节。传统方法需要手动输入密码或生成随机密码,这在单节点测试环境还能应付,但面对生产环境动辄上百节点的集群部署时,简直就是噩梦。想象一下凌晨三点还在对着几十台服务器重复输入elasticsearch-setup-passwords命令的场景——这绝对能列入运维人员的十大崩溃瞬间。
elasticsearch-keystore的出现彻底改变了这种局面。这个内置工具就像个保险箱,可以安全存储敏感信息(如密码、密钥等),而且完美支持自动化操作。我去年负责的一个金融项目需要部署300+节点的集群,就是靠keystore结合Shell脚本实现的无人值守初始化,整个过程从原来的3天缩短到2小时。
与手动配置相比,这套方案有三大优势:
我建议使用Ubuntu 20.04 LTS作为基准环境,这是目前最稳定的选择。以下是必须的准备工作:
bash复制# 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget vim
内存方面,Elasticsearch至少需要4GB,生产环境建议8GB起步。曾经有个客户在2GB内存的机器上跑集群,结果频繁OOM,后来调整到8GB才稳定下来。
官方提供了多种安装方式,我推荐用APT仓库安装,方便后续升级:
bash复制# 添加GPG密钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
# 添加仓库
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
# 安装Elasticsearch
sudo apt update && sudo apt install -y elasticsearch
安装完成后别急着启动,先检查下关键目录:
/usr/share/elasticsearch - 主程序目录/etc/elasticsearch - 配置目录/var/lib/elasticsearch - 数据目录这个工具本质上是个加密的key-value存储,采用PBKDF2算法保护数据安全。与普通配置文件不同,keystore中的内容:
查看现有条目(需要sudo权限):
bash复制sudo /usr/share/elasticsearch/bin/elasticsearch-keystore list
添加密码的正确姿势:
bash复制# 推荐使用管道方式避免密码出现在history中
echo "MySecurePassword123!" | sudo /usr/share/elasticsearch/bin/elasticsearch-keystore add -x "bootstrap.password"
权限设置要点:
bash复制sudo chown root:elasticsearch /etc/elasticsearch/elasticsearch.keystore
sudo chmod 0660 /etc/elasticsearch/elasticsearch.keystore
曾经有团队因为权限设为777导致安全审计不通过,切记保持最小权限原则。
完整的初始化脚本应该包含以下步骤:
bash复制#!/bin/bash
# 启用安全配置
echo "xpack.security.enabled: true" | sudo tee -a /etc/elasticsearch/elasticsearch.yml
# 设置keystore密码
echo "InitPassword@$(date +%s)" | sudo /usr/share/elasticsearch/bin/elasticsearch-keystore add -x "bootstrap.password"
# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl restart elasticsearch
# 等待服务就绪
until curl -s http://localhost:9200 >/dev/null; do
sleep 5
done
# 修改elastic用户密码
curl -u elastic:InitPassword@$(date +%s) -X POST "localhost:9200/_security/user/elastic/_password?pretty" -H 'Content-Type: application/json' -d'
{
"password": "Production@Secure#2023"
}'
对于大规模部署,我推荐使用Ansible。以下是关键task示例:
yaml复制- name: Add bootstrap password to keystore
become: yes
command: "/usr/share/elasticsearch/bin/elasticsearch-keystore add -x bootstrap.password"
args:
stdin: "{{ bootstrap_password }}"
- name: Configure built-in users
uri:
url: "http://localhost:9200/_security/user/{{ item.user }}/_password"
method: POST
user: "elastic"
password: "{{ elastic_password }}"
body_format: json
body: "{ \"password\": \"{{ item.password }}\" }"
with_items:
- { user: "kibana_system", password: "{{ kibana_password }}" }
- { user: "logstash_system", password: "{{ logstash_password }}" }
如果Elasticsearch启动失败,按这个顺序检查:
journalctl -u elasticsearch -n 50/etc/elasticsearch/jvm.optionsgrep -v "^#" /etc/elasticsearch/elasticsearch.yml遇到密码不生效时,先确认:
/etc/elasticsearch/elasticsearch.keystore在集群环境中,需要确保:
不要使用脚本中的示例密码!建议:
结合防火墙规则限制访问:
bash复制# 只允许特定IP访问9200端口
sudo ufw allow from 192.168.1.0/24 to any port 9200
在elasticsearch.yml中添加:
yaml复制xpack.security.audit.enabled: true
xpack.security.audit.logfile.events.include: authentication_failed,access_denied
这套方案已经在多个金融级项目中验证过,包括某银行每天处理10亿+日志的集群。关键是要根据实际场景调整密码策略和网络配置,做好定期巡检。