随着堆栈溢出的增长,我们开始仔细研究IIS日志,以发现问题的HTTP客户端 – 例如stream氓networking蜘蛛 ,拥有大量页面的用户,每秒刷新一次,写得不好的一次性网页垃圾邮件,tricksy试图增加页面数量的用户,等等。
我已经想出了几个LogParser查询,这些查询帮助我们识别出大部分指向IIS日志文件的怪异和exception情况。
通过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命中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
url命中 ------------------------------------------------- - ---- /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命中 ------------- ------------------------------------- -------- --------- ----- Mozilla / 5.0 +(compatible; + 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
小时客户端用户代理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日志文件的path,例如
c:\working\sologs\u_ex090708.log
我做了很多网页search的好IIS LogParser查询,发现宝贵的一点。 以上这五点对于帮助我们确定严重的问题客户非常有帮助。 但是我想知道 – 我们错过了什么?
还有什么其他的方式来切片和切割IIS日志(最好使用LogParser查询 )挖掘他们的统计exception? 你有没有在你的服务器上运行的任何好的IIS LogParser查询?
黑客攻击或其他攻击的一个很好的指标是每小时的错误数量。 以下脚本返回返回的错误代码超过25个的date和小时数 。 根据网站上的stream量(以及您的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
结果可能是这样的:
date小时状态ErrorCount ---------- -------- ------ ------ 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上的命中数量非常高 。 在这个例子中,我select了500,但是您可能需要更改边缘案例的查询(例如,除了Google伦敦的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
dateURL 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 ...
有一件事你可以考虑过滤出合法的stream量(并扩大你的范围)是在IIS日志中启用cs(Cookie)
,添加一些代码,使用JavaScript设置一个小的cookie,并添加WHERE cs(Cookie)=''
。
由于你的代码less,所以每个用户都应该有一个cookie,除非他们手动禁用了cookies(小部分人可能会这样做),或者除非该用户实际上是一个不支持Javascript的bot(例如,wget,httpclient等不支持Javascript)。
我怀疑,如果用户有大量的活动,但他们接受cookie,并启用了JavaScript,他们更可能是一个合法的用户,而如果你find一个用户具有大量的活动,但没有cookie / javascript的支持,他们更可能是一个机器人。
对不起,还不能评论,所以我不得不回答。
“按url排列的最高带宽使用情况”查询存在一个小错误。 虽然大多数情况下你可以把你的请求放在一个页面上并乘以文件大小,在这种情况下,由于你没有关注任何查询参数,所以你会碰到一些轻微的非常不准确的数字。
为了获得更准确的值,只需要使用SUM(sc-bytes)而不是MUL(Hits,AvgBytes)作为ServedBytes 。
AndersLundström撰写了一系列有关常见LogParser查询的博客文章。
我一直在使用这些:
这家伙有十几个有用的查询:
您可能希望查找最长的请求(词干和/或查询),以及服务器收到的最多字节的请求。 我也会尝试通过收到的字节和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,或者用一分钟的时间将请求的IP分组,以查找是否有任何经常性的访问可能是脚本。 这将是小时脚本命中的一个小修改。
在任何非编程站点上,search日志中的SQL关键字也是一个好主意,像SELECT
, UPDATE
, DROP
, DELETE
和FROM sys.tables
等其他奇怪的FROM sys.tables
,将它们组合在一起并按IP进行计数似乎很方便。 对于包括这些在内的大多数网站来说,这些单词很less出现在URI的查询部分,但是在这里它们可能合法地出现在URI词干和数据部分中。 我喜欢颠倒任何命中的IP来查看谁在运行预制脚本。 我倾向于看到.ru
, .br
, .cz
和.cn
。 我不是故意去判断,但是我有点阻止他们。 在他们的防守中,这些国家通常大多是人口稠密的,尽pipe到目前为止,我看不出有太多的说.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我无法validation这些查询将实际运行正确。 如果需要修复,请自由编辑。
这些都在这里find(这是parsing你的IIS日志文件,顺便说一句优秀指南):
您的网站上20个最新的文件
logparser -i:FS“SELECT TOP 20 Path,CreationTime from c:\ inetpub \ wwwroot *。* ORDER BY CreationTime DESC”-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“SELECT TOP 20 Path,LastWriteTime from c:\ inetpub \ wwwroot *。* ORDER BY LastWriteTime DESC”-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“SELECT DISTINCT TO_LOWERCASE(cs-uri-stem)AS URL,Count( )AS命令从ex .log WHERE sc-status = 200 GROUP BY URL ORDER BY URL”-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“SELECT DISTINCT date,cs-uri-stem,c-ip,Count( )AS命令从ex .log GROUP BYdate,c-ip,cs -uri-stem HAVING命中> 50 ORDER BY Hits Desc”-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
我不知道如何处理LogParser,但是寻找诸如“phpMyAdmin”(或其他常见的可执行文件)的请求的string可能是识别脚本攻击的好方法。