Elasticsearch(以下簡稱es)被越來越多的公司廣泛使用,而其本身安全問題也備受關注,最近出現的安全問題比較多,例如影響比較大的漏洞有CVE-2014-3120和CVE-2015-1427。
這些漏洞和es本身沒有認證授權機制有很大關系,同時公司內部多業務使用使用同一套es集群的情況非常多,如何做好認證授權的管理的問題尤為凸顯。
官方竟然將安全模塊Shield作為收費模塊,所以普及率并不高。本著為公司省下仨瓜倆棗的精神尋找其他的解決方案。實現過程中走了一些彎路,記錄下來以方便其他遇到這些問題的同仁。
隨著es的普及,對安全的需求越來越多,例如:
需求已確定,經過一番尋找得到以下幾種方案備選。、
elasticsearch-http-basic
:優點:此方案部署簡單快速,可以解決從無到有的過程,實現了賬號認證和ip白名單認證功能,缺點:功能單一,只解決了#1需求。kibana-authentication-proxy
:優點:此方案是針對kibana實現的認證,優點是該方案支持“Google OAuth2, BasicAuth(multiple users supported) and CAS Authentication
”解決了需求#4中的單點登錄的需求,配合方案#1中的ip白名單能基本解決需求#1和#4.缺點:目前只支持到kibana3。Shield
:優點:功能強大,文檔豐富。缺點:收費。search-guard
:優點:功能豐富的免費模塊,能夠很好的解決需求中所有問題(除了#4中的單點登錄)。缺點:部署和配置稍復雜,文檔較少,門檻較高。大家應該能猜到最終的選擇了,沒錯就是方案#4。
目前官方對es1.5和1.6支持比較好,兩個版本安裝方法不同,
直接使用插件安裝 ,
bin/plugin -i com.floragunn/search-guard/0.5
首先需要安裝maven,
#!bash
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.tar.gz
解壓后將bin目錄添加到環境變量PATH中。
下載編譯相關依賴
git clone -b es1.6 https://github.com/floragunncom/search-guard.git cd search-guard mvn package -DskipTests bin/plugin -u file:./target/search-guard-16-0.6-SNAPSHOT.jar -i search-guard
Search guard
配置分為2部分,一部分是elasticsearch.yml
以及logging.yml
文件。另一部分存儲在es中。
elasticsearch.yml
主要內容包括search guard
的一些開關,ssl
支持的配置,認證方式,權限控制的filter
等。 下面我們來完成一個最小化的配置: 直接將git中searchguard_config_template.yml
內容粘貼到elasticsearch.yml
, 然后打開searchguard.allow_all_from_loopback: true
以方便本地調試。 另外需要注意的一個選項是
searchguard.key_path: /path/key
searchguard_node.key
文件的路徑。 默認配置已開啟basic認證,
searchguard.authentication.authentication_backend.impl: com.floragunn.searchguard.authentication.backend.simple.SettingsBasedAuthenticationBackend searchguard.authentication.authorizer.impl: com.floragunn.searchguard.authorization.simple.SettingsBasedAuthorizator searchguard.authentication.http_authenticator.impl: com.floragunn.searchguard.authentication.http.basic.HTTPBasicAuthenticator
設置用戶名和密碼
searchguard.authentication.settingsdb.user.
: password searchguard.authentication.settingsdb.user.admin: adminpass searchguard.authentication.settingsdb.user.user: userpass
給用戶分配角色,admin
為超級管理員,角色為root
,user
為只讀用戶橘色。
searchguard.authentication.authorization.settingsdb.roles.
: searchguard.authentication.authorization.settingsdb.roles.admin: ["root"] searchguard.authentication.authorization.settingsdb.roles.user: ["readonly"]
設置filter
,我設置兩個權限,readonly
和deny
權限, readonly的filter只允許讀操作,以及kibana必須的兩個操作,禁止寫操作。
searchguard.actionrequestfilter.names: ["readonly","deny"] searchguard.actionrequestfilter.readonly.allowed_actions: ["indices:data/read/","indices:admin/exists","indices:admin/mappings/"] searchguard.actionrequestfilter.readonly.forbidden_actions: ["indices:data/write/*"]
deny filter
禁止所有的操作。
searchguard.actionrequestfilter.deny.allowed_actions: [] searchguard.actionrequestfilter.deny.forbidden_actions: ["cluster:", "indices:"]
logging.yml
最后加入
logger.com.floragunn: DEBUG
開啟search guard
的調試級別,以方便調試。 至此文件配置部分基本完成,下面設置ACL
,將剛配置的roles
,filters
和indices
關聯起來。
curl -XPUT 'http://localhost:9200/searchguard/ac/ac?pretty' -d ' {"acl": [ { "Comment": "這條是DEFAULT規則,必須要有,默認的權限是readonly", "filters_bypass": [], "filters_execute": ["actionrequestfilter.readonly"] }, { "Comment": "root角色的賬號可以繞過所有的filter", "roles": [ "root" ], "filters_bypass": [""], "filters_execute": [] }, { "Comment": "readonly角色對于logstash的索引沒有權限訪問", "roles" : ["readonly"], "indices": ["logstash*"], "filters_bypass": [], "filters_execute": ["actionrequestfilter.deny"] }, { "Comment": "readonly角色對于logs和.kibana索引有只讀的權限", "roles" : ["readonly"], "indices": ["logs",".kibana"], "filters_bypass": [""], "filters_execute": ["actionrequestfilter.readonly"] }
]}'
為了看著方便,JSON格式化后是這個樣子
{
"acl": [
{
"Comment": "這條是DEFAULT規則,必須要有,默認的權限是readonly",
"filters_bypass": [],
"filters_execute": [
"actionrequestfilter.readonly"
]
},
{
"Comment": "root角色的賬號可以繞過所有的filter",
"roles": [
"root"
],
"filters_bypass": [
""
],
"filters_execute": []
},
{
"Comment": "readonly角色對于logstash的索引沒有權限訪問",
"roles": [
"readonly"
],
"indices": [
"logstash*"
],
"filters_bypass": [],
"filters_execute": [
"actionrequestfilter.deny"
]
},
{
"Comment": "readonly角色對于logs和.kibana索引有只讀的權限",
"roles": [
"readonly"
],
"indices": [
"logs",
".kibana"
],
"filters_bypass": [
""
],
"filters_execute": [
"actionrequestfilter.readonly"
]
}
]
}
這樣我就做到了關鍵數據索引logstash*
只允許admin
用戶訪問,而user
賬號可以對logs
和kibana
進行只讀操作,大家可以自行測試。 這里順便解決了kibana
本身沒有權限控制的問題,對于dashborad
展示分享給user
用戶,也不用擔心他們會對圖標設置進行誤操作而影響其他用戶使用。
其實search guard
的功能遠不止以上介紹的這些,例如細化到字段或者文檔級別的ACL;節點之間通過SSL同步數據;使用ladp或者AD賬號進行驗證等功能希望后續能給大家帶來介紹。
愿本文能起到拋磚引玉的效果。