Elasticsearch裸奔还是不太安全,内置组件XPack提供的安全特性是收费的,通常可以使用Search Guard的社区版来实现Elasticsearch的基本安全性。
Search Guard对Elasticsearch 8的支持版本还在Beta阶段,Release版本只支持到7.17.6。Search Guard目前主推FLX系列,原Classic已不再提供新特性。
网上还没有关于这套最新组合的详细安装文档,特此分享,供参考。

目标
以准生产模式,利用Search Guard FLX插件,部署一套具备基本安全特性的Elasticsearch集群。
规划
Elasticsearch生产集群至少需要3个master节点,这里可以把其中两个master作为data节点,另一个master作为voting节点(只参与投票,不存储数据)。
Kibana可以部署在voting角色的节点上,也可以单独一台机器部署。
概览
整个集群的安装和配置过程简述如下:
- 准备机器
- 配置环境
- 准备安装包
- 生成安全证书
- 安装和配置Elasticsearch、Search Guard
- 启动单个Elasticseach节点
- 启动其它Elasticsearch节点,组成集群
- 安装和配置Kibana
- 启动Kibana,完成安装
准备机器
根据规划,准备3台网络互通的机器,安装CentOS/RHEL7.x、RHEL 8.x操作系统,3台机器的用户内存要在2GB以上,承担data角色的节点要准备足够的存储空间。
另需一台操作机,用于在安装过程访问以上3台主机。
本安装中,/app目录将用于放置Elasticsearch、Kibana应用程序,/data目录用于放置Elasticsearch运行所需的配置、日志、数据及临时目录等文件,这样的目录分离安装方式便于后续版本升级。
Elasticsearch依赖的JVM要求Oracle/OpenJDK/Temurin 8+,我们可以使用Elasticsearch安装包内置的OpenJDK,不用额外安装。
本次安装假设3个节点在Elasticsearch中的名称分别为:data-1、data-2、voting-1。
配置环境
Elasticsearch要求系统配置进行一些调整,以达到更好的运行性能。
[微风]创建目录
登录各主机,并运行如下命令,为Elasticsearch创建工作目录。
sudo mkdir -p /app/elasticsearch /data/elasticsearch/{config,data,logs,tmp,backup}
[微风]创建用户
登录各主机,并运行如下命令,为Elasticsearch创建运行用户(注意替换命令中elasticsearch用户的密码)。
sudo groupadd elasticsearch && \
sudo useradd elasticsearch -g elasticsearch -p your_password && \
sudo chown -R elasticsearch.elasticsearch /app/elasticsearch && \
sudo chown -R elasticsearch.elasticsearch /data/elasticsearch
[微风]调整文件句柄数、线程数限制
登录各主机,并运行如下命令,编辑limits.conf文件。
sudo vi /etc/security/limits.conf
在该文件末尾(或其它合适位置)添加如下行后,保存并退出编辑。
elasticsearch - nofile 65536
elasticsearch - nproc 65536
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
[微风]调整虚拟内存数量、减少tcp重传次数
登录各主机,并运行如下命令,编辑sysctl.conf文件。
sudo vi /etc/sysctl.conf
修改或添加如下配置行后,保存并退出。
#Elaticsearch
vm.max_map_count=262144
net.ipv4.tcp_retries2=5
运行如下命令,使配置生效。
sudo sysctl -p
[微风]禁用内存交换
登录各主机,并运行如下命令。
sudo sed -i.bak '/swap/s/^/#/' /etc/fstab
[微风]设置环境变量
登录各主机,执行如下命令编辑文件。
sudo vi /etc/profile
在文件末尾添加如下行:
#Elasticsearch
export ES_PATH_CONF=/data/elasticsearch/config
export ES_TMPDIR=/data/elasticsearch/tmp
[微风]重启系统
使用以下命令重启系统,以应用设置。
sudo init 6
准备安装包
登录各主机,将需要的安装包和工具*载下**或上传到/app目录下。
cd /app
# *载下**Elasticsearch压缩安装包及签名验证文件
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.6-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.6-linux-x86_64.tar.gz.sha512
# *载下**Kibana压缩安装包及签名验证文件
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.6-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.6-linux-x86_64.tar.gz.sha512
# *载下**Search Guard证书生成工具
wget https://maven.search-guard.com/search-guard-tlstool/1.8/search-guard-tlstool-1.8.zip
# *载下**Search Guard控制工具
wget https://maven.search-guard.com/search-guard-flx-release/com/floragunn/sgctl/1.0.0/sgctl-1.0.0.zip
# *载下**Elasticsearch的Search Guard插件
wget https://maven.search-guard.com/search-guard-flx-release/com/floragunn/search-guard-flx-elasticsearch-plugin/1.0.0-es-7.17.6/search-guard-flx-elasticsearch-plugin-1.0.0-es-7.17.6.zip
# *载下**Kibana的Search Guard插件
wget https://maven.search-guard.com/search-guard-flx-release/com/floragunn/search-guard-flx-kibana-plugin/1.0.0-es-7.17.6/search-guard-flx-kibana-plugin-1.0.0-es-7.17.6.zip
生成证书
在其中一台主机(如voting角色的主机)或当前操作机,为Search Guard插件生成安全传输所需的证书。
登录到voting节点,在/app下创建search-guard目录,并将安装文件置入和解压缩。
cd /app
mkdir -p /app/search-guard
cp search-guard-tlstool-1.8.zip /app/search-guard/
mkdir search-guard-tlstool-1.8
unzip search-guard-tlstool-1.8.zip -d search-guard-tlstool-1.8
进入tlstool目录,建立配置文件。
cd search-guard-tlstool-1.8
vi config/my.yml
文件内容参考如下:
注:
1. company.com、org、app、prod等可分别替换为实际公司域名、组织名称、应用名称、环境代码等,如有特殊字符则需要转义。
2. nodes配置节点下的data-1、data-2、voting-1为3个es节点所需的证书。由于选择了不校验证书中的域名,也可以为所有节点统一生成一个证书,安全性有所降低。
3. nodes配置节点下的kibana-server为Kibana所需的安全证书。
4. clients下的admin为管理所用证书,用于无密码集群管理。
ca:
root:
dn: CN=root.ca.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
keysize: 2048
validityDays: 3650
pkPassword: none
file: root-ca.pem
defaults:
validityDays: 3650
pkPassword: none
generatedPasswordLength: 12
httpsEnabled: true
nodes:
- name: data-1
dn: CN=data-1.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
- name: data-2
dn: CN=data-2.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
- name: voting-1
dn: CN=voting-1.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
- name: kibana-server
dn: CN=kibana-server.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
clients:
- name: admin
dn: CN=admin.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
admin: true
执行以下命令生成证书,完成后可在out子目录下查看生成的文件。
./tools/sgtlstool.sh -c ./config/my.yml -ca -crt
可将out目录下生成的证书和配置片段文件*载下**到操作机备用。
安装和配置Elasticsearch
注:本步骤需在所有节点上同样操作。
[微风]安装Elasticsearch
移动安装文件。
cd /app
sudo chmod 777 elasticsearch-7.17.6-linux-x86_64.tar.gz*
sudo mv elasticsearch-7.17.6-linux-x86_64.tar.gz* /app/elasticsearch/
执行如下命令校验安装文件,结果应输出:elasticsearch-7.17.6-linux-x86_64.tar.gz: OK。
su elasticsearch
cd /app/elasticsearch
shasum -a 512 -c elasticsearch-7.17.6-linux-x86_64.tar.gz.sha512
解压缩安装包。
su elasticsearch
tar -xzf elasticsearch-7.17.6-linux-x86_64.tar.gz
修改工作目录。
su elasticsearch
mv /app/elasticsearch/elasticsearch-7.17.6/{config,logs} /data/elasticsearch/
[微风]安装Search Guard插件
执行以下命令准备plugin安装包,并将上一步生成的根证书和节点所需证书复制过来。(注意第3行可由操作机上传或远程拷贝,并替换data-1为当前操作节点名称)
cd /app
cp search-guard-flx-elasticsearch-plugin-1.0.0-es-7.17.6.zip ./search-guard/
cp out/{root-ca,data-1*}.{key,pem} /data/elasticsearch/config/
sudo chown -R elasticsearch:elasticsearch /app/search-guard
执行以下命令安装插件。
su elasticsearch
cd /app/elasticsearch/elasticsearch-7.17.6/bin
./elasticsearch-plugin install -b file:///app/search-guard/search-guard-flx-elasticsearch-plugin-1.0.0-es-7.17.6.zip
当命令输出末尾出现以下文字,表示安装成功。
-> Installed search-guard-flx
-> Please restart Elasticsearch to activate any plugins installed
[微风]修改Elasticsearch配置
使用以下命令编辑配置文件。
vi /data/elasticsearch/config/elasticsearch.yml
配置参考如下。
注意:
1. 修改集群名称、各节点IP
2. 修改第4行中当前es节点名称,如:data-1。
3. 修改第5行中当前节点角色,data节点为 [master, data],voting节点为 [master, voting]。
4. 第6行为集群初始节点,使用 data-1 即可。
5. 修改第21、22、27、28行中证书文件名为当前节点证书文件名称
6. 修改第31、32、33、35行中证书属性.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod部分为证书生成环节所使用的属性
cluster.name: [输入集群名称]
discovery.seed_hosts: ["[替换为节点1IP]", "[替换为节点2IP]", "[替换为节点3IP]"]
node.name: [当前es节点名称]
node.roles: [ master, data ]
cluster.initial_master_nodes: ["data-1"]
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
bootstrap.memory_lock: true
network.host: _site_
xpack.security.enabled: false
xpack.security.http.ssl:
enabled: false
xpack.security.transport.ssl:
enabled: false
ingest.geoip.downloader.enabled: false
action.auto_create_index: .monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*,.searchguard_resource_owner
#searchguard
searchguard.ssl.transport.pemcert_filepath: data-1.pem
searchguard.ssl.transport.pemkey_filepath: data-1.key
searchguard.ssl.transport.pemtrustedcas_filepath: root-ca.pem
searchguard.ssl.transport.enforce_hostname_verification: false
searchguard.ssl.transport.resolve_hostname: false
searchguard.ssl.http.enabled: true
searchguard.ssl.http.pemcert_filepath: data-1_http.pem
searchguard.ssl.http.pemkey_filepath: data-1_http.key
searchguard.ssl.http.pemtrustedcas_filepath: root-ca.pem
searchguard.nodes_dn:
- CN=data-1.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
- CN=data-2.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
- CN=voting-1.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
searchguard.authcz.admin_dn:
- CN=admin.prod.app.org.company.com,OU=org,O=company,DC=company.com,DC=prod
保存文件并退出编辑。
[微风]修改JVM设置
vi /data/elasticsearch/config/jvm.options
添加或修改如下配置。
# networkaddress.cache
-Des.networkaddress.cache.ttl=60
-Des.networkaddress.cache.negative.ttl=60
# 以下3项为修改,目的是将data和logs目录调整到/data/elasticsearch/下。
-XX:HeapDumpPath=/data/elasticsearch/data
-XX:ErrorFile=/data/elasticsearch/logs/hs_err_pid%p.log
8:-Xloggc:/data/elasticsearch/logs/gc.log
9-:-Xlog:gc*,gc+age=trace,safepoint:file=/data/elasticsearch/logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
保存文件并退出编辑。
[微风]设置开机自启动
使用如下命令设置开机自动运行Elasticsearch。
sudo bash -c "cat >> /etc/rc.local << EOF \
/bin/su - elasticsearch -c \"nohup /app/elasticsearch/elasticsearch-7.17.6/bin/elasticsearch -d\"
EOF"
启动集群
本步骤从data-1节点开始,然后在其它节点上重复。
[微风]启动节点
重启节点计算机,或使用以下命令启动节点上的Elasticsearch。
su elasticsearch
/app/elasticsearch/elasticsearch-7.17.6/bin/elasticsearch -d
执行以下命令查看进程是否已启动并绑定9200端口。
su -
lsof -i :9200
[微风]初始化Search Guard
通过如下命令使用sgctl初始化SearchGuard。
Search Guard提供了Install Demo Tool,也可用于完成此步,*载下**地址为:https://maven.search-guard.com/search-guard-flx-release/com/floragunn/search-guard-flx-elasticsearch-plugin/1.0.0-es-7.17.6/search-guard-flx-elasticsearch-plugin-1.0.0-es-7.17.6-demo-installer.sh
# 准备sgctl工具、
cd /app
unzip sgctl-1.0.0.zip
# 复制证书(由前面证书生成环节生成,可从操作机上传或远程复制)
cp {admin,root-ca}.{key,pem} /app/sgctl-1.0.0
# 复制searchgaurd示例配置(在searchguard插件压缩包中)
cp /app/elasticsearch/elasticsearch-7.17.6/plugins/search-guard-flx/sgconfig /app/sgctl-1.0.0/
# 建立到数据节点1的连接
./sgctl.sh connect [node ip] --ca-cert ./root-ca.pem --cert ./admin.pem --key ./admin.key --skip-connection-check --debug
# 将默认配置发送到服务端
./sgctl.sh update-config sgconfig/*.yml -k
使用以下命令设置修改各预置账号默认密码(注意修改changeme为真实密码)。
./sgctl.sh update-user admin --password "changeme" --skip-connection-check --insecure --debug
./sgctl.sh update-user kibanaserver --password "changeme" --skip-connection-check --insecure --debug
./sgctl.sh update-user kibanaro --password "changeme" --skip-connection-check --insecure --debug
./sgctl.sh update-user logstash --password "changeme" --skip-connection-check --insecure --debug
./sgctl.sh update-user readall --password "changeme" --skip-connection-check --insecure --debug
./sgctl.sh update-user snapshotrestore --password "changeme" --skip-connection-check --insecure --debug
执行如下命令,可查看当前集群节点数为3,以及各节点角色等信息(注意修改admin用户的密码为上一步设置的密码)。
curl -k -u admin:changeme https://[节点的IP]:9200/_cat/nodes?format=json
安装Kibana
登录到voting-1主机,或单独的一台机器,使用如下命令放置安装包,并验证。
cd /app
mkdir -p /app/{kibana,search-guard}
# kibana安装包
cp kibana-7.17.6-linux-x86_64.tar.gz /app/kibana/
cp kibana-7.17.6-linux-x86_64.tar.gz.sha512 /app/kibana/
# search guard for kibana插件
cp search-guard-flx-kibana-plugin-1.0.0-es-7.17.6.zip /app/search-guard/
# sgctl生成的证书(来自前面证书生成步骤)
cp out/{root-ca,kibana-server*}.{key,pem} /app/search-guard/
cd /app/kibana
shasum -a 512 -c kibana-7.17.6-linux-x86_64.tar.gz.sha512
# kibana-7.17.6-linux-x86_64.tar.gz: OK
使用如下命令编辑配置文件。
sudo vi /etc/profile
在配置文件末尾添加如下行。
#kibana
export KBN_PATH_CONF=/data/kibana/config
使用如下命令重启机器。
sudo init 6
安装Kibana和SearchGuard
# 解压缩Kibana安装包
cd /app/kibana
tar -xzf kibana-7.17.6-linux-x86_64.tar.gz
# 创建kibana工作目录
sudo mkdir -p /data/kibana/{config,data,logs,tmp}
sudo mv /app/kibana/kibana-7.17.6-linux-x86_64/{config,data} /data/kibana/
# 复制https证书文件
sudo mv /app/search-guard/{root-ca,kibana-server*}.{key,pem} /data/elasticsearch/config/
# 因kibana的bug,需要将原data目录重定向
sudo ln -sv /data/kibana/data /app/kibana/kibana-7.17.6-linux-x86_64/data
# 将工作目录授权给elasticsearch用户
sudo chown -R elasticsearch:elasticsearch /app/kibana /app/search-guard /data/kibana
# 安装SearchGuard
su elasticsearch
cd /app/kibana/kibana-7.17.6-linux-x86_64/bin
./kibana-plugin install file:///app/search-guard/search-guard-flx-kibana-plugin-1.0.0-es-7.17.6.zip
使用以下命令编辑Kibana配置文件。
su elasticsearch
vi /data/kibana/config/kibana.yml
配置文件修改如下(注意替换[]中ip地址、elasticsearch.password):
server.host: "[voting-1 ip]"
server.publicBaseUrl: "https://[Kibana的公开访问地址]"
elasticsearch.hosts: ["https://[data-1]:9200", "https://[data-2]:9200", "https://[voting-1]:9200"]
elasticsearch.username: "kibanaserver"
elasticsearch.password: "changeme"
server.ssl.enabled: true
server.ssl.certificate: /data/kibana/config/kibana-server_http.pem
server.ssl.key: /data/kibana/config/kibana-server_http.key
elasticsearch.ssl.certificateAuthorities: [ "/data/kibana/config/root-ca.pem" ]
elasticsearch.ssl.verificationMode: certificate
path.data: /data/kibana/data
pid.file: /data/kibana/data/kibana.pid
i18n.locale: "zh-CN"
#xpack
xpack.security.enabled: false
xpack.reporting.capture.browser.chromium.disableSandbox: false
xpack.encryptedSavedObjects.encryptionKey: encryptedSavedObjects123456789001234567890
xpack.security.encryptionKey: encryptedSavedObjects123456789001234567890
xpack.reporting.encryptionKey: encryptedSavedObjects123456789001234567890
xpack.reporting.roles.enabled: false
#logging
logging:
appenders:
roll-file:
type: rolling-file
fileName: /data/kibana/logs/kibana.log
policy:
type: time-interval
interval: 24h
modulate: true
strategy:
type: numeric
pattern: '.%i'
max: 2
layout:
type: json
root:
appenders: [roll-file,default]
#search-guard
searchguard.cookie.password: ewerjksdfoieirkfsdfweorpowerjfsjsdfwerejfsiiqwejfjsiewo
searchguard.cookie.secure: true
searchguard.auth.debug: true
使用以下命令设置开机自动启动kibana。
sudo bash -c "cat >> /etc/rc.local << EOF \
/bin/su - elasticsearch -c \"nohup /app/kibana/kibana-7.17.6-linux-x86_64/bin/kibana > /data/kibana/logs/nohup.out 2>&1 &\"
EOF"
使用网页浏览器访问 https://[kibanba主机ip]:5601,并使用Search Guard创建的admin用户登录即可访问Kibana。
结束语
到这里整个集群就安装完成了,Search Guard还提供了在Docker、Kubernetes上的安装方式,也可以尝试。