Elastic Security 加密傳輸 透過啟用加密傳輸讓資料更安全

Lin Yen-Cheng on 2020-09-14 7 min. read

這篇文章將提到怎麼透過啟用加密傳輸,讓 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 然後填上憑證位置

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 進行規則新增
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,路徑填一樣就可以了。

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 設定如下

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

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

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

output {
  elasticsearch {
    ...
    ssl => true
    cacert => '/path/to/cert.pem'
  }
}

Beats

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

Elasticsearch 加密傳輸重點整理

  • Elasticsearch 透過啟用加密傳輸協定可以保護敏感資料
  • Elasticsearch 提供了 certutil tool 可以產生憑證供 Node 間使用
  • Node certificates 是給 Node 間溝通用的
  • IP 黑白名單可以提供多一層防護
  • client 端到 Elasticsearch 也要啟用加密傳輸
  • 不管是 Kibana 到 Elasticsearch 或是到瀏覽器端之間的傳輸都可以加密
  • Logstash 跟 Beats 到 Elasticsearch 的傳輸也要加密
  • 啟用後 Client 就只支援 https

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

share