elasticsearch由于自身没有做登录验证,所以会出现安全问题。Elasticsearch 数据安全可能存在的风险点:
- 在公网暴露集群TCP 端口或者 HTTP 端口。
- Elasticsearch 集群节点之间通信是明文的,可以被窃取或者篡改。
- 没有细粒度控制索引的操作权限
- 非必要情况下关闭HTTP端口(只保留Client 节点的HTTP端口)
- 非必要情况下关闭动态脚本,部分脚本语言
在项目中要对elasticsearch进行登录验证,翻阅资料后大概是有三个办法:
1. 用官方插件x-pack。优点:和elasticsearch和kibana集成较好,权限、用户比较全面。缺点:不开源。
2. 通过nginx 指定受信服务器访问。
3. Search Guard。(选择searchguard的原因是开源,大部分功能可以满足我的项目需求)
search-guard是elastcisearch的一款插件,提供加密,身份验证和授权,基于search guard SSL,另外提供可插入的身份验证/授权模块,search-guard是shield的替代品,可免费提供所有的基本安全功能,
github地址:https://github.com/floragunncom/search-guard
[root@localhost elasticsearch]# bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.3.0-11
安装完成后看在plugin文件夹下是否有searchguard目录。
github地址:
https://github.com/floragunncom/search-guard-ssl/tree/es-5.3.0/example-pki-scripts
下载后在目录中找到example.sh,打开并编辑:
“`
[root@localhost example-pki-scripts]# cat example.sh
set -e
./clean.sh
./gen_root_ca.sh capass changeit
./gen_node_cert.sh 1 changeit capass
./gen_client_node_cert.sh spock changeit capass
./gen_client_node_cert.sh kirk changeit capass
修改后运行
[root@localhost example-pki-scripts]# ./example.sh
复制 truststore.jks node-x-keystore.jks 证书到elasticsearch:
[root@localhost example-pki-scripts]# cp node-1-keystore.jks truststore.jks /etc/elasticsearch/
配置elasticsearch 各结点基于tls加密通讯:
[root@localhost example-pki-scripts]# vim /etc/elasticsearch/elasticsearch.yml
node.name: node-1
searchguard.ssl.transport.keystore_filepath: node-1-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
重启后,elasticsearch 之间的连接已经是加密的了,但是有如下报错,此问题是没有初始化 Search Guard 索引。
在elasticsearch控制台报错:
[ERROR][c.f.s.a.BackendRegistry ] Not yet initialized (you may need to run sgadmin)
“`
##### 3.初始化 Search Guard 索引,配置帐号。
复制kirk-keystore.jks证书
[root@localhost example-pki-scripts]# cp kirk-keystore.jks /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/
新增以下配置参数
“`
[root@localhost example-pki-scripts]# vim /etc/elasticsearch/elasticsearch.yml
searchguard.authcz.admin_dn:
- “CN=kirk, OU=client, O=client, L=Test, C=DE”
重启elasticsearch服务
初始化 Search Guard 索引
[root@localhost search-guard-5]# cd /usr/share/elasticsearch/plugins/search-guard-5
[root@localhost search-guard-5]# tools/sgadmin.sh -ts /etc/elasticsearch/truststore.jks -tspass changeit -ks sgconfig/kirk-keystore.jks -kspass changeit -cd sgconfig/ -icl -nhnv -h localhost
“`
运行结尾为Done with success表示初始化索引成功
如果出现权限问题,请给root赋sgadmin.sh的权限:
chmod +x plugins/search-guard-2/tools/sgadmin.sh
其中 sg_internal_users.yml 保存着默认的用户和密码
admin:
hash: $2a$12$VcCDgh2NDk07JGN0rjGbM.Ad41qVR/YFJcgHp0UGns5JDymv..TOG
#password is: admin
使用浏览器访问:http://localhost:9200 提示输入密码,输入默认用户: admin admin ,可登陆表示正常。
[root@localhost elk]# vim /etc/elasticsearch/elasticsearch.yml,
searchguard.ssl.http.enabled: true
searchguard.ssl.http.keystore_filepath: node-1-keystore.jks
searchguard.ssl.http.keystore_password: changeit
searchguard.ssl.http.truststore_filepath: truststore.jks
searchguard.ssl.http.truststore_password: changeit
使用浏览器访问:https://localhost:9200 提示输入密码,输入默认用户: admin admin ,可登陆表示正常
http://localhost:9200 无加密拒绝访问。
修改 kibana.yml 参数
[root@localhost kibana]# vim /etc/kibana/kibana.yml
elasticsearch.url: "https://localhost:9200"
elasticsearch.username: "kibanaserver"
elasticsearch.password: "kibanaserver"
elasticsearch.ssl.verify: false
修改kibana console插件参数,如果不修改,无法使用kibana console的功能。
[root@localhost kibana]# vim /usr/share/kibana/src/core_plugins/console/index.js
ssl: {
verify: false 默认为:true
}
重启kibana,提示要求输入密码 admin admin