ElasticSearch 集羣安全

公號:碼農充電站pro
主頁:https://codeshellme.github.io

在安裝完 ES 後,ES 默認是沒有任何安全防護的。

ES 的安全管理主要包括以下內容:

這裏有一些免費的安全方案:

  • 設置 Nginx 方向代理。
  • 安裝免費的安全插件,比如:
  • X-Pack 的 Basic 版:可參考這裏

1,身份認證

ES 中提供的認證叫做 Realms,有以下幾種方式,可分爲兩類:

  • 內部的:不需要與 ES 外部方通信。
    • file(免費):用戶名和密碼保存在 ES 索引中。
    • native(免費):用戶名和密碼保存在 ES 索引中。
  • 外部的:需要與 ES 外部組件通信。

2,用戶鑑權

用戶鑑權通過定義一個角色,並分配一組權限;然後將角色分配給用戶,使得用戶擁有這些權限。

ES 中的權限有不同的級別,包括集羣級別(30 多種)和索引級別(不到 20 種)。

ES 中提供了很多內置角色(不到 30 種)可供使用。

ES 中提供了很多關於用戶與角色的 API:

3,啓動 ES 安全功能

下面演示如何使用 ES 的安全功能。

啓動 ES 並通過 xpack.security.enabled 參數打開安全功能:

bin\elasticsearch -E node.name=node0 -E cluster.name=mycluster -E path.data=node0_data -E http.port=9200 -E xpack.security.enabled=true

使用 elasticsearch-setup-passwords 命令啓用 ES內置用戶及初始 6 位密碼(需要手動輸入,比如是 111111):

bin\elasticsearch-setup-passwords interactive

該命令會啓用下面這些用戶:

  • elastic:超級用戶。
  • kibana:用於 ES 與 Kibana 之間的通信。
  • kibana_system:用於 ES 與 Kibana 之間的通信。
  • apm_system
  • logstash_system
  • beats_system
  • remote_monitoring_user

啓用 ES 的安全功能後,訪問 ES 就需要輸入用戶名和密碼:

在這裏插入圖片描述

也可以通過 curl 命令(並指定用戶)來訪問 ES:

curl -u elastic 'localhost:9200'

更多內容可參考這裏

4,啓動 Kibana 安全功能

打開 Kibana 的配置文件 kibana.yml,寫入下面內容:

elasticsearch.username: "kibana_system"  # 用戶名
elasticsearch.password: "111111"         # 密碼

然後使用 bin\kibana 命令啓動 Kibana。

訪問 Kibana 也需要用戶和密碼(這裏使用的是超級用戶):

在這裏插入圖片描述

5,使用 Kibana 創建角色和用戶

下面演示如何使用 Kibana 創建角色和用戶。登錄 Kibana 之後進行如下操作:

在這裏插入圖片描述

點擊 Stack Management 後進入下面頁面:

在這裏插入圖片描述

5.1,創建角色

點擊 Create role 創建角色:

在這裏插入圖片描述

創建角色需要填寫如下內容:

  • 角色名稱
  • 角色對哪些索引有權限及索引的權限級別
  • 添加一個 Kibana 權限
  • 最後創建角色

在這裏插入圖片描述

經過上面的操作,創建的角色名爲 test_role,該角色對 test_index 索引有只讀權限;如果進行超越範圍的操作,將發生錯誤。

5.2,創建用戶

進入到創建用戶的界面,點擊 Create user 創建用戶:

在這裏插入圖片描述

填寫用戶名和密碼,並將角色 test_role 賦予該用戶。

在這裏插入圖片描述

5.3,使用用戶

使用新創建的用戶登錄 Kibana:

在這裏插入圖片描述

該用戶只對 test_index 索引有只讀權限;如果進行超越範圍的操作,將發生錯誤。

6,傳輸加密

傳輸加密指的是在數據的傳輸過程中,對數據進行加密(可防止數據被抓包)。

傳輸加密分爲集羣內加密和集羣間加密:

  • 集羣內加密指的是 ES 集羣內部各節點之間的數據傳輸時的加密。
    • 通過 TLS 協議完成。
  • 集羣間加密指的是外部客戶訪問 ES 時,數據傳輸的加密。
    • 通過 HTTPS 協議完成。

更多的內容可參考這裏

6.1,集羣內部傳輸加密

