1. 程式人生 > >ElasticSearch 叢集安全

ElasticSearch 叢集安全

> **公號:碼農充電站pro** > **主頁:** 在安裝完 ES 後,ES 預設是沒有任何安全防護的。 ES 的[安全管理](https://www.elastic.co/guide/en/elasticsearch/reference/current/secure-cluster.html)主要包括以下內容: - [身份認證](https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-up-authentication.html):鑑定訪問使用者是否合法。 - [使用者鑑權](https://www.elastic.co/guide/en/elasticsearch/reference/current/authorization.html):設定使用者有哪些訪問許可權。 - [傳輸加密](https://www.elastic.co/guide/en/elasticsearch/reference/current/encrypting-communications.html):資料在傳輸的過程中,要加密。 - [日誌審計](https://www.elastic.co/guide/en/elasticsearch/reference/current/auditing.html):記錄叢集操作。 - 等 這裡有一些免費的安全方案: - 設定 Nginx 方向代理。 - 安裝免費的安全外掛,比如: - [Search Guard](https://search-guard.com/):一個安全和報警的 ES 外掛,分收費版和免費版。 - [Readonly REST](https://github.com/sscarduzio/elasticsearch-readonlyrest-plugin) - X-Pack 的 Basic 版:可參考[這裡](https://www.elastic.co/what-is/elastic-stack-security)。 ### 1,身份認證 ES 中提供的認證叫做 [Realms](https://www.elastic.co/guide/en/elasticsearch/reference/current/realms.html),有以下幾種方式,可分為兩類: - 內部的:不需要與 ES 外部方通訊。 - [file](https://www.elastic.co/guide/en/elasticsearch/reference/current/file-realm.html)(免費):使用者名稱和密碼儲存在 ES 索引中。 - [native](https://www.elastic.co/guide/en/elasticsearch/reference/current/native-realm.html)(免費):使用者名稱和密碼儲存在 ES 索引中。 - 外部的:需要與 ES 外部元件通訊。 - [ldap](https://www.elastic.co/guide/en/elasticsearch/reference/current/ldap-realm.html)(收費) - [active_directory](https://www.elastic.co/guide/en/elasticsearch/reference/current/active-directory-realm.html)(收費) - [pki](https://www.elastic.co/guide/en/elasticsearch/reference/current/pki-realm.html)(收費) - [saml](https://www.elastic.co/guide/en/elasticsearch/reference/current/saml-realm.html)(收費) - [kerberos](https://www.elastic.co/guide/en/elasticsearch/reference/current/kerberos-realm.html)(收費) ### 2,使用者鑑權 使用者鑑權通過定義一個角色,並分配一組許可權;然後將角色分配給使用者,使得使用者擁有這些許可權。 ES 中的[許可權](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-privileges.html)有不同的級別,包括叢集級別(30 多種)和索引級別(不到 20 種)。 ES 中提供了很多[內建角色](https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-roles.html)(不到 30 種)可供使用。 ES 中提供了很多關於使用者與角色的 API: - **關於使用者**: - [Change passwords](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-change-password.html):修改密碼。 - [Create or update users](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-user.html):建立更新使用者。 - [Delete users](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-delete-user.html):刪除使用者。 - [Enable users](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-enable-user.html):開啟使用者。 - [Disable users](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-disable-user.html):禁止使用者。 - [Get users](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-user.html):檢視使用者資訊。 - **關於角色**: - [Create or update roles](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-role.html):建立更新角色。 - [Delete roles](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-delete-role.html):刪除角色。 - [Get roles](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-role.html):檢視角色資訊。 ### 3,啟動 ES 安全功能 下面演示如何使用 ES 的安全功能。 啟動 ES 並通過 [xpack.security.enabled](https://www.elastic.co/guide/en/kibana/current/security-settings-kb.html) 引數開啟安全功能: ```shell 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](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-passwords.html) 命令啟用 ES內建使用者及初始 6 位密碼(需要手動輸入,比如是 `111111`): ```shell bin\elasticsearch-setup-passwords interactive ``` 該命令會啟用下面這些使用者: - **elastic**:超級使用者。 - **kibana**:用於 ES 與 Kibana 之間的通訊。 - **kibana_system**:用於 ES 與 Kibana 之間的通訊。 - **apm_system** - **logstash_system** - **beats_system** - **remote_monitoring_user** 啟用 ES 的安全功能後,訪問 ES 就需要輸入使用者名稱和密碼: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210125180522723.png) 也可以通過 **curl** 命令(並指定使用者)來訪問 ES: ```shell curl -u elastic 'localhost:9200' ``` 更多內容可參考[這裡](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/configuring-security.html)。 ### 4,啟動 Kibana 安全功能 開啟 Kibana 的配置檔案 `kibana.yml`,寫入下面內容: ```shell elasticsearch.username: "kibana_system" # 使用者名稱 elasticsearch.password: "111111" # 密碼 ``` 然後使用 `bin\kibana` 命令啟動 Kibana。 訪問 Kibana 也需要使用者和密碼(這裡使用的是超級使用者): ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210125181547506.png) ### 5,使用 Kibana 建立角色和使用者 下面演示如何使用 Kibana 建立角色和使用者。登入 Kibana 之後進行如下操作: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210125182334697.png) 點選 `Stack Management` 後進入下面頁面: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210125182437975.png) #### 5.1,建立角色 點選 `Create role` 建立角色: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2021012518285532.png) 建立角色需要填寫如下內容: - 角色名稱 - 角色對哪些索引有許可權及索引的許可權級別 - 新增一個 Kibana 許可權 - 最後建立角色 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210125215612483.png) 經過上面的操作,建立的角色名為 `test_role`,該角色對 `test_index` 索引有**只讀許可權**;如果進行超越範圍的操作,將發生錯誤。 #### 5.2,建立使用者 進入到建立使用者的介面,點選 `Create user` 建立使用者: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210125213239374.png) 填寫使用者名稱和密碼,並將角色 `test_role` 賦予該使用者。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210125213636132.png) #### 5.3,使用使用者 使用新建立的使用者登入 Kibana: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210125214121770.png) 該使用者只對 `test_index` 索引有**只讀許可權**;如果進行超越範圍的操作,將發生錯誤。 ### 6,傳輸加密 傳輸加密指的是在資料的傳輸過程中,對資料進行加密(可防止資料被抓包)。 傳輸加密分為**叢集內**加密和**叢集間**加密: - 叢集內加密指的是 ES 叢集內部各節點之間的資料傳輸時的加密。 - 通過 TLS 協議完成。 - 叢集間加密指的是外部客戶訪問 ES 時,資料傳輸的加密。 - 通過 HTTPS 協議完成。 更多的內容可參考[這裡](https://www.elastic.co/guide/en/elasticsearch/reference/current/configuring-tls.html)。 #### 6.1,叢集內部傳輸加密 在 ES 中可以使用 TLS 協議對資料進行加密,需要進行以下步驟: - 建立 CA - 為 ES 節點建立證書和私鑰 - 配置證書 ##### 1,建立 CA 證書 使用如下命令建立 CA: ```shell bin\elasticsearch-certutil ca ``` 成功後,可以看到當前資料夾下多了一個檔案: ```shell elastic-stack-ca.p12 ``` ##### 2,生成證書和私鑰 使用如下命令為 ES 中的節點生成證書和私鑰 ```shell bin\elasticsearch-certutil cert --ca elastic-stack-ca.p12 ``` 成功後,可以看到當前資料夾下多了一個檔案: ```shell elastic-certificates.p12 ``` ##### 3,配置證書 將建立好的證書 `elastic-certificates.p12` 放在 `config/certs` 目錄下。 ##### 4,啟動叢集 ```shell # 啟動第一個節點 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 ``` 不提供證書的節點將無法加入叢集: ```shell 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` 中,如下: ```shell 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: ```shell 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 ``` 在命令列啟動: ```shell 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: ```shell https://localhost:5601/ ``` #### 6.3,配置 Kibana 連結 ES HTTPS ##### 1,為 Kibana 生成 pem 檔案 首先用 `openssl` 為 kibana 生成 pem: ```shell openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out elastic-ca.pem ``` 成功後會生成如下檔案: ```shell elastic-ca.pem ``` 將該檔案放在 `config\certs` 目錄下。 ##### 2,配置 kibana.yml 在 Kibana 的配置檔案 `kibana.yml` 中配置如下引數: ```shell elasticsearch.hosts: ["https://localhost:9200"] elasticsearch.ssl.certificateAuthorities: ["C:\\elasticsearch-7.10.1\\config\\certs\\elastic-ca.pem"] elasticsearch.ssl.verificationMode: certificate ``` ##### 3,執行 Kibana ```shell bin\kibana ``` #### 6.4,配置 Kibana 支援 HTTPS ##### 1,為 Kibana 生成 pem ```shell bin/elasticsearch-certutil ca --pem ``` 上面命令執行成功後會生成如下 **zip** 檔案: ```shell elastic-stack-ca.zip ``` 將該檔案解壓,會有兩個檔案: ```shell ca.crt ca.key ``` 將這兩個檔案放到 Kibana 的配置檔案目錄 `config\certs`。 ##### 2,配置 kibana.yml 在 Kibana 的配置檔案 `kibana.yml` 中配置如下引數: ```shell server.ssl.enabled: true server.ssl.certificate: config\\certs\\ca.crt server.ssl.key: config\\certs\\ca.key ``` ##### 3,執行 Kibana ```shell bin\kibana ``` 啟動成功後,可以通過 HTTPS 協議訪問 Kibana: ```shell https://localhost:5601/ ``` (本節完。) --- **推薦閱讀:** [ElasticSearch 搜尋模板與建議](https://www.cnblogs.com/codeshell/p/14435151.html) [ElasticSearch 聚合分析](https://www.cnblogs.com/codeshell/p/14439579.html) [ElasticSearch 中的 Mapping](https://www.cnblogs.com/codeshell/p/14445420.html) [ElasticSearch 資料建模](https://www.cnblogs.com/codeshell/p/14445450.html) [ElasticSearch 分散式叢集](https://www.cnblogs.com/codeshell/p/14462888.html) --- *歡迎關注作者公眾號,獲取更多技術乾貨。* ![碼農充電站pro](https://img-blog.csdnimg.cn/20200505082843773.png?#pic