Elasticsearch 加密傳輸指南 啟用 TLS/SSL 加密,全面保障 Elasticsearch 叢集內外部資料傳輸安全

me
林彥成
2020-09-14 | 3 min.
文章目錄
  1. 1. 如何啟用 Elasticsearch TLS 加密傳輸?
  2. 2. Inside an Elasticsearch Cluster
  3. 3. Outside an Elasticsearch Cluster
  4. 4. FAQ:Elasticsearch 加密傳輸常見問題
    1. 4.1. Q1:使用 elasticsearch-certutil 產生的 .p12 與 .pem 憑證有什麼差別?
    2. 4.2. Q2:啟用全站 HTTPS 加密傳輸會顯著影響 Elasticsearch 的查詢效能嗎?
    3. 4.3. Q3:如果我的憑證過期了,叢集會停止運作嗎?
  5. 5. Elasticsearch 加密傳輸重點整理

如何啟用 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
2
3
4
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

IP/hostname 黑/白名單設定

  • 可以在 elasticsearch.yml 進行設定
  • 打 API 進行規則新增
1
2
3
4
5
6
7
8
9
10
11
xpack.security.transport.filter.allow: localhost
xpack.security.transport.filter.deny: '*.google.com'
xpack.security.http.filter.allow: 140.116.250.3
xpack.security.http.filter.deny: all

PUT /_cluster/settings
{
"persistent" : {
"xpack.security.transport.filter.allow" : "172.16.0.0/24"
}
}

Outside an Elasticsearch Cluster

在 Elasticsearch Cluster 跟外部的溝通預設也是沒有提供加密傳輸的,所以只要是有能力攔截封包,就可以直接得到敏感資料,所以針對以下也需要進行設定:

  • Kibana
  • Beats
  • Logstash
  • Elastic Client

啟用加密傳輸的設定也不難,client 是啟用 SSL 一樣都是找到配置檔設定啟用,然後把憑證的位置放好設定對即可,需要注意的是只要設定啟用後,就只能唯一使用加密傳輸,全部的 client 都要進行相關設定,不然就無法使用,如果是用工具產生出來的 PKCS#12 就內建 truststore 跟 keystore,路徑填一樣就可以了。

1
2
3
4
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

Elasticsearch 設定啟用 https 後,首先 kibana 需要進行相關設定,但目前不支援 PKCS#12 keystore 所以要用 crt 檔,相關指令如下

bin/elasticsearch-certutil cert --ca /path/to/your/ca --pem

首先先啟用 elasticsearch 跟 kibana 之間的加密傳輸,kibana.yml 設定如下

1
2
elasticsearch.hosts: ["https://<your_elasticsearch_host>:9200"]
elasticsearch.ssl.certificateAuthorities: /path/to/your/ca.crt

然後是啟用 kibana 跟瀏覽器之間的加密傳輸

1
2
3
server.ssl.enabled: true
server.ssl.key: /path/to/your/key
server.ssl.certificate: /path/to/your/crt

接著是 Logstash 和 Beats 的部分,沒有跟瀏覽器溝通的介面所以只需要設定一次就好,Logstash 跟 kibana 一樣也不支援 PKCS#12 keystore 一樣是要產生 PEM 檔,然後改設定。

Logstash

1
2
3
4
5
6
7
output {
elasticsearch {
...
ssl => true
cacert => '/path/to/cert.pem'
}
}

Beats

1
2
3
output.elasticsearch:
hosts: ["https://<your_elasticsearch_host>:9200"]
ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]

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

喜歡這篇文章,請幫忙拍拍手喔 🤣