默认状况下,当咱们搭建好es集群
后,咱们经过http://localhost:9200
就能够直接访问到es集群的一些信息,这显然是不安全的。在同一个局域网中,若是咱们启动了多个es节点,且集群的名字相同,那么他们可能会自动加入集群,这显然是不安全的。所以咱们要想个办法来解决它。es自带的插件x-pack
就能够解决上述的要求。在高版本的es中,x-pack
插件是默认就集成了。html
一、给es增长用户名和密码访问。
二、集群之间的通信采用TLS通信。java
# 一、修改 ES_HOME/config/elasticsearch.yml # 增长以下配置 vim config/elasticsearch.yml xpack.security.enabled: true
此时能够看到访问es集群就须要用户名和密码了,那么咱们这个用户名和密码从哪里获取呢?
./bin/elasticsearch-setup-passwords auto
若是执行上面这个语句,那么es会自动设置密码,咱们须要本身把这个密码保存下来。node
./bin/elasticsearch-setup-passwords interactive
此处为了简单,将每一个用户的用户名和密码都设置成 123456
,生产环境须要设置成一个复杂的接口。apache
注意⚠️: bootstrap
当咱们设置了elastic
用户的密码后,就不可在执行elasticsearch-setup-passwords
命令了。vim
从新访问es集群,输入用户名和密码以后,就能够访问到集群的信息了。安全
# 设置用户名和密码 elasticsearch.username: "kibana_system" elasticsearch.password: "123456"
该用户名和密码,是由上一步设置好的。bash
此时能够看到,咱们的kibana就须要用户名和密码访问了。elasticsearch
一、在es集群的生产模式中
,节点之间的通信必需要使用TLS通信,不然集群没法启动。ide
二、配置集群以TLS通信,还能够防止不受信任的节点加入es集群。
# 生成证书 bin/elasticsearch-certutil ca
# --ca 指定证书的路径 ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 一、将证书拷贝到每一个节点的 config 目录下 mv elastic-certificates.p12 config # 二、修改elasticsearch.yml文件,增长以下配置 xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.client_authentication: required xpack.security.transport.ssl.keystore.path: elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
使用resource.reload.interval.high
参数配置,默认是5s
。
import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; /** * @author huan.fu 2021/4/22 - 下午2:48 */ public class AbstractEsApi { protected final RestHighLevelClient client; public AbstractEsApi() { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456")); client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http"), new HttpHost("localhost", 9202, "http") ) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)) ); } }