默認狀況下,當咱們搭建好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)) ); } }