推荐使用LogParser查询进行IIS监视吗?


86

随着Stack Overflow的增长,我们开始仔细查看IIS日志以识别有问题的HTTP客户端-诸如流氓网络蜘蛛,设置大页面以每秒刷新一次的用户,写得不好的一次性网络抓取工具,棘手的问题尝试增加页面的用户数以千计的次数,依此类推。

我提出了一些LogParser查询,这些查询可以帮助我们识别指向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
网址命中avgbyte
-------------------------------------------------- ---- ------- -------
/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
客户端用户代理的总字节数
------------- ----------------------------------------------------- -------- --------- -----
66.249.68.47 Mozilla / 5.0 +(兼容; + Googlebot / 2.1; 135131089 16640
194.90.190.41 omgilibot / 0.3 ++ omgili.com 133805857 6447

IP / User-Agent每小时最高带宽

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
小时客户端用户代理的总字节数
-------------- ----------------------------------- ------ -------- ----
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客户端用户代理命中的字节数
-------------- ----------------------------------- ------ ---- --------
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

我进行了大量的Web搜索,以查找良好的IIS LogParser查询,但很少发现。上面的这5个,极大地帮助我们确定了严重的问题客户。但我想知道-我们还缺少什么?

还有哪些其他方式可以对IIS日志进行切片和切块(最好使用LogParser查询),以将其挖掘为统计异常?您是否在服务器上运行任何良好的IIS LogParser查询?



在带宽使用率最高的查询中,有DISTINCT关键字。到底有什么好处呢?
JakubŠturc10年

Answers:


19

黑客活动或其他攻击的一个很好的指标是每小时错误的数量。以下脚本返回已返回超过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 IPAddress命中
---------- ----------------------------------- ----- ---------- ----
2009-07-24 /Login.aspx 111.222.111.222 1889
2009-07-12 /AccountUpdate.aspx 11.22.33.44 973
2009-07-19 /Login.aspx 123.231.132.123 821
2009-07-21 /Admin.aspx 44.55.66.77 571
...

在第二个查询中,我们已经做过-请注意几个查询中的分组。就IP和用户代理而言,这是两全其美的方法,因为如果用户代理为null,则它与IP相同,否则,这是更多信息。
杰夫·阿特伍德

好的,Jeff,添加用户代理很有意义。抱歉,短时记忆不佳和注意缺陷症相结合。:-)
splattne

havinga 代替Limit n可能是调整第一个查询的好方法
BCS

6

您可以考虑过滤掉合法流量(并扩大范围)的一件事是cs(Cookie)在IIS日志中启用该功能,添加一些使用javascript设置小Cookie的代码,然后添加WHERE cs(Cookie)=''

由于您的代码很少,每个用户都应该有一个cookie,除非他们手动禁用了cookie(一小部分人可能会这样做),或者除非该用户实际上是不支持Javascript的机器人(例如,wget,httpclient) ,等等。不支持Javascript)。

我怀疑如果用户的活动量很大,但是他们接受cookie并启用了javascript,则他们更有可能是合法用户,而如果您发现用户的活动量很大却没有cookie / javascript支持,他们更有可能成为机器人。


6

抱歉,还不能发表评论,所以我不得不回答。

“ URL最大带宽使用率”查询存在一个小错误。虽然大多数情况下您可以接受页面请求并乘以文件大小,但是在这种情况下,由于您不关注任何查询参数,因此您会遇到一些-非常不准确的数字。

为了获得更准确的值,只需执行SUM(sc-bytes)而不是MUL(Hits,AvgBytes)作为ServedBytes即可




4

您可能想要查找最长的请求(词根和/或查询),以及服务器接收到的最大字节的请求。我还将尝试一种将接收到的字节和IP分组的协议,以便您可以查看某个IP是否可能重复一种特定的请求格式。

SELECT TOP 30
cs-uri-stem,
cs-uri-query,
c-ip as Client, 
SUBSTR(cs(User-Agent), 0, 70) as Agent, 
cs-bytes,
c-ip,
FROM {filename} 
WHERE cs-uri-stem != '/search'
ORDER BY LEN(cs-uri-query) desc

SELECT TOP 30
COUNT(*) AS Hits
cs-uri-stem,
cs-uri-query,
c-ip as Client, 
SUBSTR(cs(User-Agent), 0, 70) as Agent, 
cs-bytes,
c-ip,
FROM {filename} 
GROUP BY c-ip, cs(User-Agent), cs-bytes 
ORDER BY Hits desc

