关于java:elasticsearch基于RBAC认证和集群之间的TLS通讯

37次阅读

共计 2685 个字符,预计需要花费 7 分钟才能阅读完成。

一、背景

默认状况下,当咱们搭建好 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 的生产模式

  1. 集群之间的服务发现不可是 single-node discovery 服务发现。
  2. 节点之间能够应用非回环地址退出集群。

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 拜访

正文完
 0