使用Shield保護ELK平臺
——兼權限控制
ELK系統默認並不含有用戶認證功能,基本上任何人都可以隨意讀寫ElasticSearch的API並獲取數據,這時該如何對ELK系統做好防護工作呢?
目標
在讀完這篇教程後,您可以學會:
- 阻攔未授權的用戶對ELK平臺的訪問
- 允許不同用戶訪問不同的index
方法
這裏我們使用Elastic公司的Shield來完成這個工作
Shield是什麼
Shield是Elastic公司爲ElasticSearch開發的一個安全插件。在安裝此插件後,Shield會攔截所有對ElasticSearch的請求,並加上認證與加密,保障ElasticSearch及相關係統的安全性。
它支持下面的功能:
用戶認證
使用Shield可以定義一系列已知的用戶,並用其認證用戶請求。這些用戶存在於抽象的“域”中。一個域可能是下面幾種類型:
- LDAP服務
- Active Directory服務
- 本地esusers配置文件(類似/etc/passwd)
權限控制
Shield的權限控制包含下面幾種元素:
- 被保護的資源Secured Resource:權限所應用到的對象,比如某個index,cluster等等
- 特權Priviliege:角色對對象可以執行的一種或多種操作,比如
read
,write
等。還可以是indicies:/data/read/perlocate
等某種對象特有的操作。 - 許可Permissions:對被保護的資源擁有的一個或多個特權,如
read on the "products" index
。 - 角色Role:由許可組成的有名字的集合
- 用戶Users:用戶實體,可以被賦予0種,1種或多種角色,他們可以對被保護的資源執行相應角色所擁有的各種特權。
集羣節點認證與信道加密
Shield使用SSL/TLS加密相應端口(9300),防止集羣被未授權的機器監聽或干擾。
IP 過濾
Shield支持基於IP的訪問控制。
審計
Shield可以在ElasticSearch的日誌中輸出每次鑑權操作的詳細信息,包括用戶名,操作,操作是否被允許等等。
安裝Shield
前提條件
- 您安裝了Java7或更新版本
- 您將ElasticSearch 1.5.0+解壓安裝到了本機上。如果您使用APT或YUM安裝,默認的安裝目錄可能在
/usr/share/elasticsearch
。
開始安裝
- 進入ElasticSearch安裝目錄:
cd /usr/share/elasticsearch
-
安裝ElasticSearch許可插件:
bin/plugin -i elasticsearch/license/latest
Shield是商業插件,需要ElasticSearch的商業許可。第一次安裝許可的時候,會提供30天的免費試用權限。30天后,Shield將會屏蔽
cluster health
,cluster stats
,index stats
這幾個API,其餘功能不受影響。 -
下面安裝Shield插件:
bin/plugin -i elasticsearch/shield/latest
-
將Shield配置文件移動或鏈接至
/etc/elasticsearch/shield
目錄中:ln -s /usr/share/elasticsearch/config/shield /etc/elasticsearch/shield
。進行這一步的原因是ElasticSearch服務在啓動時會在
/etc/elasticsearch/shield
目錄下尋找Shield配置文件,而這些配置文件在安裝Shield時會出現在/usr/share/elasticsearch/config/shield
中。 -
重啓ElasticSearch服務:
service elasticsearch restart
- 新建一個ElasticSearch管理員賬戶,這裏會讓您填寫新密碼:
bin/shield/esusers useradd es_admin -r admin
- 現在試試用RESTFUL API訪問ElasticSearch,應該會被拒絕:
curl -XGET 'http://localhost:9200/'
- 在請求上加上用戶名和密碼:
curl -u es_admin -XGET 'http://localhost:9200/'
如果認證失敗的話,可能需要在
/etc/elasticsearch/elasticsearch.yml
中加入下面的內容:
shield:
authc:
realms:
default:
type: esusers
order: 0
enabled: true
files:
users: "/etc/elasticsearch/shield/users"
users_roles: "/etc/elasticsearch/shield/users_roles"
到這裏,Shield基本功能已經安裝完畢。
配置其餘軟件
配置Logstash
- 在ElasticSearch服務器上,使用esusers創建Logstash用戶:
/usr/share/elasticsearch/bin/shield/esusers useradd logstashserver -r logstash
- 在Logstash服務器上,修改output模塊的配置文件,例如:
output {
elasticsearch {
host => "192.168.6.144"
protocol => "http"
index => "logstash-%{type}-%{+YYYY.MM.dd}"
user => "logstashserver" #在這裏加上Shield中role爲Logstash的用戶名
password => "woshimima" #別忘了密碼
}
# stdout { codec => rubydebug }
}
之後重啓Logstash服務即可。
配置Kibana
基本配置
- 在ElasticSearch服務器上,使用esusers創建屬於kibana4_server的用戶:
/usr/share/elasticsearch/bin/shield/esusers useradd kibanaserver -r kibana4_server
- 在Kibana服務器上,編輯
/opt/kibana/config/kibana.yml
,找到下面這一部分並修改:
# If your Elasticsearch is protected with basic auth, this is the user credentials
# used by the Kibana server to perform maintence on the kibana_index at statup. Your Kibana
# users will still need to authenticate with Elasticsearch (which is proxied thorugh
# the Kibana server)
kibana_elasticsearch_username: kibanaserver #Kibana服務將用這個用戶名訪問ElasticSearch服務器。
kibana_elasticsearch_password: woshimima #密碼
之後重啓Kibana服務即可。您可能需要使用前面的es_admin
賬戶登錄Kibana網頁端。
權限控制
在實際的生產環境中,經常需要讓不同的角色訪問不同的index,比如讓Nginx管理員只能看到nginx相關的日誌,Mail管理員只看到mail相關的用戶,這時候就需要使用到權限控制功能。
首先我們編輯ElasticSearch服務器的/etc/elasticsearch/shield/roles.yml
,註釋掉kibana4.indicies.*
部分,即去掉用戶讀取所有index的權限。如下:
# The required permissions for kibana 4 users.
kibana4:
cluster:
- cluster:monitor/nodes/info
- cluster:monitor/health
indices:
# '*':
# - indices:admin/mappings/fields/get
# - indices:admin/validate/query
# - indices:data/read/search
# - indices:data/read/msearch
# - indices:admin/get
'.kibana':
- indices:admin/exists
- indices:admin/mapping/put
- indices:admin/mappings/fields/get
- indices:admin/refresh
- indices:admin/validate/query
- indices:data/read/get
- indices:data/read/mget
- indices:data/read/search
- indices:data/write/delete
- indices:data/write/index
- indices:data/write/update
- indices:admin/create
之後再roles.yml
的末尾加上相關用戶的權限配置:
nginx_user: #nginx_user 角色定義
indices: #index部分
'logstash-nginx*': read #指定nginx_user可以讀取所有匹配'logstash-nginx*'的索引。
mail_user: #mail_user 角色定義,用法同上
indices:
'logstash-mail*': read
現在我們使用esuser
新建兩個用戶,分屬兩個組
/usr/share/elasticsearch/bin/shield/esusers useradd demo_nginx -r nginx_user
/usr/share/elasticsearch/bin/shield/esusers useradd demo_mail -r mail_user
再把它們同時加入kibana4
組中:
/usr/share/elasticsearch/bin/shield/esusers roles demo_nginx -a kibana4
/usr/share/elasticsearch/bin/shield/esusers roles demo_mail -a kibana4
這時再用不同的用戶登錄Kibana界面,就可以看到不同的內容了。