這篇文章將提到怎麼透過啟用加密傳輸,讓 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
Elasticsearch 加密傳輸重點整理
- Elasticsearch 透過啟用加密傳輸協定可以保護敏感資料
- Elasticsearch 提供了 certutil tool 可以產生憑證供 Node 間使用
- Node certificates 是給 Node 間溝通用的
- IP 黑白名單可以提供多一層防護
- client 端到 Elasticsearch 也要啟用加密傳輸
- 不管是 Kibana 到 Elasticsearch 或是到瀏覽器端之間的傳輸都可以加密
- Logstash 跟 Beats 到 Elasticsearch 的傳輸也要加密
- 啟用後 Client 就只支援 https
喜歡這篇文章,請幫忙拍拍手喔 🤣