Elasticsearch是一款基于Lucence的全文检索数据库,在文本分析、搜索等领域被广泛使用,但是默认的配置通过限制仅允许局域网访问来保证数据的安全性,如果你需要对公网提供服务,便需要额外安装插件来实现访问控制了。裸奔不仅可能带来被脱库,甚至数据会被删除而且不可恢复。本文将介绍如何选择和配置插件来保障Elasticsearch的安全。
本文介绍的环境均在 Centos 7 下,其它系统同理,只需要修改部分命令。
1. 安装 Elasticsearch,开启外网访问权限
安装JDK 7+,并配置 JAVA_HOME Oracle 官网;
根据官网提供的方法安装 Elasticsearch:使用yum安装;
配置 /etc/elasticsearch/elasticsearch.yml 文件,此处修改 network.host 来允许外网访问:
network.host:0.0.0.0
为了防止他人的端口扫描,修改掉默认端口吧,例如设置成:
http.port: 9999
安装管理插件,例如 head ,重启 Elasticsearch。
2. 安装与配置 SearchGuard 2
安装 Elasticsearch 对应版本的 search-guard-ssl 和 search-guard-2 插件:
cd /usr/share/elasticsearch sudo bin/plugin install -b com.floragunn/search-guard-ssl/2.3.4.14 sudo bin/plugin install -b com.floragunn/search-guard-2/2.3.4.3
配置 search-guard-ssl,生成证书:
cd ~ yum install wget unzip wget https://github.com/floragunncom/search-guard-ssl/archive/2.3.4.zip unzip 2.3.4.zip cd search-guard-ssl-2.3.4/example-pki-scripts/ ./example.sh
复制相应证书到配置文件目录,在集群中时修改 node-0-keystore.jks 中的数字保证与配置文件中相同:
cp node-0-keystore.jks /etc/elasticsearch/ cp truststore.jks /etc/elasticsearch/
将目录中的 elasticsearch.yml.example 的内容复制到 /etc/elasticsearch/elasticsearch.yml
在 /etc/elasticsearch/elasticsearch.yml 中增加以下内容:
searchguard.ssl.transport.keystore_filepath: node-0-keystore.jks #注意 node-0-keystore.jks 与拷入目录的证书名称相同 searchguard.ssl.transport.keystore_password: changeit searchguard.ssl.transport.truststore_filepath: truststore.jks searchguard.ssl.transport.truststore_password: changeit searchguard.ssl.transport.enforce_hostname_verification: false
3. 修改账户密码以及角色权限
使用自带的 hash 脚本生成密码(mycleartextpassword 替换为你需要设置的密码):
sh /usr/share/elasticsearch/plugins/search-guard-2/tools/hash.sh -p mycleartextpassword
将生成的密码复制到 /usr/share/elasticsearch/plugins/search-guard-2/sgconfig/sg_internal_users.yml 中你需要的用户名的 password 后,并注释其它用户;
在相同目录的 sg_roles.yml 中自定义你的用户角色权限;
在 sg_roles_mapping.yml 中指定用户与角色间的对应关系。
4. 更新应用配置 SearchGuard 2 文件
拷贝证书到 SearchGuard 2 插件的配置文件目录:
cd ~/search-guard-ssl-2.3.4/example-pki-scripts/ cp truststore.jks /usr/share/elasticsearch/plugins/search-guard-2/sgconfig/ cp kirk-keystore.jks /usr/share/elasticsearch/plugins/search-guard-2/sgconfig/
重启 Elasticsearch 服务
使用命令应用配置(即时不修改配置文件也需要执行):
sh plugins/search-guard-2/tools/sgadmin.sh -cd plugins/search-guard-2/sgconfig/ -ks plugins/search-guard-2/sgconfig/kirk-keystore.jks -ts plugins/search-guard-2/sgconfig/truststore.jks -nhnv -cn elasticsearch # -cn 后为集群名称(默认为elasticsearch),如果你修改过 cluster.name,则将它替换成你修改的名称
再次连接 Elasticsearch 服务,输入你设置的密码即可正常访问。
5. 给你的 Elasticsearch 服务创建快照备份
Elasticsearch 的数据安全不仅来自外部,内部成员的误操作同样可能带来不可挽回的损失;尽量将账户设置为最小所需权限是一个好方法,但是仍然不可避免存在超级用户,加上 head 插件缺失的确认机制,一不小心就回到解放前了!因此定时备份数据十分重要。
设置共享目录,并挂载到集群上的所有机器,并赋予 Elasticsearch 用户写权限;
在 elasticsearch.yml 中增加共享目录的配置,并重启 ES 服务:
path.repo: ["/mount/backups"]
使用 curl 创建备份仓库:
$ curl -XPUT 'http://localhost:9200/_snapshot/my_backup' -d '{ "type": "fs", "settings": { "location": "my_backup", "compress": true } }'
对指定的 index 创建快照备份(注意索引间不要有空格):
$ curl -XPUT 'http://localhost:9200/_snapshot/my_backup/snapshot_1' -d '{ "indices": "index_1,index_2" }'
查询备份状态
GET http://localhost:9200/_snapshot/my_backup/snapshot_1/_status
把最后两部设置成定时任务吧,这样你就可以定期备份了;而且由于快照机制是增量备份,所以也不用担心空间了!
好了,有关 Elasticsearch 的设置就到这里了。安全无小事,本文也仅是简单介绍了下方法和思路,许多细节都需要自己慢慢琢磨哦!
本文来自 The NewIdea,作者 Carey Tzou 。
永久地址:https://www.tnidea.com/protect-your-elasticsearch.html
未经授权,拒绝任何全文及摘要转载!