本文翻譯自ElasticSearch官方文檔,原文請見 《Encrypting Communications in Elasticsearch》。
X-pack安全允許你加密來、往在你的ElasticSearch集羣。鏈接安全使用傳輸層安全(TLS/SSL)。
未啓用加密的羣集以純文本發送所有數據,包括密碼,並且無法安裝啓用X-Pack 安全特性許可證(也就是當你安裝白金許可證時,會報500服務器錯誤)。
要啓用加密,需要對集羣中的每個節點執行以下步驟:
- 驗證xpack.security.enabled設置是否爲true,獲取更多的信息查看security-settings。
- 生成私鑰和X.509證書。
- 配置每一個節點:
a.必須:Enable TLS on the transport layer.
b.推薦:Enable TLS on the HTTP layer. - 如果使用ActiveDirectory用戶身份驗證,請加密Elasticearch與ActiveDirectory服務器之間的通信。
- 如果使用LDAP用戶身份驗證,請加密Elasticearch與LDAP服務器之間的通信
有關在彈性堆棧中加密通信的詳細信息,請參閱加密通信。
生成節點證書
TLS需要X.509證書來執行與之通信的應用程序的加密和身份驗證。爲了使節點之間的通信真正安全,必須對證書進行驗證。在Elasticearch羣集中驗證證書真實性的推薦方法是信任簽署證書的證書頒發機構(CA)。通過這樣做,當節點被添加到您的集羣時,它們只需要使用由同一個CA簽名的證書,節點就可以自動加入集羣。此外,建議證書包含與節點的IP地址和DNS名稱相對應的主題替代名稱(SAN),以便可以執行主機名驗證。
爲了簡化爲一個命令行工具ElasticStack生成證書的過程,X-Pack中包含了elasticsearch-certutil。該工具負責生成CA並使用CA簽名證書。elasticsearch-certutil可以通過使用輸入文件交互地或在靜默模式下使用。elasticsearch-certutil工具還支持生成證書籤名請求(CSR),因此可以使用特定於商業或組織的CA對證書進行簽名。例如:
- 可選:爲您的Elasticearch集羣創建一個證書頒發機構。例如,使用elasticsearch-certutil ca命令:
bin/elasticsearch-certutil ca
可以將羣集配置爲信任擁有由此CA簽名的證書的所有節點。該命令輸出一個文件,默認名稱爲elastic-stack-ca.p12。此文件是一個PKCS#12密鑰存儲庫,它包含CA的公共證書和用於爲每個節點簽名證書的私鑰。
elasticsearch-certutil 命令還提示您輸入密碼以保護文件和密鑰。如果將來計劃向羣集添加更多節點,請保留文件的副本並記住其密碼。
-
爲羣集中的每個節點生成證書和私鑰。例如,使用elasticsearch-certutil cert 命令:
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
輸出是單個PKCS#12密鑰存儲庫,其中包括節點證書、節點密鑰和CA證書。還會提示您輸入密碼。您可以爲證書和密鑰輸入密碼,也可以按Enter將密碼保留爲空白。
默認情況下,elasticsearch-certutil 生成沒有主機名信息的證書(也就是說,它們沒有任何主題可選名稱字段)。這意味着您可以對集羣中的每個節點使用證書,但您必須關閉主機名驗證,如下面的配置所示。
如果要在集羣中使用主機名驗證,請爲每個節點運行一次ElasticSearch-certutilcert命令,並提供-name、-dns和-ip選項。
您應該保護輸出文件,因爲它們包含實例的私鑰。
或者,如果您想使用特定於商業或組織的CA,可以使用ElasticSearch-certutil CSR命令爲集羣中的節點生成證書籤名請求(CSR)。有關更多信息,請參見ElasticSearch-certutil。
-
將節點證書複製到適當的位置。
將適用的.p12文件複製到每個節點的Elasticsearch配置目錄中的目錄中。例如,/home/es/config/certs。不需要將CA文件複製到此目錄。
對於要配置的每一個額外的Elastic產品,請將證書複製到相關的配置目錄中。
如果選擇不使用ElasticSearch-certutil,則如果存在擴展密鑰使用擴展,則所獲得的證書必須同時允許clientAuth和serverAuth。證書需要採用PEM或PKCS#12格式。儘管不是必需的,但強烈建議證書包含節點的DNS名稱和/或IP地址,以便可以使用主機名驗證。
加密集羣節點之間的通信
傳輸網絡層用於集羣中節點之間的內部通信。啓用X-Pack安全性時,必須使用TLS來確保節點之間的通信是加密的。
1、生成節點證書。
2、啓用TLS並指定訪問節點證書所需的信息。
如果簽名的證書是PKCS#12格式,請將以下信息添加到每個節點的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
如果您在elasticsearch-certutil cert命令中使用了-dns或-ip選項,並且希望啓用嚴格的主機名檢查,請將驗證模式設置爲full。有關這些值的描述,請參見xPack.ssl.Version_Mode。
如果爲每個節點創建了單獨的證書,則可能需要在每個節點上自定義此路徑。如果文件名與節點名稱匹配,則可以使用certs/${node.name}.p12格式。
elasticsearch-certutil 輸出PKCS#12密鑰存儲庫,其中包含CA證書作爲受信任的證書條目。這允許密鑰庫也用作信任庫。在這種情況下,路徑值應該與keystore.path值匹配。但是,請注意,這不是一般規則。有些密鑰存儲不能用作信任存儲,只有巧盡心思構建的密鑰存儲才能使用。
如果證書的格式是PEM,增加下面的信息到elasticsearch.yml文件在每一個節點上:
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.key: /home/es/config/node01.key
xpack.security.transport.ssl.certificate: /home/es/config/node01.crt
xpack.security.transport.ssl.certificate_authorities: [ "/home/es/config/ca.crt" ]
如果您在elasticsearch-certutil cert命令中使用了-dns或-ip選項,並且希望啓用嚴格的主機名檢查,請將驗證模式設置爲full。有關這些值的描述,請參見xPack.ssl.Version_Mode。
節點密鑰文件的完整路徑。這必須是Elasticsearch配置目錄中的位置。
節點證書的完整路徑。這必須是Elasticsearch配置目錄中的位置。
應該信任的CA證書的路徑數組。這些路徑必須是Elasticsearch配置目錄中的位置。
3、如果使用密碼保護節點的證書,請將密碼添加到您的ElasticSearch密鑰存儲庫中:
如果簽名證書採用PKCS#12格式,請使用以下命令:
bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
如果證書是PEM格式的,請使用以下命令:
bin/elasticsearch-keystore add xpack.security.transport.ssl.secure_key_passphrase
4、重啓ElasticSearch
必須執行完全重新啓動羣集。配置爲使用TLS的節點不能與使用未加密網絡的節點通信(反之亦然)。啓用TLS之後,必須重新啓動所有節點,以維護集羣之間的通信。
所有與TLS相關的節點設置都被認爲是高度敏感的,因此不會通過節點信息API公開有關這些設置的更多信息,請參見安全設置。
ElasticSearch監視配置爲與TLS相關的節點設置值的所有文件,如證書、密鑰存儲庫或信任存儲庫。如果您更新這些文件中的任何一個(例如,當主機名更改或證書到期時),Elasticearch將重新加載它們。文件被輪詢以全局ElasticSearchResoure.reload.Interval.High設置確定的頻率進行更改,該設置默認爲5秒。
加密Http客戶端通信
啓用X-Pack安全性時,您可以選擇使用TLS來確保HTTP客戶端和集羣之間的通信是加密的。
強烈建議在HTTP層上啓用TLS,但不是必需的。如果在Elastic search的HTTP層上啓用TLS,則可能需要在Elastic stack的其他部分和使用的任何ElasticSearch客戶端中進行配置更改。
1、如果尚未這樣做,請生成節點證書。
2、啓用TLS並指定訪問節點證書所需的信息。
2-1如果證書是PKCS#12格式的,那麼將以下信息添加到每個節點的elasticsearch.yml文件中:
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
如果爲每個節點創建了單獨的證書,則可能需要在每個節點上自定義此路徑。如果文件名與節點名稱匹配,則可以使用certs/${node.name}.p12格式。
ElasticSearch-certutil輸出包括PKCS#12密鑰庫中的CA證書,因此密鑰庫也可以用作信任庫。此名稱應與keystore.path值匹配。
2-2如果證書是PEM格式,則將以下信息添加到每個節點的elasticsearch.yml文件中:
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: /home/es/config/node01.key
xpack.security.http.ssl.certificate: /home/es/config/node01.crt
xpack.security.http.ssl.certificate_authorities: [ "/home/es/config/ca.crt" ]
節點密鑰文件的完整路徑。這必須是Elasticsearch配置目錄中的位置。
節點證書的完整路徑。這必須是Elasticsearch配置目錄中的位置。
應該信任的CA證書的路徑數組。這些路徑必須是Elasticsearch配置目錄中的位置。
3、如果使用密碼保護節點的證書,請將密碼添加到您的ElasticSearch密鑰存儲庫中:
如果簽名證書採用PKCS#12格式,請使用以下命令:
bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password
如果證書是PEM格式的,請使用以下命令:
bin/elasticsearch-keystore add xpack.security.http.ssl.secure_key_passphrase
4、重新啓動ELastic。
必須執行完全重新啓動羣集。配置爲使用TLS的節點不能與使用未加密網絡的節點通信(反之亦然)。啓用TLS之後,必須重新啓動所有節點,以維護集羣之間的通信。
所有與TLS相關的節點設置都被認爲是高度敏感的,因此不會通過節點信息API公開有關這些設置的更多信息,請參見安全設置。
ElasticSearch監視配置爲與TLS相關的節點設置值的所有文件,如證書、密鑰存儲庫或信任存儲庫。如果您更新這些文件中的任何一個(例如,當主機名更改或證書到期時),Elasticearch將重新加載它們。文件被輪詢以全局ElasticSearchResoure.reload.Interval.High設置確定的頻率進行更改,該設置默認爲5秒。
注意:官方文檔不止於此,還包括Encrypting communications between Elasticsearch and Active Directory等內容,由於未用到,暫時不做翻譯。