<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Elasticsearch 腳本安全使用指南

          共 7345字,需瀏覽 15分鐘

           ·

          2021-11-19 21:28

          1、關(guān)于 Elasticsearch 腳本實戰(zhàn)問題

          最近星球群里討論了腳本的使用。

          當(dāng)看到復(fù)雜腳本的時候,我的第一反應(yīng)是:
          • 類似復(fù)雜查詢要搞這么復(fù)雜嗎?
          • 能否前置讓 ingest 預(yù)處理多花時間,哪怕加個字段?
          • Elasticsearch 更擅長的是檢索,能否讓他專注干更擅長的事?
          • 預(yù)處理或者寫入前的 ETL 能否解決類似問題?

          那么問題來了。

          • Elasticsearch 腳本有沒有替代方案?
          • 如何在 Elasticsearch 端限制腳本的使用?
          • 我們可以控制 Elasticsearch 腳本的使用嗎?

          帶著這些疑問,本文展開講解。

          2、Elasticsearch 腳本演變史

          版本使用腳本類型
          < Elasticsearch 1.4MVEL 腳本
          < Elasticsearch 5.0Groovy 腳本
          >= Elasticsearch 5.0painless 腳本

          Groovy 的出現(xiàn)是解決MVEL的安全隱患問題;但Groovy仍存在內(nèi)存泄露+安全漏洞問題。

          painless 腳本的官宣時間:2016年9月21日。

          正如其名字:無痛。painless 的出現(xiàn)是為了用戶更方便、高效的使用腳本。

          https://www.elastic.co/cn/blog/painless-a-new-scripting-language

          Painless 是一種簡單,安全的腳本語言,專為與 Elasticsearch 一起使用而設(shè)計。它是 Elasticsearch 的默認腳本語言,可以安全地用于內(nèi)聯(lián)(inline)和存儲(stored)腳本。

          關(guān)于 inline 和 stored 的區(qū)別,后面會講解。

          Painless特點:

          • 性能牛逼:Painless腳本運行速度比備選方案(包括Groovy)快幾倍。
          • 安全性強:使用白名單來限制函數(shù)與字段的訪問,避免了可能的安全隱患。
          • 可選輸入:變量和參數(shù)可以使用顯式類型或動態(tài) def 類型。
          • 上手容易:擴展了java 的基本語法,并兼容 groove 風(fēng)格的腳本語言特性。
          • 特定優(yōu)化:是 ES 官方專為 Elasticsearch 腳本編寫而設(shè)計。

          3、Elasticsearch 使用腳本可能帶來的問題?

          3.1 語法相對晦澀,實現(xiàn)起來不是特別便捷

          從 Elastic 中文社區(qū)、各個微信群、QQ群的技術(shù)交流可見一斑,幾乎隔幾天就會有“腳本語法如何使用?”的問題拋出來。

          3.2 可能帶來性能問題

          Elasticsearch 腳本會給集群帶來沉重的負擔(dān),編寫腳本往往僅考慮功能實現(xiàn)層面,而極大可能會忽略或者忘記考慮到它可能需要的資源。

          4、Elasticsearch 腳本替換方案

          直接上替換方案——空間換時間,在寫入前將相關(guān)數(shù)據(jù)盡可能使用 Ingest 管道完成“ETL”抽取、轉(zhuǎn)換、加載“清洗”工作。

          這時候讀者不免有讀者會問:“上來就提方案,你的方案依據(jù)是什么?空間換時間僅是你的一家之言,你有什么資格提方案?”

          其實這是企業(yè)內(nèi)部討論方案經(jīng)常被問到的問題,實際說辭可能會比這要委婉一些。

          首先:實踐和咨詢經(jīng)驗的總結(jié)。

          其次,官方文檔有詳細闡述,可以參考如下,為了更精準說明,我保留了英文原文。

          • If possible, avoid using?script-based sorting, scripts in aggregations, and the?script_score?query.

          • Scripts are incredibly useful, but can’t use Elasticsearch’s index structures or related optimizations. This relationship can sometimes result in slower search speeds.

          • If you often use scripts to transform indexed data, you can make search faster by transforming data during ingest instead.

          英文釋義解讀如下:

          • 第一:如果可能,避免使用腳本進行排序、聚合、script_score 類型檢索操作。

          • 第二:腳本非常有用,但不能使用 Elasticsearch 的索引結(jié)構(gòu)或相關(guān)優(yōu)化。這有時會導(dǎo)致搜索速度變慢。

          • 第三:如果你經(jīng)常使用腳本來轉(zhuǎn)換索引數(shù)據(jù),則可以通過在 Ingest 數(shù)據(jù)預(yù)處理階段轉(zhuǎn)換數(shù)據(jù)來加快搜索速度。

          三條解釋,清晰明了。

          https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html

          https://www.elastic.co/guide/en/elasticsearch/reference/current/scripts-and-search-speed.html

          這里要分為幾種情況:

          第一:java 或者 python 客戶端直連 Elasticsearch。

          借助 Ingest pipeline 可以實現(xiàn)寫入數(shù)據(jù)的預(yù)處理。

          第二:Beats 直連 Elasticsearch。

          借助 Ingest??pipeline 可以實現(xiàn)寫入數(shù)據(jù)的預(yù)處理。

          Beats 端輸出到 Elasticsearch 配置 pipeline 參考:

          output.elasticsearch:
          hosts:?["localhost:9200"]
          pipeline:?my-pipeline

          第三:logstash 直連 Elasticsearch。

          借助?Ingest??pipeline 或者 logstash filter 可以實現(xiàn)數(shù)據(jù)預(yù)處理。

          那,到底什么是空間換時間呢?

          舉個栗子進一步解釋一把:

          以最易理解的學(xué)生成績表為例,要統(tǒng)計每個學(xué)生的成績總和,并要求按照成績之和排序。

          DELETE?my_test_scores

          #?創(chuàng)建索引并指定?Mapping
          PUT?my_test_scores
          {
          ??"mappings":?{
          ????"properties":?{
          ??????"name":?{
          ????????"type":?"keyword"
          ??????},
          ??????"english_score":?{
          ????????"type":?"integer"
          ??????},
          ??????"math_score":?{
          ????????"type":?"integer"
          ??????}
          ????}
          ??}
          }
          #?寫入數(shù)據(jù)
          POST?my_test_scores/_bulk
          {"index":{"_id":1}}
          {"name":"xiaoming","english_score":95,"math_score":85}
          {"index":{"_id":2}}
          {"name":"xiaowang","english_score":75,"math_score":95}
          {"index":{"_id":3}}
          {"name":"xiaozhang","english_score":94,"math_score":81}

          #?按照兩門課程成績之和召回排序結(jié)果
          GET?/my_test_scores/_search
          {
          ??"sort":?[
          ????{
          ??????"_script":?{
          ????????"type":?"number",
          ????????"script":?{
          ??????????"source":?"doc['math_score'].value?+?doc['english_score'].value"
          ????????},
          ????????"order":?"desc"
          ??????}
          ????}
          ??]
          }
          #?不用腳本如何搞?
          #?更新?Mapping
          PUT?/my_test_scores/_mapping
          {
          ??"properties":?{
          ????"total_score":?{
          ??????"type":?"long"
          ????}
          ??}
          }
          #?寫入之前管道預(yù)處理:兩門課程之和字段生成
          PUT?_ingest/pipeline/sum_score_pipeline
          {
          ??"description":?"Calculates?the?total?test?score",
          ??"processors":?[
          ????{
          ??????"script":?{
          ????????"source":?"ctx.total_score?=?(ctx.math_score?+?ctx.english_score)"
          ??????}
          ????}
          ??]
          }
          #?數(shù)據(jù)遷移
          POST?_reindex
          {
          ??"source":?{
          ????"index":?"my_test_scores"
          ??},
          ??"dest":?{
          ????"index":?"my_test_scores_ext",
          ????"pipeline":?"sum_score_pipeline"
          ??}
          }
          GET?my_test_scores_ext/_search
          #?重新獲取排序結(jié)果數(shù)據(jù)
          GET?/my_test_scores_ext/_search
          {
          ??"sort":?[
          ????{
          ??????"total_score":?{
          ????????"order":?"desc"
          ??????}
          ????}
          ??]
          }

          如上的示例前半部分使用腳本處理實現(xiàn)。

          后半部分使用預(yù)處理管道實現(xiàn),sum_score_pipeline 預(yù)處理管道實現(xiàn)了成績字段的求和操作。

          本質(zhì)上是:新增了total_score 字段,且寫入前加了管道的處理。寫入會慢一些,但檢索的時候就不涉及任何腳本處理,所以是增加空間換來了檢索時間的縮短,提升了檢索效率

          5、 Elasticsearch 腳本如何安全受控使用?

          既然前面提到了腳本的使用弊端和“空間換時間”前置預(yù)處理的替換解決方案。

          那么問題來了,作為集群管理人員或者研發(fā)團隊的Boss,能否做到整個集群禁用腳本呢?

          這個腦洞可以!實際也是可以實現(xiàn)的,操作層面實現(xiàn)參考如下內(nèi)容。

          5.1 大前提——Elasticsearch 安全原則

          安全無小事,“小心駛得萬年船”。
          • 1、在啟用安全的前提下運行 Elasticsearch。

          使用 XPack 的免費的精簡安全(配置登錄賬號和密碼)、基礎(chǔ)安全(SSL層面)功能。

          • 2、不要使用 root 賬號登錄 Elasticsearch。

          即便可以實現(xiàn),但安全風(fēng)險把控角度,強烈不建議。

          • 3、不要暴露集群的公網(wǎng) IP。

          盡可能保持 Elasticsearch 的隔離,最好是在防火墻和 VPN 之后使用 Elasticsearch。

          關(guān)于“裸奔”的危害,看這里:你的Elasticsearch在裸奔嗎?

          • 4、實施基于角色的方案控制策略。

          Kibana 就可能快捷上手配置,包含但不限于:Space(空間)、Role(角色)、Privelege(訪問權(quán)限)。

          字段級別的權(quán)限是收費功能,其他都是免費的。

          5.2 限制允許運行的腳本類型

          這個也是我的知識盲點,我也是近期才關(guān)注到的。

          Elasticsearch 支持兩種腳本類型:內(nèi)聯(lián)(inline)和存儲(stored)。

          默認情況下,Elasticsearch 配置為運行這兩種類型的腳本。

          相信讀者讀到這里會和我一樣一臉懵逼,啥叫 inline?啥叫 stored?inline 和 stored 有什么區(qū)別?


          5.2.1 stored 類型腳本

          所謂:stored 存儲類型的腳本。就是先定義好腳本,“存儲起來”,后面可以用,當(dāng)然也可以不用。

          用的時候指定 id 來取就可以。

          如下示例延續(xù)上面的例子。

          定義腳本,實現(xiàn)成績求和。

          POST?_scripts/sum_score_script
          {
          ??"script":?{
          ????"lang":?"painless",
          ????"source":?"ctx._source.total_score=ctx._source.math_score?+?ctx._source.english_score"
          ??}
          }

          批量全量更新,更新時使用剛才定義的腳本 id(這里本質(zhì)就是 stored 類型腳本)。

          POST?my_test_scores/_update_by_query
          {
          ??"script":?{
          ????"id":?"sum_score_script"
          ??},
          ??"query":?{
          ????"match_all":?{}
          ??}
          }

          檢索,驗證腳本是否生效。

          GET?my_test_scores/_search

          5.2.2 inline 類型腳本

          批量全量更新,更新時使用剛才定義的腳本 id。

          POST?my_test_scores/_update_by_query
          {
          ??"script":?{
          ????"lang":?"painless",
          ????"source":?"ctx._source.total_score=ctx._source.math_score?+?ctx._source.english_score"
          ??},
          ??"query":?{
          ????"match_all":?{}
          ??}
          }

          檢索,驗證腳本是否生效。

          GET?my_test_scores/_search

          對比 stored 類型,inline 腳本就是使用的時候直接指定腳本,不存在提前創(chuàng)建腳本的說法。

          知道了兩者的區(qū)別,如何做限制呢?

          5.2.3 腳本分級限制

          如下使用的配置:script.allowed_types 是 集群配置層面 elasticsearch.yml 的配置,不支持動態(tài)更新配置。

          • 第一:默認配置,沒有任何限制。

          等價于:
          script.allowed_types:?both

          如果你想保留現(xiàn)狀,腳本不做任何使用限制,那就無需更改任何配置。

          • 第二:部分限制。

          要限制運行的腳本類型,請將 script.allowed_types 設(shè)置為內(nèi)聯(lián)(inline)或存儲(stored)。
          script.allowed_types:?inline

          如果僅設(shè)置支持:inline,再創(chuàng)建 stored 類型腳本就會報錯。

          如果僅設(shè)置支持:stored,集群啟動就會報錯。
          如果您使用 Kibana,請將 script.allowed_types 設(shè)置為 both 或 inline。
          因為:某些 Kibana 功能依賴于內(nèi)聯(lián)腳本,如果 Elasticsearch 不允許內(nèi)聯(lián)腳本,則無法按預(yù)期運行。
          • 第三:完全禁止。

          要阻止任何腳本運行,請將 script.allowed_types 設(shè)置為 none。

          script.allowed_types:?none

          5.3 控制可以運行腳本的可用范圍

          范圍有哪些?舉例:

          • scoring:計算評分。
          • update :更新操作。
          • Ingest processor:管道預(yù)處理。
          • reindex:索引遷移。
          • sort:排序。
          • metric aggregation map:指標聚合。等等......

          默認情況下,使用范圍是沒有任何限制的。

          如果全部范圍都不允許使用,可以配置如下:

          script.allowed_contexts:?none

          如果僅允許部分使用,比如只允許評分、更新使用腳本,可以配置如下:

          script.allowed_contexts:?score,?update

          如上幾條,就實現(xiàn)了腳本的受控的使用,實戰(zhàn)環(huán)節(jié)結(jié)合當(dāng)前業(yè)務(wù)需求和未來擴展業(yè)務(wù)需求,謹慎選型

          6、小結(jié)

          對于腳本來說,要辯證的看待。存在即為合理,有應(yīng)用場景就會有新的 feature。

          如果沒有準實時的要求的業(yè)務(wù)場景,多半都會接受延時寫入,但對檢索響應(yīng)慢會“深惡痛絕”。

          遇到類似問題的時候,多在建模、設(shè)計階段花時間。建議不要把問題都拋到檢索的時候?qū)崿F(xiàn),一方面:腳本實現(xiàn)起來的確有性能問題;另一方面:腳本處理的方式已然不是 Elasticsearch 最擅長的事。

          可以選擇 logstash filter 環(huán)節(jié)做數(shù)據(jù)的預(yù)處理 或者借助 pipeline 實現(xiàn)寫入數(shù)據(jù)的預(yù)處理。

          空間換時間,推薦使用 Ingest 管道預(yù)處理的方式在寫入前盡可能的對字段實時預(yù)處理。

          選型階段多考慮選型 Elasticsearch 終極目的和初衷,使用過程中發(fā)揮 Elasticsearch 優(yōu)勢,且要確保優(yōu)勢最大化。

          PS:細心的 Elastic 愛好者會發(fā)現(xiàn) Elasticsearch 的官方文檔在往條理更加清晰、模塊更加分明的方向努力,這樣我們的學(xué)習(xí)有了更新的、更大的動力!

          參考

          https://opster.com/guides/elasticsearch/best-practices/elasticsearch-all-script-types-allowed/

          https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-security.html

          https://www.elastic.co/guide/en/elasticsearch/reference/current/es-security-principles.html

          推薦

          1、重磅 | 死磕 Elasticsearch 方法論認知清單(2021年國慶更新版)
          2Elasticsearch 7.X 進階實戰(zhàn)私訓(xùn)課(口碑不錯)
          3、干貨 | Elasticsearch7.X Scripting 腳本使用詳解
          4、Elasticsearch 線上問題實戰(zhàn)——如何借助 painless 更新時間?

          短時間快習(xí)得多干貨!

          已帶領(lǐng)71位球友通過 Elastic 官方認證!

          中國僅通過百余人

          比同事搶先一步學(xué)習(xí)進階干貨
          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人免费视频黄色 | 国产精品美女久久 | 日本高清色情视频 | 欧美性受XXXX黑人XYX | 欧洲精品一区二区三区 |