使用Shield保護ElasticSearch平臺--兼權限控制

使用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

開始安裝

  1. 進入ElasticSearch安裝目錄:cd /usr/share/elasticsearch
  2. 安裝ElasticSearch許可插件:bin/plugin -i elasticsearch/license/latest

    Shield是商業插件,需要ElasticSearch的商業許可。第一次安裝許可的時候,會提供30天的免費試用權限。30天后,Shield將會屏蔽cluster healthcluster statsindex stats這幾個API,其餘功能不受影響。

  3. 下面安裝Shield插件:bin/plugin -i elasticsearch/shield/latest

  4. 將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中。

  5. 重啓ElasticSearch服務:service elasticsearch restart

  6. 新建一個ElasticSearch管理員賬戶,這裏會讓您填寫新密碼:bin/shield/esusers useradd es_admin -r admin
  7. 現在試試用RESTFUL API訪問ElasticSearch,應該會被拒絕:curl -XGET 'http://localhost:9200/'
  8. 在請求上加上用戶名和密碼: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

  1. 在ElasticSearch服務器上,使用esusers創建Logstash用戶:/usr/share/elasticsearch/bin/shield/esusers useradd logstashserver -r logstash
  2. 在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

基本配置

  1. 在ElasticSearch服務器上,使用esusers創建屬於kibana4_server的用戶:/usr/share/elasticsearch/bin/shield/esusers useradd kibanaserver -r kibana4_server
  2. 在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界面,就可以看到不同的內容了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章