Elastic Stack 是 SIEM 系統市場中眾所周知的工具(實際上,不僅僅是它們)。 它可以收集大量不同大小的數據,包括敏感的和不太敏感的數據。 如果對 Elastic Stack 元素本身的存取不受保護,則這種說法並不完全正確。 預設情況下,所有 Elastic 開箱即用元素(Elasticsearch、Logstash、Kibana 和 Beats 收集器)都在開放協定上運行。 在 Kibana 本身中,身份驗證已停用。 所有這些互動都可以受到保護,在本文中我們將告訴您如何做到這一點。 為了方便起見,我們將敘述分成 3 個語意區塊:
- 基於角色的資料存取模型
- Elasticsearch 集群內的資料安全
- 保護 Elasticsearch 集群外部的資料安全
基於角色的資料存取模型
如果您安裝了 Elasticsearch 並且不以任何方式對其進行調整,則所有索引的存取權限都將向所有人開放。 好吧,或者那些可以使用curl的人。 為了避免這種情況,Elasticsearch 有一個角色模型,從基本訂閱(免費)開始即可使用。 從原理上講,它看起來像這樣:
圖片裡是什麼
- 使用者是可以使用其憑證登入的所有人。
- 角色是一組權利。
- 權利是一組特權。
- 權限是指寫入、讀取、刪除等權限。 (
完整的特權列表 ) - 資源是索引、文件、欄位、使用者和其他儲存實體(某些資源的角色模型僅適用於付費訂閱)。
預設情況下Elasticsearch有
要在 Elasticsearch 設定中啟用安全性,您需要將其新增至設定檔(預設為 彈性搜尋/配置/elasticsearch.yml) 新隊:
xpack.security.enabled: true
變更設定檔後,啟動或重新啟動 Elasticsearch 以使變更生效。 下一步是為 Box 使用者分配密碼。 讓我們使用以下命令以互動方式執行此操作:
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
我們檢查:
[elastic@node1 ~]$ curl -u elastic 'node1:9200/_cat/nodes?pretty'
Enter host password for user 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1
您可以拍拍自己了——Elasticsearch 端的設定已經完成。 現在是時候配置 Kibana 了。 如果現在運行它,將會出現錯誤,因此建立密鑰儲存很重要。 這是透過兩個命令完成的(用戶 基巴納 以及在 Elasticsearch 中建立密碼步驟中輸入的密碼):
[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.username
[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.password
如果一切正確,Kibana 將開始要求輸入登入名稱和密碼。 基本訂閱包括基於內部用戶的角色模型。 從 Gold 開始,您可以連接外部身份驗證系統 - LDAP、PKI、Active Directory 和單一登入系統。
對 Elasticsearch 內部物件的存取權限也可能受到限制。 但是,要對文件或欄位執行相同的操作,您將需要付費訂閱(這種奢侈從白金級別開始)。 這些設定可在 Kibana 介面中或透過
創建角色
PUT /_security/role/ruslan_i_ludmila_role
{
"cluster": [],
"indices": [
{
"names": [ "ruslan_i_ludmila" ],
"privileges": ["read", "view_index_metadata"]
}
]
}
創建用戶
POST /_security/user/pushkin
{
"password" : "nataliaonelove",
"roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
"full_name" : "Alexander Pushkin",
"email" : "[email protected]",
"metadata" : {
"hometown" : "Saint-Petersburg"
}
}
Elasticsearch 集群內的資料安全
當 Elasticsearch 在叢集中運行時(這很常見),叢集內的安全設定變得很重要。 為了節點之間的安全通信,Elasticsearch 使用 TLS 協定。 要在它們之間建立安全交互,您需要證書。 我們產生 PEM 格式的憑證和私鑰:
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil ca --pem
執行上面的指令後,在目錄中 /../elasticsearch 將出現存檔 彈性堆疊-ca.zip。 在裡面你會發現一個憑證和一個有副檔名的私鑰 資源管理器 и 關鍵 分別。 建議將它們放在共享資源上,該資源應該可以從叢集中的所有節點存取。
現在,每個節點都需要基於共享目錄中的憑證和私鑰。 執行該命令時,系統會要求您設定密碼。 您可以新增其他選項 -ip 和 -dns 以完成交互節點的驗證。
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key
執行該命令的結果是,我們將收到 PKCS#12 格式的憑證和私鑰,並受密碼保護。 剩下的就是移動產生的文件 p12 到配置目錄:
[elastic@node1 ~]$ mv elasticsearch/elastic-certificates.p12 elasticsearch/config
按以下格式為憑證新增密碼 p12 在每個節點上的金鑰庫和信任庫中:
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
已經知道 彈性搜尋.yml 剩下的就是新增包含憑證資料的行:
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
我們啟動所有 Elasticsearch 節點並執行 捲曲。 如果一切都正確完成,將返回具有多個節點的回應:
[elastic@node1 ~]$ curl node1:9200/_cat/nodes -u elastic:password
172.18.0.3 43 75 4 0.00 0.05 0.05 dim * node2
172.18.0.4 21 75 3 0.00 0.05 0.05 dim - node3
172.18.0.2 39 75 4 0.00 0.05 0.05 dim - node1
還有另一個安全選項 - IP 位址過濾(在黃金級訂閱中可用)。 允許您建立允許您存取節點的 IP 位址白名單。
保護 Elasticsearch 集群外部的資料安全
叢集外部意味著連接外部工具:Kibana、Logstash、Beats 或其他外部客戶端。
若要設定對 https(而不是 http)的支持,請在 elasticsearch.yml 中新增一行:
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: elastic-certificates.p12
xpack.security.http.ssl.truststore.path: elastic-certificates.p12
因為此憑證受密碼保護,將其新增至每個節點上的金鑰庫和信任庫:
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password
新增金鑰後,Elasticsearch 節點就可以透過 https 進行連線。 現在它們可以啟動了。
下一步是建立連接 Kibana 的金鑰並將其新增至組態。 根據共用目錄中已存在的證書,我們將產生 PEM 格式的證書(PKCS#12 Kibana、Logstash 和 Beats 尚不支援):
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key --pem
剩下的就是將創建的密鑰解壓縮到具有 Kibana 配置的資料夾中:
[elastic@node1 ~]$ unzip elasticsearch/certificate-bundle.zip -d kibana/config
密鑰就在那裡,所以剩下的就是更改 Kibana 配置,以便它開始使用它們。 在 kibana.yml 設定檔中,將 http 變更為 https 並新增包含 SSL 連線設定的行。 最後三行配置使用者瀏覽器和 Kibana 之間的安全通訊。
elasticsearch.hosts: ["https://${HOSTNAME}:9200"]
elasticsearch.ssl.certificateAuthorities: /shared_folder/ca/ca.crt
elasticsearch.ssl.verificationMode: certificate
server.ssl.enabled: true
server.ssl.key: /../kibana/config/instance/instance.key
server.ssl.certificate: /../kibana/config/instance/instance.crt
至此,設定完成,對Elasticsearch集群中的資料存取進行了加密。
如果您對 Elastic Stack 在免費或付費訂閱、監控任務或建立 SIEM 系統方面的功能有疑問,請向
我們關於 Habré 上的 Elastic Stack 的更多文章: