由于公司需要监控web攻击行为,而因某些原因搭不了waf,才不得不用ElastAlert进行告警,此为前提。
一、ELK安装
Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎。 它能从项目一开始就赋予你的数据以搜索、分析和探索的能力。
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,
Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看、交互存放在Elasticsearch索引里的数据,使用各种不同的图表、表格、地图等kibana能够很轻易地展示高级数据分析与可视化。
ELK这一套软件可以当作一个MVC模型,logstash是controller层,Elasticsearch是一个model层,kibana是view层。首先将数据传给logstash,它将数据进行过滤和格式化(转成JSON格式),然后传给Elasticsearch进行存储、建搜索的索引,kibana提供前端的页面再进行搜索和图表可视化,它是调用Elasticsearch的接口返回的数据进行可视化。logstash和Elasticsearch是用Java写的,kibana使用node.js框架。
安装方法网上有好多,此处就不再阐述。在试用了几乎所有的安装方法后,介绍下本人觉得比较快捷有效的安装方法:
1.1 下载安装匹配版本的elk
elastalert目前还不支持elk6.0以上版本,本人就是因为版本问题而折腾了好久,所以在安装elk的时候需要特别注意版本问题。
1
2
3
4
5我的服务器概况:
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial 在尝试了众多安装方法后,还是发现在官方网站下载deb包直接安装最为有效便捷。 (系统若为centos,下载对应的rpm包)
1
2
3
4Elasticsearch:5.5.2
Kibana:5.5.2
Logstash:6.0.0
filebeat:6.0.0 (轻量级的logstash,这个下载tar包) 理论上,Elasticsearch及Kibana版本为5.x都可以,而Logstash与elastalert没啥联系,所以Logstash(大于或等于Elasticsearch及Kibana的5.x版本)能向Elasticsearch传递日志信息即可。
下载完elk的deb包后,使用
dpkg -i
命令很快就能顺利安装。1.2 elk配置
同样,此处也只介绍本人的简单配置。我这里是只让Logstash对外开放负责收集日志,而Elasticsearch及Kibana仅在内网访问,故Elasticsearch及Kibana并未开启账户认证登陆,有需要开启或其他需求的读者们请自行搜索。
/etc/elasticsearch/elasticsearch.yml:
1
2
3
4
5
6
7# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 127.0.0.1
#
# Set a custom port for HTTP:
#
http.port: 9200
/etc/kibana/kibana.yml:
1
2
3
4
5
6
7
8
9
10
11Kibana is served by a back end server. This setting specifies the port to use.
server.port: 5601
# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
server.host: "localhost"
# The URL of the Elasticsearch instance to use for all your queries.
elasticsearch.url: "http://localhost:9200"
logstash我这里需要用到自定义的配置文件,故配置文件是自行创建的,放在/usr/share/logstash/bin
中,取名为filebeat_log.conf
:
1 | input { |
1.3 启动方法
elasticsearch&kibana启动
扫描新的单元&重新载入systemd:
systemctl daemon-reload
加入开机自启动:
systemctl enable elasticsearch.service
systemctl enable kibana.service
启动:
systemctl start elasticsearch
systemctl start kibana
查看状态:
systemctl status elasticsearch
systemctl status kibana
logstash启动
进入/usr/share/logstash/bin:
nohup ./logstash -f filebeat_log.conf> /dev/null 2>&1 &
二、使用filebeat进行分布式收集
一开始直接使用logstash进行日志收集,发现资源消耗实在太大,无奈寻找解决方法,发现filebeat是一个轻量级的日志传输工具,故使用filebeat作为日志收集,而logstash作为中心过滤器向es传递日志。
所以整体的架构如:
- A、B、C、D…(这些服务器是准备监控被攻击行为,装上filebeat)
- 主服务器(装上elk和elastalert,负责收集过滤分析filebeat传递的日志和告警)
下面以tomcat为例子,分享我的配置文件filebeat.yml
(nginx的话,修改paths
的路径):
1 | filebeat.prospectors: |
直接解压下载的tar包,进入目录修改配置文件。然后启动filebeat:nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
三、日志格式转json
为方便kibana分析和elastalert的取值,日志的格式要为json格式,上述的logstash配置文件已适配json格式
由于公司的应用服务器中均为nginx和tomcat,故本文只介绍tomcat及nginx的json格式配置方法,其他服务器配置方法请自行搜索。
3.1 tomcat的json格式配置
打开config/server.xml
,在最后的位置修改log的输出配置为:
1 | <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" |
然后重启tomcat,即生效。
3.2 nginx的json格式配置
进入`/etc/nginx`打开`nginx.conf`,加入如下配置:
1 |
|
最后nginx -s reload
即可
四、使用elastalert进行告警
在经过上述的安装及配置后,终于轮到我们的主角–ElastAlert出来了,其他的告警工具还有411 Alert Management
、Elasticsearch watch
,请读者们自行确定需要使用哪个。
ElastAlert使用python编写,具有容易上手、文档全等特点,虽然这个工具拥有如此多的优点,在搭建过程还是遇到了很多很多的未知错误,主要原因是网上的资料大多是针对es5.x以前的版本而没什么现成的资料可供参考。
4.1 安装elastalert
1 | git clone https://github.com/Yelp/elastalert.git |
具体的功能本文就不一一介绍了,请自行前往官方文档了解
4.2 创建索引
安装完成后会系统中会自带三个命令:
elastalert-create-index
、elastalert-rule-from-kibana
、elastalert-test-rule
使用elastalert-create-index
,根据提示设置es后按回车默认即可。
配置完索引及配置文件后,可以使用elastalert-test-rule
进行测试。这里有个bug,如果出现TransportError(400, u'search_phase_execution_exception', u'No mapping found for [alert_time] in order to sort on')
之类的错误,在确认没有其他的问题时,可以先删除索引curl -XDELETE http://localhost:9200/*
,再使用elastalert-create-index
重新生成索引。
4.3 配置config.yaml
1 | rules_folder: example_rules |
以上各字段的解释:
Rules_folder:用来加载下一阶段rule的设置,默认是example_rules
Run_every:用来设置定时向elasticsearch发送请求
Buffer_time:用来设置请求里时间字段的范围,默认是45分钟
Es_host:elasticsearch的host地址
Es_port:elasticsearch 对应的端口号
Use_ssl:可选的,选择是否用SSL连接es,true或者false
Verify_certs:可选的,是否验证TLS证书,设置为true或者false,默认为- true
Es_username:es认证的username
Es_password:es认证的password
Es_url_prefix:可选的,es的url前缀(我的理解是https或者http)
Es_send_get_body_as:可选的,查询es的方式,默认的是GET
Writeback_index:elastalert产生的日志在elasticsearch中的创建的索引
Alert_time_limit:失败重试的时间限制
4.4 告警配置介绍
在example_rules
目录中新建yaml配置文件 webattack_frequency.yaml
,下面分开介绍这个配置文件的内容(下个小节将分享我的配置文件,此小节仅解释其中的必要设置项):
1、告警规则
ElastAlert支持11种告警规则,本文不一一介绍了,为响应web攻击行为,本文选用的告警规则是frequency
。
1 | name: web attack |
上述配置文件的意图即是:在一分钟内将匹配query里面的sql注入规则,若匹配次数达到10次,即进行报警。
2、使用邮箱进行告警
ElastAlert提供了 10 多种通知的类型,本文选用的是邮箱告警,还有微信告警、钉钉告警,若有需要,请自行配置。
1 |
|
smtp_auth_file.yaml
的配置内容会在下个小节给出,在这个配置中,我自定义了 alert 的内容,更为精确地突出了攻击者ip、受攻击的服务器、攻击事件等信息。
3、减少重复告警的频率
在实际的使用中,若使用上述的配置,受到攻击的时候邮箱将不断地收到邮件,而这些邮件都对应着同一个攻击实例,根本没必要重复收取,于是,我使用了如下的配置:
1 | # 用来区分报警,跟 realert 配合使用,在这里意味着, |
在本人实际测试的攻击场景中,发现使用了exponential_realert
后,会错过很多告警(这些告警并不是同一个攻击实例),暂时不确定原因,还请读者们自行确定是否开启该设置。
4.5webattack_frequency.yaml
及smtp_auth_file.yaml
配置文件内容
上述的4.4小节中对每个配置都作了简单的介绍,这里就直接放出web攻击预警的配置文件供各位读者参考。
webattack_frequency.yaml:
1 | # Alert when the rate of events exceeds a threshold |
smtp_auth_file.yaml:
1 | user: xxx@163.com |
4.6 运行elastalert
在成功配置完ElastAlert后将生成三个配置文件:
config.yaml、webattack_frequency.yaml、smtp_auth_file.yaml
- 启动elastalert服务,监听elasticsearch:
nohup python -m elastalert.elastalert --verbose --rule webattack_frequency.yaml >/dev/null 2>&1 &
- 为实现守护进程的作用,可以配合
supervisor
进行使用,本文不再阐述。
4.7 运行效果:
当匹配到自定义攻击规则的时候,ElastAlert将会以邮件方式发送告警信息:
1 | web attack may be by 104.38.13.21 at @[13/Jan/2018:16:06:58 +0800] |
五、总结
ElastAlert除了本文介绍的告警web攻击行为外,还能进行异常告警等。使用了frequency的规则后,基本能达到识别web攻击的目的。在实际的使用中,elastalert能稳定运行,且能根据自定义配置文件精确告警,缺点是告警的格式不够美观和需要频繁地修改配置文件。
参考链接:
ElastAlert:『Hi,咱服务挂了』:https://xizhibei.github.io/2017/11/19/alerting-with-elastalert/
[ElastAlert]介绍和安装:https://segmentfault.com/a/1190000008227486
被elastalert虐了:http://blog.csdn.net/vbaspdelphi/article/details/54291066
本文链接: http://dayun.shystartree.online/2018/01/20/ElastAlert%E7%9B%91%E6%8E%A7%E6%97%A5%E5%BF%97%E7%9A%84web%E6%94%BB%E5%87%BB%E8%A1%8C%E4%B8%BA/
版权声明:本博客所有文章除特别声明外,均采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议许可协议。欢迎转载,但转载请注明来自qingyu’s blog,并保持转载后文章内容的完整,本人保留所有版权相关权利。