1 x-pack介紹
1.1 功能介紹
官網介紹:https://www.elastic.co/guide/en/kibana/6.2/setup-xpack-kb.html
x-pack是elasticsearch的一個擴展包,將安全,警告,監視,圖形和報告功能捆綁在一個易於安裝的軟件包中,可以輕松的啟用或者關閉一些功能。默認我們的elk部署后,可以直接就進入web管理界面,這樣會帶來極大的安全隱患。
1.2 功能分類
x-pack的基本功能可列舉如下:
1.21 用戶管理
x-pack安裝之后有一個超級用戶elastic ,擁有對所有索引和數據的控制權,可以使用該用戶創建和修改其他用戶,當然這里可以通過kibana的web界面進行用戶和用戶組的管理。
如下:wyy這個用戶就是通過elastic超級用戶創建的,是個只讀的。這里可以在web上修改
終端修改用戶名和密碼方式:
#修改elastic: curl -XPUT -u elastic:elastic123 'http://10.10.16.253:9200/_xpack/security/elastic/_password' -d {"password":"123456"} #修改kibana curl -XPUT -u elastic:elastic123 'http://10.10.16.253:9200/_xpack/security/kibana/_password' -d {"password":"123456"}
1.22 保護級別
如何提高Elasticsearch應用的安全性,是開發者面臨的重要問題。Elasticsearch X-Pack中的安全組件提供了對應的安全解決方案,讓IT和應用團隊能夠依賴 X-Pack 來區分和管理正常用戶和惡意入侵者。
x-pack提供以下幾個級別保護elastic集群:
● 用戶登錄身份驗證:安裝完x-pack,登錄elasticsearch和kibana會讓你輸入密碼
● 授權和基於角色的訪問控制:允許哪些用戶對哪些索引具有不同的操作權限
● 節點/客戶端認證和信道加密:x-pack的elk之間的數據傳遞保護:logstash.yaml
● 審計:啟動審核以跟蹤與你的elasticsearch集群的嘗試與成功的交互:xpack.security.audit.enabled: true
1.23 監控功能
使用xpack監控組件能夠通過kibana輕松監控elasticsearch。還可以實時查看集群運行狀況和性能,以及分析過去的集群,索引和節點指標。包括kibana本身的性能。
另外,我們可以配置監控的索引:通過elasticsearch.yml文件,如圖:
可以在前面上+或-來顯示包含或排除索引名稱和模式。如:+ text *, - test3。
1.24 alert功能
#官網詳細內容參考:https://www.elastic.co/guide/en/x-pack/current/xpack-alerting.html
當watch被觸發的時候,數據將會被加載到執行的context中,watch支持以下四種輸入:
Simple:加載靜態的數據到execution context中
Search:加載搜索的結果到execution context中
Http:將Http請求的結果加載到execution context中
chain:使用一系列輸入將數據加載到execution context中
每個watch必須有一個觸發器觸發watch的執行開始,watch旨在支持不同類型的的觸發器,但只有基於時間戳的計划觸發器目前可用,watch提供了以下幾種類型的時間過濾器
Hourly
Daily
Weekly
Monthly
Yearly
Cron
Interval
1.25 graph功能
#官網詳細介紹:https://www.elastic.co/guide/en/x-pack/current/graph-getting-started.html
X-Pack圖的能力使你發現一個Elasticsearch索引項是如何相關聯的。你可以探索索引條款之間的連接,看看哪些連接是最有意義的。從欺詐檢測到推薦引擎,對各種應用中這都是有用的,例如,圖的探索可以幫助你發現網站上黑客的目標的漏洞,所以你可以硬化你的網站。或者,您可以為您的電子商務客戶提供基於圖表的個性化推薦。X-pack提供簡單,但功能強大的圖形開發API,和Kibana交互式圖形可視化工具。使用X-pack圖有工作與開銷與現有Elasticsearch指標你不需要任何額外的數據存儲的特征。
1.3 功能使用
默認情況下,所有的x-pack功能都已開啟,可以在elasticsearch.yml,kibana.yml,logstash.yml配置文件中啟用或禁用特定的x-pack功能。
#設置 #描述
xpack.graph.enabled #設置為false以禁用X-Pack圖形功能。
xpack.ml.enabled #設置為false以禁用X-Pack機器學習功能。
xpack.monitoring.enabled #設置為false以禁用X-Pack監視功能。
xpack.reporting.enabled #設置為false以禁用X-Pack報告功能。
xpack.security.enabled #設置為false以禁用X-Pack安全功能。
xpack.watcher.enabled #設置為false以禁用Watcher。
功能名稱 |
文件配置格式 |
適用組件 |
圖形展示 |
xpack.graph.enabled |
只適用kibana組件 |
報表統計 |
xpack.reporting.enabled |
只適用於kibana組件 |
報警通知 |
xpack.watcher.enabled |
只適用於elasticsearch組件 |
安全認證 |
xpack.security.enabled |
適用於elk的三個組件 |
監控跟蹤 |
xpack.monitoring.enabled |
適用於elk的三個組件 |
設備資源分配 |
xpack.ml.enabled |
適用於elasticsearch和kibana |
2 x-pack安裝
安裝好x-pack時,默認會有30天的使用許可證,試用期結束后會無法訪問,此時就需要到官網去申請一年的免費license。
2.1 x-pack破解
用破解的x-pack-6.5.4.jar替換/home/elasticsearch/plugins/x-pack/目錄中原有的x-pack-6.5.4.jar包。新版默認安裝好x-pack,這里我們需要單獨把x-pack6.5.4.jar拿出來。
cd /home/soft/ cp /home/elasticsearch/modules/x-pack-core/x-pack-core-6.5.4.jar ./ jar -xvf x-pack-core-6.5.4.jar #解壓jar包 rm -f x-pack-core-6.5.4.jar #移除舊的jar
找到org/elasticsearch/license/LicenseVerifier.class,可使用Luyten反編譯工具(https://github.com/deathmarine/Luyten/releases )打開,並拷貝內容到新建的文件LicenseVerifier.java中,文件內容如下:

package org.elasticsearch.license; import java.nio.*; import org.elasticsearch.common.bytes.*; import java.util.*; import java.security.*; import org.elasticsearch.common.xcontent.*; import org.apache.lucene.util.*; import org.elasticsearch.core.internal.io.*; import java.io.*; public class LicenseVerifier { public static boolean verifyLicense(final License license, final byte[] encryptedPublicKeyData) { return true; } public static boolean verifyLicense(final License license) { return true; } }
找到org/elasticsearch/xpack/core/XPackBuild.class,可使用Luyten反編譯工具打開,並拷貝內容到新建的文件XPackBuild.java中,文件內容如下:

package org.elasticsearch.xpack.core; import org.elasticsearch.common.io.*; import java.net.*; import org.elasticsearch.common.*; import java.nio.file.*; import java.io.*; import java.util.jar.*; public class XPackBuild { public static final XPackBuild CURRENT; private String shortHash; private String date; @SuppressForbidden(reason = "looks up path of xpack.jar directly") static Path getElasticsearchCodebase() { final URL url = XPackBuild.class.getProtectionDomain().getCodeSource().getLocation(); try { return PathUtils.get(url.toURI()); } catch (URISyntaxException bogus) { throw new RuntimeException(bogus); } } XPackBuild(final String shortHash, final String date) { this.shortHash = shortHash; this.date = date; } public String shortHash() { return this.shortHash; } public String date() { return this.date; } static { final Path path = getElasticsearchCodebase(); String shortHash = null; String date = null; Label_0157: { shortHash = "Unknown"; date = "Unknown"; } CURRENT = new XPackBuild(shortHash, date); } }
編譯修好后的Java文件
javac -cp "/home/elasticsearch/modules/x-pack-core/x-pack-core-6.5.4.jar:/home/elasticsearch/lib/*" LicenseVerifier.java javac -cp "/home/elasticsearch/modules/x-pack-core/x-pack-core-6.5.4.jar:/home/elasticsearch/lib/*" XPackBuild.java
重新打jar包:
jar -cvf x-pack-core-6.5.4.jar ./*
覆蓋原來的x-pack的jar,建議將之前備份
mv x-pack-core-6.5.4.jar /home/elasticsearch/modules/x-pack-core/x-pack-core-6.5.4.jar
修改/home/elasticsearch/config/elasticsearch.yml,開啟x-apck認證

cluster.name: ELK-Cluster #ELK的集群名稱,名稱相同即屬於是同一個集群 node.name: elk-node1 #本機在集群內的節點名稱 path.data: /home/elasticsearch/data #數據保存目錄 path.logs: /home/elasticsearch/logs #日志保存目 network.host: 0.0.0.0 #監聽IP http.port: 9200 node.data: true #是否是數據節點 node.ingest: true #關閉即可 node.master: true #是否是主節點,不定義的話先啟動的是主節點 node.max_local_storage_nodes: 1 #最大存儲節點 bootstrap.memory_lock: false #服務啟動的時候鎖定足夠的內存,防止數據寫入swap bootstrap.system_call_filter: false ###head插件相關### http.cors.enabled: true http.cors.allow-origin: "*" #http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type ####head插件相關#### #節點ip,節點之間要允許ping和9300端口通信 transport.tcp.port: 9300 discovery.zen.ping.unicast.hosts: ["10.10.16.213", "10.10.16.214"] xpack.security.enabled: false #建議上傳證書之前改為false xpack.security.transport.ssl.enabled: false #建議上傳證書之前改為false
#重啟elasticsearch,建議先關閉kibana和logstash,先啟動node2,注意切換普通用戶。
2.2 更新許可證
去官網申請免費的license,會發郵件給你提供下載地址,將下載下來的文件重命名為license.json。https://license.elastic.co/registration #官網申請basic授權文件
我這里將下載下來的json文件放到/tmp目錄下
授權文件修改:
首先將wyy-wyy-d7c273a8-699d-4db2-8406-6ae8f8abbe65-v5.json給改為license.json
時間戳時間轉換:https://tool.lu/timestamp

{ "license":{ "uid":"d7c273a8-699d-4db2-8406-6ae8f8abbe65", "type":"platinum", //修改為白金版 "issue_date_in_millis":1547078400000, "expiry_date_in_millis":2855980923000, //修改到期時間為2060-07-02 "max_nodes":100, //修改最大節點數 "issued_to":"wyy wyy (pharmacodia)", "issuer":"Web Form", "signature":"AAAAAwAAAA1Q7pVrfhlxhVwk+PjKAAABmC9ZN0hjZDBGYnVyRXpCOW5Bb3FjZDAxOWpSbTVoMVZwUzRxVk1PSmkxaktJRVl5MUYvUWh3bHZVUTllbXNPbzBUemtnbWpBbmlWRmRZb25KNFlBR2x0TXc2K2p1Y1VtMG1UQU9TRGZVSGRwaEJGUjE3bXd3LzRqZ05iLzRteWFNekdxRGpIYlFwYkJiNUs0U1hTVlJKNVlXekMrSlVUdFIvV0FNeWdOYnlESDc3MWhlY3hSQmdKSjJ2ZTcvYlBFOHhPQlV3ZHdDQ0tHcG5uOElCaDJ4K1hob29xSG85N0kvTWV3THhlQk9NL01VMFRjNDZpZEVXeUtUMXIyMlIveFpJUkk2WUdveEZaME9XWitGUi9WNTZVQW1FMG1DenhZU0ZmeXlZakVEMjZFT2NvOWxpZGlqVmlHNC8rWVVUYzMwRGVySHpIdURzKzFiRDl4TmM1TUp2VTBOUlJZUlAyV0ZVL2kvVk10L0NsbXNFYVZwT3NSU082dFNNa2prQ0ZsclZ4NTltbU1CVE5lR09Bck93V2J1Y3c9PQAAAQB1Qa/KQHbjfBkfIh4FlOXsOOZIxcBkw8PPX9u7SrSOwL/LpKxuAlM9/oulDW4WZGzH5psGK7f/RDBatAQ8kiQrFQZ2B97PJmfvxoUrptXT4kzYpdkd+iAlTAyy2gkyI19QVAI5c/seVp0ERq3Rhv/l8Qx6HnMcafXTlheEoRceh3Oz88Qv3kaYwvb+R8d0WreFoaxxaqJuVAN6JFNfQr7h9Ra2ViB8yOzF0PXmmCvT5yER1UH1tDGAvfAIV7E7oGV0srf/uCEv5bD7FMUdun+aF4VApEtRoK10XLKW48qyo5+dhhEbKr2IGwAWXUM6l3FJCtZGFbKw3YX83zXz2hDi", "start_date_in_millis":1547078400000 } }
2.3 導入授權文件
通過API接口上傳:如果提前設置好了用戶名密碼需要加上-u參數:-u elastic:elastic123
curl -XPUT 'http://10.10.16.213:9200/_xpack/license' -H "Content-Type: application/json" -d @/tmp/license.json #注意標點符號為英文 {"acknowledged":true,"license_status":"valid"} #返回valid,表示已生效
http://10.10.16.213:9200/_xpack/license
Head訪問方式:http://localhost:9100/?base_uri=http://localhost:9200&auth_user=elastic&auth_password=elastic123
#如下圖,但是這樣容易暴露用戶名和密碼,后面再探索可行方案
2.4 elasticsearch添加認證
設置驗證密碼:進入elasticsearch/bin/x-pack,建議停掉所有節點的es服務和kibana
修改elasticsearch.yml,將xpack.security打開
./setup-passwords interactive #手動,也可選擇auto
#也可進入/home/elasticsearch/bin,./elasticsearch-setup-passwords interactive #兩種方式一樣
會對elasticsearch、logstash、kibana分別設置登錄密碼(默認es用戶名為elastic,logstash用戶名為logstash_system,kibana用戶名為kibana)
2.5 kibana添加認證
修改kibana.yml
重啟kibana,登錄:http://10.10.16.213:5601
使用之前設置好的用戶名個密碼登錄:elastic elastic123,登錄之后可以發現kibana界面多了很多功能,如圖:
3 x-pack操作手冊
這里我們主要了解一下x-pack提供的user和roles權限控制,如圖展示的是security-roles:

現總結如下: ingest_admin:授予訪問權限以管理所有索引模板和所有攝取管道配置。這個角色不能提供創建索引的能力; 這些特權必須在一個單獨的角色中定義。 kibana_dashboard_only_user:授予對Kibana儀表板的訪問權限以及對.kibana索引的只讀權限。 這個角色無法訪問Kibana中的編輯工具。 kibana_system:授予Kibana系統用戶讀取和寫入Kibana索引所需的訪問權限,管理索引模板並檢查Elasticsearch集群的可用性。 此角色授予對.monitoring- 索引的讀取訪問權限以及對.reporting- 索引的讀取和寫入訪問權限。 kibana_user:授予Kibana用戶所需的最低權限。 此角色授予訪問集群的Kibana索引和授予監視權限 kibana_admin:授予訪問用於管理配置的.logstash *索引的權限。 logstash_system:授予Logstash系統用戶所需的訪問權限,以將系統級別的數據(如監視)發送給Elasticsearch。不應將此角色分配給用戶,因為授予的權限可能會在不同版本之間發生變化。此角色不提供對logstash索引的訪問權限,不適合在Logstash管道中使用。 machine_learning_admin:授予manage_ml群集權限並讀取.ml- *索引的訪問權限。 monitoring_user:授予除使用Kibana所需的X-Pack監視用戶以外的任何用戶所需的最低權限。 這個角色允許訪問監控指標。 監控用戶也應該分配kibana_user角色 remote_monitoring_agent:授予遠程監視代理程序將數據寫入此群集所需的最低權限 reporting_user:授予使用Kibana所需的X-Pack報告用戶所需的特定權限。 transport_client:通過Java傳輸客戶端授予訪問集群所需的權限。 watcher_admin:授予對.watches索引的寫入權限,讀取對監視歷史記錄的訪問權限和觸發的監視索引,並允許執行所有監視器操作 watcher_user:授予讀取.watches索引,獲取觀看動作和觀察者統計信息的權限
cluster權限,即可以分配給roles的權限

all:所有集群管理操作,如快照,節點關閉/重新啟動,設置更新,重新路由或管理用戶和角色 monitor:所有集群只讀操作,如集群運行狀況,熱線程,節點信息,節點和集群統計信息,快照/恢復狀態,等待集群任務 monitor_ml: 所有只讀機器學習操作,例如獲取有關數據傳輸,作業,模型快照或結果的信息 monitor_watcher: 所有只讀操作,例如獲取watch和watcher統計信息 manage:構建monitor並添加更改集群中值的集群操作。這包括快照,更新設置和重新路由。此特權不包括管理安全性的能力 manage_index_templates:索引模板上的所有操作 manage_ml:所有機器學習操作,例如創建和刪除數據傳輸,作業和模型快照。數據處理以具有提升特權的系統用戶身份運行,包括讀取所有索引的權限 manage_security:所有與安全相關的操作,例如對用戶和角色的CRUD操作以及緩存清除 manage_watcher:所有觀察者操作,例如放置watches,執行,激活或確認。Watches作為具有提升特權的系統用戶運行,包括讀取和寫入所有索引的權限。Watches作為具有提升特權的系統用戶運行,包括讀取和寫入所有索引的權限
indices權限:
all 索引上的任何操作
monitor 監控所需的所有操作(恢復,細分信息,索引統計信息和狀態)
manage 所有monitor特權加索引管理(別名,分析,緩存清除,關閉,刪除,存在,刷新,映射,打開,強制合並,刷新,設置,搜索分片,模板,驗證)
view_index_metadata 對索引元數據(別名,別名存在,獲取索引,存在,字段映射,映射,搜索分片,類型存在,驗證,warmers,設置)進行只讀訪問。此特權主要供Kibana用戶使用
read 只讀操作(計數,解釋,獲取,mget,獲取索引腳本,更多像這樣,多滲透/搜索/ termvector,滲透,滾動,clear_scroll,搜索,建議,tv)
read_cross_cluster 只讀訪問來自遠程集群的搜索操作
index 索引和更新文件。還授予對更新映射操作的訪問權限
create 索引文件。還授予對更新映射操作的訪問權限
delete 刪除文件
write 對文檔執行所有寫入操作的權限,包括索引,更新和刪除文檔以及執行批量操作的權限。還授予對更新映射操作的訪問權限
delete_index 刪除索引
create_index 創建索引。創建索引請求可能包含在創建索引時添加到索引的別名。在這種情況下,該請求最好有manage權限,同時設置索引和別名
3.1 基於角色的權限控制
進入到web,找到Management/Security/ Roles,點擊Create role
可以使這個roles關聯給多個用戶使用:
以上是創建了一個role權限只對索引data141擁有只讀權限,下面創建普通用戶wyy
可以對這個用戶關聯多個roles。至此創建了一個wyy的用戶,只擁有一個read-only的權限,下面驗證是否生效
3.2 登錄驗證
發現其他的模塊,還有索引都不能查看