一、背景
默认状况下,当咱们搭建好es集群
后,咱们通过http://localhost:9200
就能够间接拜访到es集群的一些信息,这显然是不平安的。在同一个局域网中,如果咱们启动了多个es节点,且集群的名字雷同,那么他们可能会主动退出集群,这显然是不平安的。因而咱们要想个办法来解决它。es自带的插件x-pack
就能够解决上述的要求。在高版本的es中,x-pack
插件是默认就集成了。
二、须要解决的问题
1、给es减少用户名和明码拜访。
2、集群之间的通信采纳TLS通信。
三、给es减少用户名和明码拜访
1、批改config/elasticsearch.yml
# 1、批改 ES_HOME/config/elasticsearch.yml
# 减少如下配置
vim config/elasticsearch.yml
xpack.security.enabled: true
2、拜访es集群
此时能够看到拜访es集群就须要用户名和明码了,那么咱们这个用户名和明码从哪里获取呢?
3、启用es集群内建的用户
1、让es主动设置初始化明码
./bin/elasticsearch-setup-passwords auto
如果执行下面这个语句,那么es会主动设置明码,咱们须要本人把这个明码保留下来。
2、主动手动设置明码
./bin/elasticsearch-setup-passwords interactive
此处为了简略,将每个用户的用户名和明码都设置成 123456
,生产环境须要设置成一个简单的接口。
留神⚠️:
当咱们设置了elastic
用户的明码后,就不可在执行elasticsearch-setup-passwords
命令了。
3、从新拜访es,输出用户名和明码
从新拜访es集群,输出用户名和明码之后,就能够拜访到集群的信息了。
四、kibana连贯到es集群
1、设置kibana的用户名和明码
# 设置用户名和明码
elasticsearch.username: "kibana_system"
elasticsearch.password: "123456"
该用户名和明码,是由上一步设置好的。
2、拜访kibana
此时能够看到,咱们的kibana就须要用户名和明码拜访了。
3、通过kibana创立用户和角色
五、配置es集群之间的TLS通信
1、在es集群的生产模式中
,节点之间的通信必须要应用TLS通信,否则集群无奈启动。
2、配置集群以TLS通信,还能够避免不受信赖的节点退出es集群。
1、何为es的生产模式
- 集群之间的服务发现不可是 single-node discovery 服务发现。
- 节点之间能够应用非回环地址退出集群。
2、配置步骤
1、生成证书(CA)
# 生成证书
bin/elasticsearch-certutil ca
2、为每个节点签发证书
# --ca 指定证书的门路
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
3、查看证书的生成门路
4、为集群中的每个节点配置证书
# 1、将证书拷贝到每个节点的 config 目录下
mv elastic-certificates.p12 config
# 2、批改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
5、重启es集群
6、从新加载集群的证书、密钥等信息
应用resource.reload.interval.high
参数配置,默认是5s
。
六、java client中basic认证的写法
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))
);
}
}
七、参考链接
1、给es集群设置简略的用户名、明码拜访
2、配置集群之间TLS通信
3、es集群的开发模式和生产模式
4、配置rest通过https拜访
发表回复