利用PowerDNS日志—收集并分析来源IP与目标域名

利用PowerDNS日志—收集并分析来源IP与目标域名

Deng YongJie's blog 2 2024-11-23

服务端部署logstash,将filebeat传过来的非结构化日志转为json格式,并新增几个字段

#部署logstash
https://www.elastic.co/guide/en/logstash/7.17/installing-logstash.html#package-repositories

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
apt-get install apt-transport-https -y
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt-get update && apt-get install logstash=7.17.19 -y

#冒号后面的字段名字可以自定义任意名字
cat > /etc/logstash/conf.d/logstash.conf << 'EOF'
input {
  beats {
    add_field => {"beatType" => "filebeat"}
    port => 5044
  }
}
 
filter {
  grok {
    match => {"message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?:%{GREEDYDATA} question for '(?<domain>[^']+)' from %{GREEDYDATA:client_ip}"}
  }
}

output {
  elasticsearch {
    hosts => ["127.0.0.1:9200"]
    index => "powerdns_recursor_test"
    user => "elastic"
    password => "xxxxx"
  }
}
EOF

上面的grok正则匹配,拿去kibana调试一下,看是否能取出想要的字段和值。需要复制一段非结构化日志

  • 在devtools工具里

image-20240410173101421

  • 找到grok debugger

Sample Data:

 Apr 9 11:48:41 rec-pdns-d2 pdns_recursor[4370]: 3 [2147048/2] question for 'pds-app-cn-beijing.cn-beijing.log.aliyuncs.com|A' from 192.168.187.208

Grok Pattern:

%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?:%{GREEDYDATA} question for '(?<domain>[^']+)' from %{GREEDYDATA:client_ip}

image-20240410173022508

能获取完整json字段为成功

{
  "syslog_hostname": "rec-pdns-d2",
  "syslog_timestamp": "Apr 9 11:48:41",
  "domain": "pds-app-cn-beijing.cn-beijing.log.aliyuncs.com|A",
  "client_ip": "192.168.187.208",
  "syslog_program": "pdns_recursor[4370]"
}

然后启动logstash

systemctl start logstash
systemctl enable logstash

#看日志是否有报错。正常是格式问题或者正则转义问题
journalctl -f -u logstash

进入head查看是否有数据和新增的字段

主要是client_ip、domain字段

image-20240410173328042
image-20240410173504716

进入kibana添加索引并查看discover是否有字段显示

image-20240410173637277

添加索引,并查看是否有字段

image-20240410173727051

image-20240410173827586

然后打开discover查看,有数据就是把非结构化日志成功转换了

image

过滤带有-号的domain字段的值,不然有些没匹配上的数据,都显示出来了,所以筛选出有域名的值

#输入下面过滤指令并搜索。因为我这里有历史数据,不断的调试,所以需要过滤出来。正常情况下,grok匹配之后会筛选出合适的日志再写入es索引的。
NOT domain: *-*

然后添加dashborad统计图,什么IP地址访问了什么域名,全公司人员谁在访问了什么网站、次数等等,一目了然。

把需要监控的字段添加进去

image-20240410174955564

最终效果

image-20240410174838575

注意:

grok的正则匹配并不是通用的,它内置了常用的syslog和其它服务的模板变量,由于powerdns没有提供相关的日志转换规则,所以有一半的正则是我自己自定义的,调试很久,最终才转成想要的效果。因为powerdns日志有多种非结构化的格式,弱水三千、只取一瓢,挑选了1条能够清晰看到来源IP和访问域名的日志格式,进行自定义正则过滤。

如果kibana没有字段显示,那就是logstash中grok正则配置错误,或者没有成功写入到es中。