如何实现自动化运维自动化运维之日志统一管理.docx
《如何实现自动化运维自动化运维之日志统一管理.docx》由会员分享,可在线阅读,更多相关《如何实现自动化运维自动化运维之日志统一管理.docx(8页珍藏版)》请在冰豆网上搜索。
如何实现自动化运维自动化运维之日志统一管理
如何实现自动化运维?
自动化运维之日志统一管理
一、日志收集及告警项目背景
近来安全测试项目较少,想着把安全设备、nginx日志收集起来并告警,话不多说,直接说重点,搭建背景:
1.日志源:
安全设备日志(ImpervaWAF、绿盟WAF、paloalto防火墙)、nginx日志等;
2.日志分析开源软件:
ELK,告警插件:
Sentinl或elastalert,告警方式:
钉钉和邮件;
3.安全设备日志->logstash->es,nginx日志由于其他部门已有一份(flume->kafka)我们通过kafka->logstash->es再输出一份,其中logstash的正则过滤规则需要配置正确,不然比较消耗性能,建议写之前使用grokdebug先测试好再放入配置文件;
4.搭建系统:
centos7,JDK1.8,Python2.7
5.ELK统一版本为5.5.2
由于es和kibana的安装都比较简单,就不在下文中说明安装及配置方法了。
相关软件的下载链接如下:
Es:
https:
//artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.tar.gz
Kibana:
https:
//artifacts.elastic.co/downloads/kibana/kibana-5.5.2-linux-x86_64.tar.gz
Logstash:
https:
//artifacts.elastic.co/downloads/logstash/logstash-5.5.2.tar.gz
测试链接Grokdebug:
http:
//grokdebug.herokuapp
二、安全设备日志收集
2.1ImpervaWAF配置
策略->操作集->新增日志告警规则
我这边没有用设备自身的一些日志规则,而是根据手册自定义了一些需要的日志字段,可在自定义策略的消息填入如下字段:
StartTime=$!
{Alert.createTime}AlarmID=$!
{Alert.dn}EventID=$!
{Event.dn} AggregationInfo=$!
{Alert.aggregationInfo.occurrences}Alert_level=$!
{Alert.severity} RuleName=$!
{Alert.alertMetadata.alertName}Category=$!
{Alert.alertType} Alert_description=$!
{Alert.description}EventType=$!
{Event.eventType} PolicyName=$!
{Rule.parent.displayName}SrcIP=$!
{Event.sourceInfo.sourceIp} SrcPort=$!
{Event.sourceInfo.sourcePort}Proto=$!
{Event.sourceInfo.ipProtocol} DstIP=$!
{Event.destInfo.serverIp}DstPort=$!
{Event.destInfo.serverPort} WebMethod=$!
{Event.struct.httpRequest.url.method}Domain=$!
{Alert.serverGroupName} URL=$!
{Event.struct.httpRequest.url.path}ResponseCode=$!
{Event.struct.httpResponse.responseCode}Alert_key=$!
{Event.struct.httpRequest.url.queryString}Action=$!
{Alert.immediateAction} ResponseTime=$!
{Event.struct.responseTime}ResponseSize=$!
{Event.struct.responseSize} Headers_value=$!
{Event.struct.httpRequest.headers.value}Parameters_value=$!
{Event.struct.httpRequest.parameters.value}
参数说明:
告警开始时间、告警ID、事件ID、事情数量、告警级别….HTTP返回码、触发告警字符串、响应动作、响应时间、响应大小、http包头的值,中间省略的部分请自行查看手册。
其实ImpervaWAF的总日志字段数不少于一两百个,单从这一点可以看出确实好于国产WAF太多。
针对ImpervaWAF的logstash配置如下:
input{ syslog{ type=>"syslog" port=>514 } } filter{ grok { match=>["message","%{GREEDYDATA:
StartTime}AlarmID=%{NUMBER:
AlarmID} EventID=%{NUMBER:
EventID}AggregationInfo=%{NUMBER:
AggregationInfo} Alert_level=%{DATA:
Alert_level}RuleName=%{GREEDYDATA:
RuleName} Category=%{GREEDYDATA:
Category}Alert_description=%{GREEDYDATA:
Alert_description} EventType=%{DATA:
EventType}PolicyName=%{GREEDYDATA:
PolicyName}SrcIP=%{IPV4:
SrcIP} SrcPort=%{NUMBER:
SrcPort}Proto=%{DATA:
Proto}DstIP=%{IPV4:
DstIP} DstPort=%{NUMBER:
DstPort}WebMethod=%{GREEDYDATA:
WebMethod} Domain=%{DATA:
Domain}URL=%{GREEDYDATA:
URL} ResponseCode=%{GREEDYDATA:
ResponseCode}Alert_key=%{GREEDYDATA:
Alert_key} Action=%{DATA:
Action}ResponseTime=%{GREEDYDATA:
ResponseTime} ResponseSize=%{GREEDYDATA:
ResponseSize}Headers_value=%{GREEDYDATA:
Headers_value}Parameters_value=%{GREEDYDATA:
Parameters_value}"] #实际复制粘贴可能会有点格式问题,注意参数之间空一个空格即可 remove_field=>["message"] } geoip{ source=>"SrcIP" #IP归属地解析插件 } } output{ elasticsearch{ hosts=>"es单机或集群地址:
9200" index=>"impervasyslog" } }
说明:
其中geoip为elk自带插件,可以解析ip归属地,比如ip归属的国家及城市,在仪表盘配置“地图炮”装X、查看攻击源地理位置的时候有点用,
2.2绿盟WAF配置
日志报表->日志管理配置->Syslog配置">针对绿盟WAF的logstash配置如下:
input和output参照impervawaf,贴出最要的grok部分,如下:
grok { match=>["message",%{DATA:
syslog_flag} site_id:
%{NUMBER:
site_id} protect_id:
%{NUMBER:
protect_id} dst_ip:
%{IPV4:
dst_ip} dst_port:
%{NUMBER:
dst_port} src_ip:
%{IPV4:
src_ip}src_port:
%{NUMBER:
src_port}method:
%{DATA:
method} domain:
%{DATA:
domain} uri:
%{DATA:
uri} alertlevel:
%{DATA:
alert_level} event_type:
%{DATA:
Attack_types}stat_time:
%{GREEDYDATA:
stat_time} policy_id:
%{NUMBER:
policy_id}rule_id:
%{NUMBER:
rule_id} action:
%{DATA:
action} block:
%{DATA:
block}block_info:
%{DATA:
block_info} http:
%{GREEDYDATA:
URL}
2.3paloalto防火墙配置
(6.1版本,其他版本可能会有点差异)
新建syslog服务器->日志转发,具体看截图
针对PA的logstash配置如下:
input和output参照impervawaf,贴出最要的grok部分,如下:
grok { match=>["message","%{DATA:
PA_Name},%{GREEDYDATA:
Time},%{NUMBER:
Eventid},%{DATA:
Category},%{DATA:
Subcategory},%{NUMBER:
NULL},%{GREEDYDATA:
Generate_Time},%{IPV4:
SourceIP},%{IPV4:
DestinationIP},%{IPV4:
NAT_SourceIP},%{IPV4:
NAT_DestinationIP},%{DATA:
RuleName},%{DATA:
SourceUser},%{DATA:
DestinationUser},%{DATA:
Application},%{DATA:
VMsys},%{DATA:
SourceZone},%{DATA:
DestinationZone},%{DATA:
IN_interface},%{DATA:
OUT_interface},%{DATA:
Syslog},%{DATA:
GREEDYDATA:
TimeTwo},%{NUMBER:
SessionID},%{NUMBER:
Repeat},%{NUMBER:
SourcePort},%{NUMBER:
DestinationPort},%{NUMBER:
NAT-SourcePort},%{NUMBER:
NAT-DestinationPort},%{DATA:
Flag},%{DATA:
Proto},%{DATA:
Action},%{DATA:
NUll2},%{DATA:
ThreatName},%{DATA:
Category2},%{DATA:
Priority},%{DATA:
Direction},%{NUMBER:
Serialnum},%{GREEDYDATA:
NULL3}"]
贴两张最终的效果图:
三、Nginx日志收集
由于nginx日志已经被其他大数据部门收集过一遍了,为避免重复读取,我们从其他部门的kafka拉取过来即可,这里说一下nginx收集的方式,f