随着 Stack Overflow 的发展,我们开始密切关注 IIS 日志,以识别有问题的 HTTP 客户端,例如流氓网络蜘蛛、每秒刷新一次大页面的用户、编写不佳的一次性网页抓取工具、尝试无数次增加页面计数的狡猾用户等等。
我想到了一些日志解析器当指向 IIS 日志文件时,查询可以帮助我们识别大多数异常和异常情况。
带宽使用率最高的 URL
SELECT top 50 DISTINCT
SUBSTR(TO_LOWERCASE(cs-uri-stem), 0, 55) AS Url,
Count(*) AS Hits,
AVG(sc-bytes) AS AvgBytes,
SUM(sc-bytes) as ServedBytes
FROM {filename}
GROUP BY Url
HAVING Hits >= 20
ORDER BY ServedBytes DESC
url 点击量 平均服务字节数 ------------------------------------------------- ----- ------- ------- /favicon.ico 16774 522 8756028 /content/img/search.png 15342 446 6842532
按 URL 排序的热门搜索
SELECT TOP 100
cs-uri-stem as Url,
COUNT(cs-uri-stem) AS Hits
FROM {filename}
GROUP BY cs-uri-stem
ORDER BY COUNT(cs-uri-stem) DESC
网址点击数 ------------------------------------------------- ----- /content/img/sf/vote-arrow-down.png 14076 /content/img/sf/vote-arrow-up.png 14018
按 IP/User-Agent 划分的最高带宽和点击量
SELECT TOP 30
c-ip as Client,
SUBSTR(cs(User-Agent), 0, 70) as Agent,
Sum(sc-bytes) AS TotalBytes,
Count(*) as Hits
FROM {filename}
group by c-ip, cs(User-Agent)
ORDER BY TotalBytes desc
客户端用户代理 totbytes 命中数 ------------- --------------------------------------------- --------- ----- 66.249.68.47 Mozilla/5.0+(兼容;+Googlebot/2.1; 135131089 16640 194.90.190.41 omgilibot/0.3++omgili.com 133805857 6447
按 IP/用户代理划分的每小时最高带宽
SELECT TOP 30
TO_STRING(time, 'h') as Hour,
c-ip as Client,
SUBSTR(cs(User-Agent), 0, 70) as Agent,
Sum(sc-bytes) AS TotalBytes,
count(*) as Hits
FROM {filename}
group by c-ip, cs(User-Agent), hour
ORDER BY sum(sc-bytes) desc
hr 客户端用户代理 totbytes 命中数 -- ------------- ----------------------------------------- -------- ---- 9 194.90.190.41 omgilibot/0.3++omgili.com 30634860 1549 10 194.90.190.41 omgilibot/0.3++omgili.com 29070370 1503
每小时 IP/User-Agent 热门点击次数
SELECT TOP 30
TO_STRING(time, 'h') as Hour,
c-ip as Client,
SUBSTR(cs(User-Agent), 0, 70) as Agent,
count(*) as Hits,
Sum(sc-bytes) AS TotalBytes
FROM {filename}
group by c-ip, cs(User-Agent), hour
ORDER BY Hits desc
hr 客户端用户代理命中数 totbytes -- ------------- ----------------------------------------- ---- -------- 10 194.90.190.41 omgilibot/0.3++omgili.com 1503 29070370 12 66.249.68.47 Mozilla/5.0+(兼容;+Googlebot/2.1 1363 13186302
{filename} 当然是 IIS 日志文件的路径,例如
c:\working\sologs\u_ex090708.log
我在网上搜索了很多好的 IIS LogParser 查询,但发现的很少。上述这 5 个查询对我们识别严重问题客户有很大帮助。但我想知道——我们遗漏了什么?
还有什么其他方法可以对 IIS 日志进行分片和切分(最好使用 LogParser 查询) 来挖掘统计异常?您在服务器上运行了任何好的 IIS LogParser 查询吗?
答案1
黑客活动或其他攻击的一个很好的指标是每小时的错误数量。以下脚本返回错误代码超过 25 个的日期和时间返回。根据站点上的流量(以及 Web 应用程序的质量 ;-) )调整该值。
SELECT date as Date, QUANTIZE(time, 3600) AS Hour,
sc-status as Status, count(*) AS ErrorCount
FROM {filename}
WHERE sc-status >= 400
GROUP BY date, hour, sc-status
HAVING ErrorCount > 25
ORDER BY ErrorCount DESC
结果可能是这样的:
日期 小时 状态 错误计数 ---------- -------- ------ ------ 2009-07-24 18:00:00 404 187 2009-07-17 13:00:00 500 99 2009-07-21 21:00:00 404 80 2009-07-03 04:00:00 404 45 ...
下一个查询检测到一个 IP 地址对单个 URL 的点击次数异常高。在这个例子中,我选择了 500,但你可能必须更改查询以适应边缘情况(例如,排除 Google London 的 IP 地址 ;-)。)
SELECT DISTINCT date AS Date, cs-uri-stem AS URL,
c-ip AS IPAddress, Count(*) AS Hits
FROM {filename}
GROUP BY date, c-ip, cs-uri-stem
HAVING Hits > 500
ORDER BY Hits Desc
日期 URL IP地址 点击数 ---------- ----------------------------------- --------------- ---- 2009-07-24 /登录.aspx 111.222.111.222 1889 2009-07-12 /帐户更新.aspx 11.22.33.44 973 2009-07-19 /登录.aspx 123.231.132.123 821 2009-07-21 /Admin.aspx 44.55.66.77 571 ...
答案2
为了过滤掉合法流量(并扩大范围),您可以考虑cs(Cookie)
在 IIS 日志中启用它,添加一些使用 javascript 设置小 cookie 的代码,然后添加WHERE cs(Cookie)=''
。
由于您的代码很少,每个用户都应该有一个 cookie,除非他们手动禁用 cookie(一小部分人可能会这样做)或者除非该用户实际上是一个不支持 Javascript 的机器人(例如,wget、httpclient 等不支持 Javascript)。
我怀疑如果用户的活动量很大,但他们接受 cookie 并启用了 javascript,那么他们更有可能是合法用户,而如果你发现一个用户的活动量很大但不支持 cookie/javascript,那么他们更有可能是一个机器人。
答案3
抱歉,我还不能发表评论,所以我不得不回答。
“按 URL 查询带宽使用量最高”查询存在一个小错误。虽然大多数情况下,您可以放心地将页面请求乘以文件大小,但在这种情况下,由于您没有注意任何查询参数,因此您会遇到一些略微或非常不准确的数字。
为了获得更准确的值,只需执行SUM(sc 字节)而不是MUL(Hits, AvgBytes) 作为 ServedBytes。
答案4
这家伙有十几个有用的问题: