Elastic:創建Elasticsearch集羣併爲它們配置TLS安全通信

在之前的文章中“如何在一個機器上同時模擬多個node”,我們介紹瞭如何在同一個機器中運行同一個Elasticsearch的安裝,並創建一個多node的Elasticsearch集羣。我們也在“Elastic:用Docker部署Elastic棧”文章中介紹瞭如何使用docker技術來創建多個node的Elasticsearch集羣。在實際的應用中,我們可能需要在不同的機器中部署Elasticsearch,並讓它們一起連起來組成集羣。Elasticsearch其中一個重要的特點就是它的可拓展性。在今天的文章中,我們來講述一下:

  • 部署多個節點的集羣
  • 爲集羣之前提供安全的通信

前提條件

在今天的實驗中,我使用了兩個不同的機器來做我們的練習:

如上圖所示,我有兩臺機器,其中的一個是MacOS,其IP地址是192.168.0.100。另外一臺機器安裝的是Ubuntu OS 20.04版本。它的IP地址是192.168.0.102。

安裝

如果你還不知道如何安裝Elasticsearch和Kibana的話,請參閱我之前的文章“Elastic:菜鳥上手指南”。我們分別在上面的兩個機器上安裝Elasticsearch及Kibana。在運行我們的Elasticsearch之前,我們先要做配置。特別是Ubuntu的這個Node。如果沒有配置就直接運行,那麼就會造成一個錯誤的信息:

Error while clustering nodes from different host/machines

也就是說之前它自己運行起來了,並創建了自己的cluster。讓後我們讓它去加入另外一個node去組成一個集羣的話,就會出現上面的錯誤。

另外一個我在運行Ubuntu OS上的Elasticsearch時,我發現有這樣的一個錯誤信息:

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

上面的錯誤信息應該很明顯,我們需要使用如下的命令來進行修正:

sudo sysctl -w vm.max_map_count=262144

爲了能夠正確地運行,我們針對這個兩個機器分別做配置。

配置host名稱

我們分別到MacOS及Ubuntu電腦的/etc/hosts文件里加入如下的兩句:

192.168.0.100	mac
192.168.0.102	ubuntu

我們必須保證我們的這兩個電腦在同一個局域網中。一旦配置成功,我們可以在MacOS的電腦中,輸入如下的命令:

$ ping ubuntu
PING ubuntu (192.168.0.102): 56 data bytes
64 bytes from 192.168.0.102: icmp_seq=0 ttl=64 time=0.593 ms
64 bytes from 192.168.0.102: icmp_seq=1 ttl=64 time=0.930 ms
64 bytes from 192.168.0.102: icmp_seq=2 ttl=64 time=0.832 ms

很顯然,我們在MacOS的電腦中可以看到Ubuntu電腦。同樣的我們也可以在Ubuntu電腦中ping到MacOS的電腦。

Elasticsearch配置

根據文章中的介紹,在我們平時的開發中,我們很多時候是使用開發模式,也就是我們把Elasticsearch綁定於自己機器的localhost。顯然在production模式下這個是不適用的。要加入集羣,Elasticsearch節點必須可以通過transport通信到達。 要通過non-loopback地址加入羣集,節點必須將傳輸綁定到non-loopback地址,並且不能使用single-node discovery。 因此,如果Elasticsearch節點無法通過non-loopback地址與另一臺機器形成集羣,則認爲該節點處於開發模式,如果它可以通過non loopback地址加入集羣,則該節點處於生產模式。

請注意,可以通過http.host和transport.host獨立配置HTTP和傳輸。 這對於將單個節點配置爲可通過HTTP進行訪問以進行測試(而不觸發生產模式)很有用。

Elasticsearch 配置 - MacOS

我們使用自己喜歡的編輯器打開在Elasticsearch安裝目錄下的config/elasticsearch.yml文件

cluster.name: elasticsearch
node.name: node2
network.host: _site_
discovery.seed_hosts: ["mac"]
cluster.initial_master_nodes: ["node2"]

在這裏,我們取一個叫做elasticsearch的集羣。該node的名稱爲node2。我們把network.host設置爲_site_則表明elasticsearch將綁定於電腦所在的本地地址上。針對我們的情況就是192.168.0.100。在上面我們也配置了discover.seed_hosts 爲 "mac"。請參照上一節“配置host名稱”中的介紹。它會解析出來192.168.0.100。我們設置cluster.initial_master_nodes爲和node.name一樣的配置。請參閱Elastic的官方文檔

Elasticsearch 配置 - Ubuntu OS

按照同樣的方法,我們對Ubuntu OS中Elasticsearch的config/elasticsearch.yml文件進行如下的配置:

cluster.name: elasticsearch
node.name: node1
network.host: _site_
discovery.seed_hosts: ["mac"]
cluster.initial_master_nodes: ["node1"]

