freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

网站日志分析最完整实践
2020-09-23 19:39:42

分析网站日志可以帮助我们了解用户地域信息,统计用户行为,发现网站缺陷。操作会面临几个问题

  • 日志分析工具 splunk 如何使用?

  • 日志格式信息不全,如何配置日志打印出全面信息?

  • 有大量爬虫访问,并非真实流量,如何去掉这些流量?

  • 如果网站用了 CDN 加速,反向代理,网关等,日志打印的是这些设备的 ip,那么用户的真实 ip 如何获得呢?

阅读本文能帮您有效解决上述问题

splunk 安装使用

日志分析工具 splunk 是一款商业软件,但有免费版,免费版每天处理日志限制 500M 以内。对于简单分析,500M 也可以挖掘出很多信息了。本文使用免费版 splunk 分析 Apache 离线日志。
先要到 splunk 官网注册用户,注册用户填写的信息除邮箱外不需要真实,公司瞎填即可。注册完成到下载页面选择 Linux 64 位版本,
1600861390.png!small选择命令行下载,会给出一个 wget 的指令,
1600861391.png!small
复制 wgt 指令,到 Linux 上执行,得到压缩包。(wget 指令 splunk-8.0.5-xxx 的 xxx 每个人都不同)

[root@localhost splunk]# wget -O splunk-8.0.5-xxx-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.5&product=splunk&filename=splunk-8.0.5-xxx-Linux-x86_64.tgz&wget=true'

解压压缩包,到 bin 目录下执行

./splunk start

看见协议条款按 q,是否同意协议位置输入 y

Do you agree with this license? [y/n]: y

用户名输入 admin

密码输入 adminroot

出现

The Splunk web interface is at http://192.168.56.106:8000

表示启动成功。相比于开源工具(ELK,graylog)确实省心太多了。确保 Linux 防火墙是关闭状态,然后浏览器输入前面 8000 地址打开登录。首次会有引导教程指导如何上传文件。日常如果想上传文件,直接点击左上角 splunk->enterprise 进入主界面,然后选择添加数据,
1600861391.png!small

有多种添加数据的方式,这里选择上载,就是日志文件已经在我电脑里了,像上传附件一样传给 splunk。过程全部默认,上载文件需要等一段时间。Apache 日志设置「来源类型」时选择 web 里的 access_combined。
1600861392.png!small

下一步,「检查」,「提交」都是默认。显示文件上载成功,点击「开始搜索」按钮,搜索刚才上传的日志数据。
1600861519_5f6b354f635e3991fc6a5.png!small

搜索框是放搜索限制条件的,右下方是原始日志,左侧是各个字段的名称,这些字段是工具内置的,满足格式的日志会自动被解析出这些字段,比如每条日志开头都有个客户端的 ip,就是左侧的 clientip,鼠标点击 clientip 会看见统计结果,默认是出现频率最高的前 10 个 ip。如果要统计更多,需要在搜索框用对应语法查询。
1600861393.png!small

splunk 搜索语言介绍(SPL 语法)

语法用于在搜索框中使用,达到限制范围,统计所需要指标的目的。语法像「搜索引擎 + SQL + shell」的混合体。如果能熟练运用功能非常强大。

  • 基本语法,

    source="access2020-09-11.log" host="basicserver" sourcetype="access_combined"

    source 表示数据来源文件名,host 是 splunk 所在的主机名称,sourcetype 是导入时配置的。这些都可以变换,我想统计 10 号的数据,将 access2020-09-10.log 作为 source 就达到了效果。如果想查看 basicserver 里的所有数据不分日期,把 source 条件去掉,只保留 host 和 sourcetype 两个条件。搜索框最少要有一个条件。

  • 访问频率最高的 200 个 ip

    host="basicserver" | top clientip limit=200
  • 客户端 ip 的地理信息

    host="basicserver" | iplocation clientip

    执行后左侧下方「感兴趣的字段」会比刚才多出 City Country Region 字段,这些和客户端 ip 的地理位置是对应的。

  • 访问频率最高的十个城市

    host="basicserver" | iplocation clientip | top City limit=10
  • 地图查看 ip 分布

    host="basicserver" | iplocation clientip |  geostats count

    1600861549_5f6b356d75fe9606eb028.png!small

  • 有多少不同的 ip 访问网站

    host="basicserver"   | stats dc(clientip)
  • 所有日志记录按时间正序排列

    host="basicserver" | sort _time

    默认按照倒序,最新的日志排在最前面

  • 访问次数最少的 ip

    host="basicserver" | rare clientip
  • 被访问最多的 uri

    host="basicserver" | top uri limit=20
  • clientip 不等于某两个网段的记录

    host=basicserver clientip!="158.111.2.*"  clientip!="192.190.2.*"

    补充一句,搜索框可以输入很多条件,条件增多搜索框会随着变大,不要担心条件多装不下。

