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