使用Shield保护ElasticSearch平台--兼权限控制

原创 2016年08月31日 15:53:02

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界面,就可以看到不同的内容了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

使用Shield保护ElasticSearch平台--兼权限控制

使用Shield保护ELK平台 ——兼权限控制 ELK系统默认并不含有用户认证功能,基本上任何人都可以随意读写ElasticSearch的API并获取数据,这时该如何对ELK系统做好防护工作呢...

elasticsearch使用jetty进行简单的权限控制

默认elasticsearch是使用netty作为http的容器,由于netty并没有权限模块,所以默认es没有任何的权限控制,直接通过http就可以进行任何操作,除非把http禁用。但如果你使用el...

Elasticsearch shield权限管理详解

ElasticSearch本身没有权限管理模块,只要获取服务器的地址和端口,任何人都可以随意读写ElasticSearch的API并获取数据,这样非常不安全。如果获取了ES的访问IP和端口,一条命令就...
  • napoay
  • napoay
  • 2016年08月13日 21:06
  • 15951

给Elasticsearch 和Kibana添加基于角色的访问权限控制

给ELK 添加Shield权限控制背景这两天整个项目(电商SAAS系统)上线后,由于系统变得很大,每天产生的业务日志、访问日志、数据库慢查询、php等语言日志,都分布在不同的机器上,所以需要统一收集并...
  • xuplus
  • xuplus
  • 2016年06月08日 10:58
  • 14792

【入门篇】Elasticsearch、Kibana权限控制

1、官方文档:https://www.elastic.co/guide/en/x-pack/current/index.html2、Install X-Pack into Elasticsearch ...

elasticsearch+kibana实现权限控制-search-guard

1.版本 elasticsearch 5.2.0 kibana 5.2.0 2.es安装searchguard插件 进入ES_HOME目录,运行 bin/elasticsearch-plugin in...

Xianfeng轻量级Java中间件平台:基于RBAC模型实现权限控制的原理

首先,白话一下RBAC权限模型
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Shield保护ElasticSearch平台--兼权限控制
举报原因:
原因补充:

(最多只允许输入30个字)