前言
Elasticsearch(以下簡(jiǎn)稱(chēng)ES)廣泛應(yīng)用于互聯(lián)網(wǎng)企業(yè)(Github,Netflix,DigitalOcean...),ES并未提供免費(fèi)的安全插件來(lái)守護(hù)ES集群,對(duì)于一家商業(yè)公司這么做無(wú)可厚非,但這更說(shuō)明ES安全模塊的重要性。本文將簡(jiǎn)單介紹ES、ES的插件體系并著重介紹ES安全模塊的實(shí)現(xiàn)。
ES 簡(jiǎn)介
ElasticSearch 是一個(gè)分布式,實(shí)時(shí),全文搜索引擎。底層實(shí)現(xiàn)基于Lucene全文搜索引擎并提供了RESTful接口實(shí)現(xiàn),數(shù)據(jù)以JSON文檔的格式存儲(chǔ)索引,不需要預(yù)先規(guī)定范式。
通用的應(yīng)用場(chǎng)景包括:搜索引擎、NOSQL存儲(chǔ)、ELK。
ES除了充分利用的Lucene提供的全文搜索功能還擴(kuò)展了以下功能:
可搜索的分布式文件存儲(chǔ)
實(shí)時(shí)分析的分布式搜索引擎
橫向擴(kuò)展非常容易,可處理PB級(jí)數(shù)據(jù)
ES 插件體系
和很多系統(tǒng)一樣,ES也通過(guò)插件來(lái)增強(qiáng)系統(tǒng)核心功能。ES主要支持兩種類(lèi)型的插件:
Java插件 (Shield,SearchGuard)
該類(lèi)型插件只包含Jar文件,通過(guò)攔截請(qǐng)求實(shí)現(xiàn)功能,且須安裝在集群中的每個(gè)節(jié)點(diǎn)上并且需要重新啟動(dòng)后才能生效。
Site插件 (kopf,marvel)
site插件主要包含WEB資源文件,如Js、HTML、CSS,通過(guò)ES內(nèi)嵌的服務(wù)器,可直接訪問(wèn)http://es-cluster:9200/_plugin/plugin 來(lái)查看相應(yīng)的插件。
基于插件的安全實(shí)現(xiàn)
根據(jù)ES提供的插件機(jī)制,我們可以通過(guò)插件攔截請(qǐng)求實(shí)現(xiàn)以下安全控制:
攔截、認(rèn)證HTTP、Transport請(qǐng)求
用戶權(quán)限驗(yàn)證
審計(jì)功能
節(jié)點(diǎn)通信證書(shū)加密
SearchGuard簡(jiǎn)介
Search Guard 2(以下簡(jiǎn)稱(chēng)SG2)是一個(gè)提供了加密、認(rèn)證、授權(quán)功能的ES開(kāi)源插件(依賴(lài)Search Guard SSL插件)并且提供了細(xì)粒度到文檔、字段級(jí)別的權(quán)限控制,是商業(yè)版Shield插件的開(kāi)源替代。SG和Shield的實(shí)現(xiàn)大同小異,通過(guò)分析SG即可了解ES的安全模塊的設(shè)計(jì)與實(shí)現(xiàn) 。另:SG1版已廢棄,不推薦使用。
下面簡(jiǎn)單介紹集成配置和關(guān)鍵源碼(偽代碼)簡(jiǎn)析。
配置
安裝SG、SG-SSL插件
bin/plugin install -b com.floragunn/search-guard-ssl/version
bin/plugin install -b com.floragunn/search-guard-2/version
證書(shū)文件可自行提供或根據(jù)seaerch_guard_ssl提供的example-pki-scripts腳本文件生成。
ES配置
更新權(quán)限管理信息
生成新密碼并替換sg_internal_users.yml
plugins/search-guard-2/tools/hasher.sh -p mycleartextpassword
啟動(dòng)ES,在sgconfig目錄下設(shè)置好角色、用戶權(quán)限,運(yùn)行腳本將信息寫(xiě)入ES集群
plugins/search-guard-2/tools/sgadmin.sh -cd plugins/search-guard-2/sgconfig/ -ks plugins/search-guard-2/sgconfig/keystore.jks -ts plugins/search-guard-2/sgconfig/truststore.jks -nhnv
關(guān)鍵源碼簡(jiǎn)析
元數(shù)據(jù)
SG元數(shù)據(jù)在ES中的存儲(chǔ)位置: searchguard.[ config | roles | rolesmapping | internalusers | actiongroups ]
用戶認(rèn)證
Transport認(rèn)證
SG插件啟動(dòng)時(shí)注冊(cè)SearchGuardFilter,并設(shè)置在filter chain中的執(zhí)行順序(from lowest order to highest)為Integer.MIN_VALUE,即第一個(gè)被執(zhí)行,保證所有請(qǐng)求都會(huì)被SG攔截驗(yàn)證。
HTTP認(rèn)證
BackendRegistry中注冊(cè)REST請(qǐng)求預(yù)處理器-SearchGuardRestFilter攔截處理REST請(qǐng)求
權(quán)限管理
YAML格式權(quán)限配置文件,支持通配符和action group設(shè)置權(quán)限
過(guò)濾掉只能由admin和internal user等可以訪問(wèn)的索引,然后再角色的權(quán)限設(shè)置(有通配符和無(wú)通配符的權(quán)限會(huì)分開(kāi)處理)對(duì)普通用戶的action進(jìn)行權(quán)限驗(yàn)證
審計(jì)
記錄用戶在ES集群中的操作日志并存儲(chǔ)到ES中,以單獨(dú)的插件提供審計(jì)模塊,若需要審計(jì)功能則需要集將其加到SG2的依賴(lài)中。
總結(jié)
本文簡(jiǎn)單介紹了ES、ES插件體系以及基于該插件機(jī)制的SG的特性、配置以及關(guān)鍵源碼的簡(jiǎn)單分析,還有一些特性值得我們?nèi)パ芯浚热鏒LS、FLS級(jí)別的控制,更多樣的認(rèn)證方式,與kibana、logstash的集成等,希望大家能夠以更安全、方便的使用ES。
本文作者:卜玉凱(點(diǎn)融黑幫),目前就職于點(diǎn)融網(wǎng)支付組、典型軟件工程師,專(zhuān)注于支付業(yè)務(wù)。愛(ài)好:夜跑、羽毛球。