特別指出的是,我們在這裏設置discovery.seed_hosts爲“mac”。

Kibana 配置

由於我們使用了私用地址,我們需要對Kibana中的一些配置做一些修改,否認它訪問不到我們的Elasticsearch。我們打開config/kibana.yml文件:

server.host: "192.168.0.100"
elasticsearch.hosts: ["http://192.168.0.100:9200"]

啓動集羣

我們按照如下的順來啓動集羣:

  1. 在MacOS上的Elasticsearch
  2. 在Ubuntu OS上的Elasticsearch
  3. 在MacOS上的Kibana

我們可以在MacOS master node裏看到如下的信息:

我們打開Kibana,然後,查看我們的集羣:

GET _cat/nodes?v

上面顯示我們有兩個node的集羣。其中master是node2。Hooray,我們終於有了第一個分佈於不同機器的集羣。

我們接下來來查看我們集羣的健康狀況:

GET _cluster/health

上面顯示我們有兩個data node。器狀態是green的。

爲node之間的通信加密

我們知道node之間的通信是通過Transport模塊來進行的。它們之間的通信可以通過加密而得到更加安全的保護。爲此,Elastic爲這個transport配置了安全的設置。

Elasticsearch配置 - MacOS 

我們在Elasticsearch的安裝目錄中打入如下的命令來生產根證書:

./bin/elasticsearch-certutil cert

我們把生產的證書保存於config子目錄中:

$ pwd
/Users/liuxg/elastic/elasticsearch-7.6.2
liuxg:elasticsearch-7.6.2 liuxg$ ls config/
elastic-certificates.p12 jvm.options              roles.yml
elasticsearch.keystore   log4j2.properties        users
elasticsearch.yml        role_mapping.yml         users_roles

從上面可以看出來,我們已經在config子目錄下生成了一個可以使用的叫做elastic-certificates.p12的證書。接下來我們需要運用這個證書來配置我們的Elasticsearch。我們可以參閱官方文檔。打開config/elasticsearch.yml文件,並把如下的配置加入到文件的後面:

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

我們重新啓動Elasticsearch。由於我們已經啓動了安全的設置,我們必須爲Elasticsearch設置密碼。我們可以參考我之前的文章“Elasticsearch:設置Elastic賬戶安全”。我們在另外一個terminal中輸入如下的命令:

./bin/elasticsearch-setup-passwords interactive

你可以選擇你自己喜歡的密碼。針對我的情況,爲了方便,我都設置爲123456。

Elasticsearch配置 - Ubuntu OS

 我們必須把在MacOS上生產的證書拷入到Ubuntu OS中的Elasticsearch中。證書elastic-certificates.p12將被放入同樣的位置config子目錄中。我們可以按照如下的命令來進行拷貝:

scp ./config/elastic-certificates.p12 liuxg@ubuntu:/home/liuxg/elastic/elasticsearch-7.6.2/config

請注意上面的在ubuntu機器中的路徑和你的安裝路徑應該不同。你需要做相應的修改。這樣在Ubuntu機器上的文件顯示爲:

我們同樣啓動Elasticsearch。

在我們的MacOS機器上,我們可以看到:

node1已經成功地加入到集羣裏。

這時候,如果我們在Ubuntu OS的機器裏嘗試使用如下的命令來設置密碼的話:

./bin/elasticsearch-setup-passwords interactive

它將會告訴我們如下的錯誤信息:

$ ./bin/elasticsearch-setup-passwords interactive
future versions of Elasticsearch will require Java 11; your Java version from [/usr/lib/jvm/java-8-openjdk-amd64/jre] does not meet this requirement

Failed to authenticate user 'elastic' against http://192.168.0.102:9200/_security/_authenticate?pretty
Possible causes include:
 * The password for the 'elastic' user has already been changed on this cluster
 * Your elasticsearch node is running against a different keystore
   This tool used the keystore at /home/liuxg/elastic/elasticsearch-7.6.2/config/elasticsearch.keystore

ERROR: Failed to verify bootstrap password

上面標明Ubuntu OS上的Elasticsearh的安全配置已經跟隨MacOS上的Elasticsearch設置的密碼。我們嘗試使用如下的命令來訪問這個Elasticsearch:

$ curl -u "elastic:123456" http://ubuntu:9200
{
  "name" : "node1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "fylS-jtjRRSeJlTCW1UN8Q",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

顯然我們的用戶名及密碼是成功的。

配置Kibana

由於我們已經加入了安全,我們需要對Kibana的配置config/kibana.yml重新進行修改:

elasticsearch.username: "kibana"
elasticsearch.password: "123456"

打開Kibana,我們重新查看一下我們的Elasticsearch集羣的健康狀況:

好了。經過這樣的設置後,我們集羣裏的node之前的通信就變得更加安全了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章