目录
一、背景
由于elasticsearch(简称ES)的HTTP访问,默认不需要密码。意味着谁都可以访问,谁都可以修改,这样非常不安全。
因此需要增加一些安全机制。 对于ES 1.x的低版本可以使用http.basic, 但对于ES 2.x及以上,则应该使用search-guard。它作为ES的插件。
二、环境(操作系统为Linux)
1、已经安装了logstash 6.8.3,接收filebeat的数据,并将数据转给ES。
2、已经安装了 ES 6.8.3 并进行了配置,可以正常启动和Web访问(无需密码)。
3、已经安装了 kibana 6.8.3 并进行了配置,可以正常启动使用。 kibana会访问ES。
不同的ES版本需要使用不同search-guard版本的插件,两者版本对应关系及下载链接:search-guard-versions
因此版本:ES 6.8.3 版本, 对应的 search-guard为:25.5。
三、安装search-guard
1、在linux上下载介质。 下载后无需解压。
wget https://releases.floragunn.com/search-guard-6/6.8.3-25.5/search-guard-6-6.8.3-25.5.zip
2、停止ES运行。
3、使用ES已有的插件工具,安装命令如下。会自动在ES的plugins目录下创建search-guard文件。
./elasticsearch-6.8.3/bin/elasticsearch-plugin install -b file:///home/zyplanke/es/search-guard-6-6.8.3-25.5.zip
4、启用插件。进入插件目录:elasticsearch-6.8.3/plugins/search-guard-6/tools下,执行:
bash install_demo_configuration.sh (按提示,输入三次Y)
以上执行后,会自动给elasticsearch-6.8.3/config/elasticsearch.yml文件后面添加以下内容:
searchguard.ssl.transport.pemcert_filepath: esnode.pem
searchguard.ssl.transport.pemkey_filepath: esnode-key.pem
searchguard.ssl.transport.pemtrustedcas_filepath: root-ca.pem
searchguard.ssl.transport.enforce_hostname_verification: false
searchguard.ssl.http.enabled: true
searchguard.ssl.http.pemcert_filepath: esnode.pem
searchguard.ssl.http.pemkey_filepath: esnode-key.pem
searchguard.ssl.http.pemtrustedcas_filepath: root-ca.pem
searchguard.allow_unsafe_democertificates: true
searchguard.allow_default_init_sgindex: true
searchguard.authcz.admin_dn:
- CN=kirk,OU=client,O=client,L=test, C=de
searchguard.audit.type: internal_elasticsearch
searchguard.enable_snapshot_restore_privilege: true
searchguard.check_snapshot_restore_write_privileges: true
searchguard.restapi.roles_enabled: ["sg_all_access"]
cluster.routing.allocation.disk.threshold_enabled: false
discovery.zen.minimum_master_nodes: 1
node.max_local_storage_nodes: 3
xpack.security.enabled: false
5、重启ES,使用https访问。 https://IP:9200
会提示输入用户密码,说明插件已经生效。(默认管理员用户为admin;密码为admin)
6、修改admin用户的密码。进入插件目录:elasticsearch-6.8.3/plugins/search-guard-6/tools下,执行:
bash hash.sh -p <新密码明文>
7、将得到的新密码密文串, 放入elasticsearch-6.8.3/plugins/search-guard-6/sgconfig/sg_internal_users.yml文件,修改文件admin用户下的hash值(使用刚才得到的新密码密文串)。 (建议同时把readonly设置为false,允许在kibana中修改admin的密码)
admin:
readonly: false
hash: $2y$12$/iFel04G0O.0YmK.f31vhuwJZJ3xx9Fv164EveHVv73a8T2XnhGAC
roles:
- admin
attributes:
#no dots allowed in attribute names
attribute1: value1
attribute2: value2
attribute3: value3
(以下内容省略)
注意:这个文件除了admin,还有其他用户,例如kibanaserver用户。
8、初始化Search-Guard。进入插件目录:elasticsearch-6.8.3/plugins/search-guard-6/tools下,执行:
bash sgadmin_demo.sh
(如果在ES已运行情况下,仍报“ERR: Seems there is no Elasticsearch running on localhost:9300”,有可能是ES监听的IP不对,建议ES监听host的IP配置为0.0.0.0)
注:可以编辑sgadmin_demo.sh文件中的内容,在命令后面增加参数:例如-h XX.XX.XX.XX -p 123456 分别指定ES服务所在的IP地址和端口。
9、不用重启ES,使用浏览器登录ES,可发现新密码已经生效。
四、同步修改Kibana配置
1、由于kibana需要连接ES,当ES增加了search-guard插件后,kibana也需要同步修改。
2、编辑kibana目录下的kibana.yml文件, 修改配置如下:
elasticsearch.hosts: ["https://IP:9200"]
elasticsearch.username: "kibanaserver"
elasticsearch.password: "kibanaserver"
elasticsearch.ssl.verificationMode: none
elasticsearch.requestHeadersWhitelist: [ "authorization","sgtenant" ]
3、然后重启kibana,在kibana Web页面中,使用admin用户密码登录。 可成功登录。
五、同步修改logstash配置
修改logstash配置logstash-sample.conf文件。参考格式如下
output {
elasticsearch {
hosts => ["https://IP:9200"]
user => "admin"
password => "password"
ssl => false
ssl_certificate_verification => false
index => "nginx-%{+YYYY_MM}"
codec => json
}
主要关注:hosts、user、password、ssl、ssl_certificate_verification的配置,其他配置结合自己的环境确定。