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訪問

相關文章
相關標籤/搜索