数据可视化

搜索栏下方依次有 事件、模式、统计信息、可视化 选项,最后的可视化选项能生成图表,最好是在搜索命令计算了某个统计指标,然后点击可视化。如果没计算指标直接点击可视化,配置会比较繁琐才能生成图表。

假设搜索栏统计某天访问次数最高的 20 个 clientip,命令为

source="access2020-09-11.log" | top clientip limit=20

执行完会在统计信息下方列出前 20 个 ip,点击可视化,选择柱状图。
1600861393.png!small

柱状图出来后,点击格式可以配置让坐标 ip 竖着显示,看着更舒服。
1600861394.png!small

ip 地址的地理信息数据库如何更新

统计 ip 的地理位置依赖于地理信息库,安装时有个内置的库,不是最新的。如果要更新到最新的需要到 https://dev.maxmind.com/zh-hans/geoip/geoip2/geolite2/下载最新的 GeoLite2-City.mmdb(要先注册),把这个文件复制到 splunk/share 目录下覆盖原来的同名文件即可。

删除数据

删除所有数据./splunk clean eventdata -f
删除属于索引 indexname 的数据 ./splunk clean eventdata -index indexname -f

Apache 日志需要注意的

common 和 combined 两种格式

日志格式有 common 和 combined 两种格式,combined 格式信息更全面,比 common 格式多了 refer 和 useragent 信息。下面是 apache/conf 下的 httpd.conf 文件里对两种格式的定义

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

如果 common 日志满足不了分析要求,可以把格式改成 common 格式。方法是修改 apache/conf 下的 httpd.conf 文件,把里面 CustomLog 末尾配置为 combined

CustomLog "|/opt/apache/bin/rotatelogs /opt/apache/logs/access%Y-%m-%d.log 86400" combined

无法直接看到用户真实 ip 怎么办

如果网站前方有反向代理或者网关,或者网站做了 CDN 加速,那么日志的 clientip 是代理服务器、网关或者 CDN 加速服务器的 ip,没什么分析价值。
1600861395.png!small

要获取用户真实 ip 可以修改 httpd.conf 的 LogFormat,加上%{X-FORWARDED-FOR}i(简称 XFF),我直接将 XFF 加到了%h 的后面,

LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b" common

假设网站有 CDN 加速(其它情况同理分析),按上面格式,每条日志首先打印的是 CDN 加速服务器 ip,然后是 XFF 的 ip(也就是用户真实 ip)。如果用户没有经过 CDN 直接访问,那么 XFF 就是一条横线」-「。下图就是用户直连网站的情况,clientip 就是用户的真实 ip。
1600861397.png!small

Apache 动态载入配置文件

修改完配置文件,不需要重启 Apache,到 Apache/bin 下执行./apachectl graceful 可以动态载入配置文件,不停止服务,新的配置立刻生效。

splunk 如何解析 XFF 字段

splunk 内置的 access_combined 和 access_common 格式都无法解析 XFF,如果要正确解析需要修改 splunk/etc/system/default/transforms.conf
新增 [xff] 段配置 XFF 的正则

[xff]
REGEX = \d{1,3}(\.\d{1,3}){2,3}

修改 [access-extractions] 段,在 clientip 后增加 ([[nspaces:xff]]\s++)?,用来匹配 XFF

[access-extractions]
REGEX = ^[[nspaces:clientip]]\s++([[nspaces:xff]]\s++)?[[nspaces:ident]]\s++[[nspaces:user]]\s++[[sbstring:req_time]]\s++[[access-request]]\s++[[nspaces:status]]\s++[[nspaces:bytes]](?:\s++"(?<referer>[[bc_domain:referer_]]?+[^"]*+)"(?:\s++[[qstring:useragent]](?:\s++[[qstring:cookie]])?+)?+)?[[all:other]]