在 ES 中可以使用 TLS 協議對數據進行加密,需要進行以下步驟:

  • 創建 CA
  • 爲 ES 節點創建證書和私鑰
  • 配置證書
1,創建 CA 證書

使用如下命令創建 CA:

bin\elasticsearch-certutil ca

成功後,可以看到當前文件夾下多了一個文件:

elastic-stack-ca.p12
2,生成證書和私鑰

使用如下命令爲 ES 中的節點生成證書和私鑰

bin\elasticsearch-certutil cert --ca elastic-stack-ca.p12

成功後,可以看到當前文件夾下多了一個文件:

elastic-certificates.p12
3,配置證書

將創建好的證書 elastic-certificates.p12 放在 config/certs 目錄下。

4,啓動集羣
# 啓動第一個節點
bin\elasticsearch 
-E node.name=node0 
-E cluster.name=mycluster
-E path.data=node0_data 
-E http.port=9200 
-E xpack.security.enabled=true 
-E xpack.security.transport.ssl.enabled=true 
-E xpack.security.transport.ssl.verification_mode=certificate 
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12 
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12

# 啓動第二個節點
bin\elasticsearch 
-E node.name=node1 
-E cluster.name=mycluster 
-E path.data=node1_data 
-E http.port=9201 
-E xpack.security.enabled=true 
-E xpack.security.transport.ssl.enabled=true 
-E xpack.security.transport.ssl.verification_mode=certificate 
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12 
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12

不提供證書的節點將無法加入集羣:

bin\elasticsearch 
-E node.name=node2 
-E cluster.name=mycluster 
-E path.data=node2_data 
-E http.port=9202 
-E xpack.security.enabled=true 
-E xpack.security.transport.ssl.enabled=true 
-E xpack.security.transport.ssl.verification_mode=certificate
# 加入失敗

也可以將配置寫在配置文件 elasticsearch.yml 中,如下:

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

6.2,集羣外部傳輸加密

通過配置如下三個參數,使得 ES 支持 HTTPS:

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12

在命令行啓動:

bin\elasticsearch 
-E node.name=node0 
-E cluster.name=mycluster
-E path.data=node0_data 
-E http.port=9200 
-E xpack.security.enabled=true 
-E xpack.security.transport.ssl.enabled=true 
-E xpack.security.transport.ssl.verification_mode=certificate 
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12 
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12
-E xpack.security.http.ssl.enabled=true 
-E xpack.security.http.ssl.keystore.path=certs\elastic-certificates.p12 
-E xpack.security.http.ssl.truststore.path=certs\elastic-certificates.p12

啓動成功後,可以通過 HTTPS 協議訪問 ES:

https://localhost:5601/

6.3,配置 Kibana 鏈接 ES HTTPS

1,爲 Kibana 生成 pem 文件

首先用 openssl 爲 kibana 生成 pem:

openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out elastic-ca.pem

成功後會生成如下文件:

elastic-ca.pem

將該文件放在 config\certs 目錄下。

2,配置 kibana.yml

在 Kibana 的配置文件 kibana.yml 中配置如下參數:

elasticsearch.hosts: ["https://localhost:9200"]
elasticsearch.ssl.certificateAuthorities: ["C:\\elasticsearch-7.10.1\\config\\certs\\elastic-ca.pem"]
elasticsearch.ssl.verificationMode: certificate
3,運行 Kibana
bin\kibana

6.4,配置 Kibana 支持 HTTPS

1,爲 Kibana 生成 pem
bin/elasticsearch-certutil ca --pem

上面命令執行成功後會生成如下 zip 文件:

elastic-stack-ca.zip

將該文件解壓,會有兩個文件:

ca.crt
ca.key

將這兩個文件放到 Kibana 的配置文件目錄 config\certs

2,配置 kibana.yml

在 Kibana 的配置文件 kibana.yml 中配置如下參數:

server.ssl.enabled: true
server.ssl.certificate: config\\certs\\ca.crt
server.ssl.key: config\\certs\\ca.key
3,運行 Kibana
bin\kibana

啓動成功後,可以通過 HTTPS 協議訪問 Kibana:

https://localhost:5601/

(本節完。)


推薦閱讀:

ElasticSearch 搜索模板與建議

ElasticSearch 聚合分析

ElasticSearch 中的 Mapping

ElasticSearch 數據建模

ElasticSearch 分佈式集羣


歡迎關注作者公衆號,獲取更多技術乾貨。

碼農充電站pro

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