這篇文章將提到怎麼透過啟用加密傳輸,讓 Elasticsearch 的資料更安全,以及 Elasticsearch 在使用加密傳輸的重要性和需要注意的地方。
在 Elasticsearch Cluster 不同的節點之間,如果沒有進行加密溝通的情況下,這時候,可能在有一天檢查節點的時候會發現,原來這是一個間諜節點,而且正在監看我們之間傳輸的訊息,原因很單純就是沒有認證所以想加入就可以加入。
加入方法也很簡單就是透過 TLS 進行資料傳輸,每個節點都需要安裝 CA 憑證,節點加入會分成三種情境
產生方法只要是符合 X.509 規格的方法都可以,也可以使用 Elasticsearch 提供的 elasticsearch-certutil
bin/elasticsearch-certutil ca
elastic-stack-ca.p12
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
進行設定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"
}
}
在 Elasticsearch Cluster 跟外部的溝通預設也是沒有提供加密傳輸的,所以只要是有能力攔截封包,就可以直接得到敏感資料,所以針對以下也需要進行設定:
啟用加密傳輸的設定也不難,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