如何啟用 Elasticsearch TLS 加密傳輸?
啟用 Elasticsearch 加密傳輸 是保護企業敏感資料的核心手段。其實作關鍵在於透過 TLS/SSL 配置 確保叢集內外部的通訊安全。核心步驟包含:1. 憑證生成:利用 elasticsearch-certutil 工具產生 CA 與節點憑證(如 .p12 或 .pem 格式);2. 節點溝通安全:在 elasticsearch.yml 啟用傳輸層加密,防止間諜節點潛入;3. 外部連線防護:為 Kibana、Beats 與 Logstash 設定 HTTPS 連線。透過這套 Elastic Stack 安全 指南,您不僅能防範封包攔截,還能利用 IP 黑白名單強化防禦,確保所有 Client 端與伺服器間的溝通皆在加密保護下運行。
這篇文章將提到怎麼透過啟用加密傳輸,讓 Elasticsearch 的資料更安全,以及 Elasticsearch 在使用加密傳輸的重要性和需要注意的地方。
Inside an Elasticsearch Cluster
在 Elasticsearch Cluster 不同的節點之間,如果沒有進行加密溝通的情況下,這時候,可能在有一天檢查節點的時候會發現,原來這是一個間諜節點,而且正在監看我們之間傳輸的訊息,原因很單純就是沒有認證所以想加入就可以加入。
加入方法也很簡單就是透過 TLS 進行資料傳輸,每個節點都需要安裝 CA 憑證,節點加入會分成三種情境
- Certificate: 只要是用同張 CA 憑證就可以加入
- Full Verification: 憑證相同且伺服器的 hostname 或 IP 也要正確
- 沒有認證: 慘不忍睹?
產生方法只要是符合 X.509 規格的方法都可以,也可以使用 Elasticsearch 提供的 elasticsearch-certutil
bin/elasticsearch-certutil ca- 預設會產生的檔案
elastic-stack-ca.p12- 包含 node certificate, node key, and CA certificate.
bin/elasticsearch-certutil cert --ca /path/to/your/ca- 產生私鑰,產生後要存放好
接著就是設定 elasticsearch.yml 啟用 ssl 然後填上憑證位置
1 | xpack.security.transport.ssl.enabled: true |
IP/hostname 黑/白名單設定
- 可以在
elasticsearch.yml進行設定 - 打 API 進行規則新增
1 | xpack.security.transport.filter.allow: localhost |
Outside an Elasticsearch Cluster
在 Elasticsearch Cluster 跟外部的溝通預設也是沒有提供加密傳輸的,所以只要是有能力攔截封包,就可以直接得到敏感資料,所以針對以下也需要進行設定:
- Kibana
- Beats
- Logstash
- Elastic Client
啟用加密傳輸的設定也不難,client 是啟用 SSL 一樣都是找到配置檔設定啟用,然後把憑證的位置放好設定對即可,需要注意的是只要設定啟用後,就只能唯一使用加密傳輸,全部的 client 都要進行相關設定,不然就無法使用,如果是用工具產生出來的 PKCS#12 就內建 truststore 跟 keystore,路徑填一樣就可以了。
1 | xpack.security.http.ssl.enabled: true |
Elasticsearch 設定啟用 https 後,首先 kibana 需要進行相關設定,但目前不支援 PKCS#12 keystore 所以要用 crt 檔,相關指令如下
bin/elasticsearch-certutil cert --ca /path/to/your/ca --pem
首先先啟用 elasticsearch 跟 kibana 之間的加密傳輸,kibana.yml 設定如下
1 | elasticsearch.hosts: ["https://<your_elasticsearch_host>:9200"] |
然後是啟用 kibana 跟瀏覽器之間的加密傳輸
1 | server.ssl.enabled: true |
接著是 Logstash 和 Beats 的部分,沒有跟瀏覽器溝通的介面所以只需要設定一次就好,Logstash 跟 kibana 一樣也不支援 PKCS#12 keystore 一樣是要產生 PEM 檔,然後改設定。
Logstash
1 | output { |
Beats
1 | output.elasticsearch: |
Client Applications
因為會用不同語言去寫,Elasticsearch 有提供不同的範例,文件如下:
https://www.elastic.co/guide/en/elasticsearch/client/index.html
FAQ:Elasticsearch 加密傳輸常見問題
Q1:使用 elasticsearch-certutil 產生的 .p12 與 .pem 憑證有什麼差別?
A:.p12 (PKCS#12) 是一種二進位格式,通常同時包含私鑰與證書,優點是管理方便,在 Elasticsearch 節點間配置非常直觀。而 .pem 則是 Base64 編碼的文字格式,通用性更高。在 TLS/SSL 配置教學 中,由於 Kibana 或某些特定的客戶端庫可能不支援 .p12,這時就需要產出 .pem 格式來確保相容性。
Q2:啟用全站 HTTPS 加密傳輸會顯著影響 Elasticsearch 的查詢效能嗎?
A:現代處理器大多具備硬體級的 AES 加密加速,因此 Elasticsearch 加密傳輸 對效能的影響通常在 5% 以內,對於大多數業務場景而言幾乎無感。相較於潛在的資料外洩風險與「間諜節點」入侵的威脅,啟用加密是維持 Elastic Stack 安全 的必要投資。
Q3:如果我的憑證過期了,叢集會停止運作嗎?
A:會。一旦憑證過期,節點間的 TLS 握手會失敗,導致叢集無法維持成員關係(Split-brain 或斷開連線)。因此,強烈建議在 憑證生成指南 中設定較長的效能期,或者建立監控機制,在憑證到期前 30 天利用 elasticsearch-certutil 進行輪換更新。
Elasticsearch 加密傳輸重點整理
- Elasticsearch 透過啟用加密傳輸協定可以保護敏感資料
- Elasticsearch 提供了 certutil tool 可以產生憑證供 Node 間使用
- Node certificates 是給 Node 間溝通用的
- IP 黑白名單可以提供多一層防護
- client 端到 Elasticsearch 也要啟用加密傳輸
- 不管是 Kibana 到 Elasticsearch 或是到瀏覽器端之間的傳輸都可以加密
- Logstash 跟 Beats 到 Elasticsearch 的傳輸也要加密
- 啟用後 Client 就只支援 https
喜歡這篇文章,請幫忙拍拍手喔 🤣