我还会计算一天中一小时和一分钟内请求IP的组的匹配次数,或者将请求IP与一小时中的分钟进行分组,以查找是否有可能是脚本的定期重复访问。这将是对点击数小时脚本的小修改。

在任何非编程网站,搜索你的日志,SQL关键字也是一个不错的主意,诸如此类SELECTUPDATEDROPDELETE和其他古怪像FROM sys.tables,或门一起,并通过IP计数似乎得心应手。对于包括这些站点的大多数站点,这些单词很少会出现在URI的查询部分中,但是在这里,它们可能合法地出现在URI词干和数据部分中。我喜欢颠倒任何歌曲的IP,只是看看谁在运行预制脚本。我倾向于认为.ru.br.cz.cn。我并不是要判断,但是我倾向于从现在开始阻止他们。在他们的防守,这些国家一般多是居住,虽然我到目前为止我没有看到太多的发言权.in.fr.us.au做同样的。

SELECT TOP 30
c-ip as Client, 
SUBSTR(cs(User-Agent), 0, 70) as Agent, 
cs-uri-stem,
LOWER(cs-uri-query) AS q,
count(*) as Hits,
SUM(sc-bytes) AS BytesSent,
SUM(cs-bytes) AS BytesRecv
FROM {filename} 
WHERE q like '%select%' OR q like '%sys.tables%' OR etc... 
GROUP BY c-ip, cs(User-Agent) 
ORDER BY Hits desc

PS我无法验证这些查询是否可以正确运行。如果需要修复,请自由编辑。


3

这些都是在这里找到的(btw是解析IIS日志文件的绝佳指南):

您网站上的20个最新文件

logparser -i:FS“从c:\ inetpub \ wwwroot *。* ORDER BY CreationTime DESC选择SELECT TOP 20路径,CreationTime” -rtp:-1

Path                                                        CreationTime
----------------------------------------------------------- ------------------
c:\inetpub\wwwroot\Default.asp                              6/22/2003 6:00:01
c:\inetpub\wwwroot\About.asp                                6/22/2003 6:00:00
c:\inetpub\wwwroot\global.asa                               6/22/2003 6:00:00
c:\inetpub\wwwroot\Products.asp                             6/22/2003 6:00:00

20个最近修改的文件

logparser -i:FS“从c:\ inetpub \ wwwroot *。* ORDER BY LastWriteTime DESC订购SELECT TOP 20路径,LastWriteTime” -rtp:-1

Path                                                        LastWriteTime
----------------------------------------------------------- ------------------
c:\inetpub\wwwroot\Default.asp                              6/22/2003 14:00:01
c:\inetpub\wwwroot\About.asp                                6/22/2003 14:00:00
c:\inetpub\wwwroot\global.asa                               6/22/2003 6:00:00
c:\inetpub\wwwroot\Products.asp                             6/22/2003 6:00:00

导致产生200个状态代码的文件(以防删除木马)

logparser“ 从前 .log WHERE sc-status = 200 GROUP BY URL OR BY BY URL中选择SELECT DISTINCT TO_LOWERCASE(cs-uri-stem)AS URL,Count()AS命中 ” -rtp:-1

URL                                      Hits
---------------------------------------- -----
/About.asp                               122
/Default.asp                             9823
/downloads/setup.exe                     701
/files.zip                               1
/Products.asp                            8341
/robots.txt                              2830

显示一天中点击同一页面超过50次的任何IP地址

logparser“ 从前 .log GROUP BY日期,c-ip,cs-uri-stem中选择命中日期,cs-uri-stem,c-ip,Count()AS命中,且命中> 50 ORDER BY命中描述” -rtp: -1

date       cs-uri-stem                         c-ip            Hits
---------- ----------------------------------- --------------- ----
2003-05-19 /Products.asp                       203.195.18.24   281
2003-06-22 /Products.asp                       210.230.200.54  98
2003-06-05 /Products.asp                       203.195.18.24   91
2003-05-07 /Default.asp                        198.132.116.174 74

我查看了这些内容,但发现它们没有特别的帮助。他们大多是“找到妥协”,而这并不是我们的目标(我们并未受到损害)
Jeff Atwood 2009年

0

我不知道如何使用LogParser做到这一点,但是寻找诸如phpMyAdmin之类的请求字符串(或其他常见漏洞)来获取404,这可能是识别脚本攻击的好方法。


目标不是找到这种类型的脚本攻击,而是与带宽和流量相关的不负责任/有问题的客户端。
杰夫·阿特伍德

2
我会说任何试图伤害我的客户都是有问题的客户,而我不希望他们使用我的带宽。
BCS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.