[xff] 段的位置不重要,写在哪里都行。配置完成,重启 splunk,上传带有 XFF 的日志,左侧会看见「感兴趣的字段」出现了 xff
1600861579_5f6b358b8cc4a851fbccc.png!small

xff 字段的分析统计和 clientip 完全一样,只不过这是真实用户的 ip 了。

如何对付爬虫

通过分析日志,下列行为可以判断为爬虫

  • 该 ip 访问占比特高

  • useragent 明确说自己是哪家搜索引擎爬虫

  • 访问的 uri 明显不需要那么频繁访问

  • 非必要的凌晨访问 (不睡觉吗?)

  • 访问频率高(两分钟访问上千个 url)

搜索引擎的爬虫访问网站是为了收录网站数据。有一些恶意的爬虫会做坏事,除了抓数据还尝试登陆执行脚本等。爬虫访问的频率都很高会给网站带来负载,应该根据网站情况进行不同程度的限制。限制恶意爬虫只能封对方 ip。搜索引擎的爬虫可以通过配置 robots.txt 文件,以及在该引擎的站长平台配置或投诉来限制。

robots.txt

搜索引擎抓取数据会先读取网站根目录下的 robots.txt 文件,文件根据 robots 协议书写规则,文件的规则就是搜索引擎要遵守的规则。比如打开 https://www.taobao.com/robots.txt 可以看到淘宝的协议规定百度爬虫任何数据都不可以爬。

User-agent: Baiduspider
Disallow: /

如果要任何爬虫都不能爬任何数据,就写成

User-agent: *
Disallow: /

复杂的规则如指定引擎可以爬取某些目录,某些目录不可以爬,robots 协议也是支持的。
robots 协议是「君子协定」,它并没有通过技术手段限制爬虫,要靠爬虫的自觉遵守。
按我经验,百度、谷歌、360、字节、都能遵守协议,搜狗很流氓,不遵守协议。

有些请求的 useragent 写的是 Baiduspider,但可能是冒充百度爬虫,useragent 是可以自己设置的。要想判断一个 ip 是否是搜索引擎的爬虫可以使用,nslookup 或者 host 命令。这两个命令返回的域名信息可以看出来是否是爬虫。

# nslookup 49.7.21.76
Server:         219.141.136.10
Address:        219.141.136.10#53
Non-authoritative answer:
76.21.7.49.in-addr.arpa name = sogouspider-49-7-21-76.crawl.sogou.com.
# host 111.206.198.69
69.198.206.111.in-addr.arpa domain name pointer baiduspider-111-206-198-69.crawl.baidu.com.

另外,各大搜索引擎的站长平台会教如何判断 ip 是否是自己的爬虫,百度站长平台就有「轻松两步,教你快速识别百度蜘蛛」,介绍了百度蜘蛛 useragent 的格式和判断方法。

站长平台

搜索引擎都有站长平台,里面有很多相关的教程帮助更好的使用搜索引擎。注册站长平台时要证明自己有网站的管理权限,验证方法是可以将指定文件放置到网站根目录。成为站长后可以查询自己网站的索引收录情况,查询搜索引擎给网站带来的流量等指标。还可以投诉爬虫抓取频繁,设定抓取频率。有些平台公布邮箱可以投诉。

封 IP

对于恶意或者不遵守 robots 协议的爬虫,只能封 ip。网站源站用防火墙来封,CDN 加速服务器也都提供了封 ip 功能。配置了 CDN 加速的网站一定要封 xff 的 IP,因为大部分 clientip 都是 CDN 加速服务器的地址,封了这些地址很多正常用户就不能正常访问了。

总结

日志分析是从理性方面了解系统,分析结果可能会颠覆之前对系统的固有认知。对开发,运维,运营都能提供有价值的信息,建议大家有机会尝试一下。如果不想封禁爬虫 ip,可以在搜索栏排除爬虫 ip 的访问记录(xff!=」爬虫 ip」),这样既能排除干扰,还能和爬虫和平共处。

# 黑客 # 数据泄露 # 系统安全 # 恶意软件 # 企业安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者