elasticsearch基于RBAC认证和集群之间的TLS通信

1、背景

默认状况下,当咱们搭建好es集群后,咱们经过http://localhost:9200就能够直接访问到es集群的一些信息,这显然是不安全的。在同一个局域网中,若是咱们启动了多个es节点,且集群的名字相同,那么他们可能会自动加入集群,这显然是不安全的。所以咱们要想个办法来解决它。es自带的插件x-pack就能够解决上述的要求。在高版本的es中,x-pack插件是默认就集成了。html

2、须要解决的问题

一、给es增长用户名和密码访问。
二、集群之间的通信采用TLS通信。java

3、给es增长用户名和密码访问

一、修改config/elasticsearch.yml

# 一、修改 ES_HOME/config/elasticsearch.yml
# 增长以下配置
vim config/elasticsearch.yml
xpack.security.enabled: true

二、访问es集群

访问es集群

此时能够看到访问es集群就须要用户名和密码了,那么咱们这个用户名和密码从哪里获取呢?

三、启用es集群内建的用户

一、让es自动设置初始化密码

./bin/elasticsearch-setup-passwords auto

若是执行上面这个语句,那么es会自动设置密码,咱们须要本身把这个密码保存下来。node

二、自动手动设置密码

./bin/elasticsearch-setup-passwords interactive

自动手动设置密码

此处为了简单,将每一个用户的用户名和密码都设置成 123456,生产环境须要设置成一个复杂的接口。apache

注意⚠️: bootstrap

当咱们设置了elastic用户的密码后,就不可在执行elasticsearch-setup-passwords命令了。vim

三、从新访问es,输入用户名和密码

从新访问es,输入用户名和密码
从新访问es集群,输入用户名和密码以后,就能够访问到集群的信息了。安全

4、kibana链接到es集群

一、设置kibana的用户名和密码

# 设置用户名和密码
elasticsearch.username: "kibana_system"
elasticsearch.password: "123456"

该用户名和密码,是由上一步设置好的。bash

二、访问kibana

访问kibana
此时能够看到,咱们的kibana就须要用户名和密码访问了。elasticsearch

三、经过kibana建立用户和角色

经过kibana建立用户和角色

5、配置es集群之间的TLS通信

一、在es集群的生产模式中,节点之间的通信必需要使用TLS通信,不然集群没法启动。ide

二、配置集群以TLS通信,还能够防止不受信任的节点加入es集群。

在这里插入图片描述

一、何为es的生产模式

  1. 集群之间的服务发现不但是 single-node discovery 服务发现。
  2. 节点之间能够使用非回环地址加入集群。

二、配置步骤

一、生成证书(CA)

# 生成证书
bin/elasticsearch-certutil ca

生成证书(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

五、重启es集群

重启ES集群使TLS通信生效

六、从新加载集群的证书、密钥等信息

从新加载集群的证书、密钥等信息

使用resource.reload.interval.high参数配置,默认是5s

6、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))
        );
    }
}

7、参考连接

一、给es集群设置简单的用户名、密码访问

二、配置集群之间TLS通信

三、es集群的开发模式和生产模式

四、配置rest经过https访问

相关文章
相关标签/搜索