Назад | Перейти на главную страницу

Рекомендуемые запросы LogParser для мониторинга IIS?

По мере роста 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
url                                                   hits  avgbyte  served
-------------------------------------------------     ----- -------  -------
/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                                                                    hits
-------------------------------------------------                      -----
/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
client         user-agent                                      totbytes   hits
-------------  ---------------------------------------------   ---------  -----
66.249.68.47   Mozilla/5.0+(compatible;+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
hr   client        user-agent                                  totbytes   hits
--   ------------- -----------------------------------------   --------   ----
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   client         user-agent                                  hits  totbytes
--   -------------  -----------------------------------------   ----  --------
10   194.90.190.41  omgilibot/0.3++omgili.com                   1503  29070370
12   66.249.68.47   Mozilla/5.0+(compatible;+Googlebot/2.1      1363  13186302

{Filename}, конечно же, будет путем к файлу журнала IIS, например

c:\working\sologs\u_ex090708.log

Я много раз искал в Интернете хорошие запросы IIS LogParser и нашел очень мало. Эти 5 выше очень помогли нам в выявлении серьезных проблемных клиентов. Но мне интересно - что нам не хватает?

Какие еще есть способы разрезать журналы IIS (желательно с запросами LogParser) майнить их на предмет статистических аномалий? Есть ли у вас какие-либо хорошие запросы IIS LogParser, которые вы запускаете на своих серверах?

Хорошим индикатором взлома или других атак является количество ошибок в час. Следующий скрипт возвращает даты и часы с более чем 25 кодами ошибок вернулся. Отрегулируйте значение в зависимости от количества трафика на сайте (и качества вашего веб-приложения ;-)).

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       Hour     Status 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
...

Следующий запрос обнаруживает необычно большое количество обращений к одному URL-адресу с одного IP-адреса. В этом примере я выбрал 500, но вам, возможно, придется изменить запрос для крайних случаев (исключая, например, IP-адрес Google London ;-).)

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
Date       URL                                 IPAddress       Hits
---------- ----------------------------------- --------------- ----
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
...

Одна вещь, которую вы могли бы рассмотреть, чтобы отфильтровать законный трафик (и расширить свой охват), - это включить cs(Cookie) в свои журналы IIS добавьте немного кода, который устанавливает небольшой файл cookie с использованием javascript, и добавьте WHERE cs(Cookie)=''.

Из-за небольшого фрагмента кода каждый пользователь должен иметь файл cookie, если он не отключил файлы cookie вручную (что может сделать небольшой процент людей) или если этот пользователь на самом деле не является ботом, который не поддерживает Javascript (например, wget, httpclient и т. д. не поддерживают Javascript).

Я подозреваю, что если у пользователя много активности, но он принимает файлы cookie и включен javascript, он, скорее всего, будет законным пользователем, тогда как если вы найдете пользователя с большим объемом активности, но без поддержки файлов cookie / javascript , они, скорее всего, будут ботами.

Извините, пока не могу комментировать, поэтому вынужден ответить.

Есть небольшая ошибка с запросом "Использование максимальной пропускной способности по URL". Хотя в большинстве случаев вы можете принимать запросы на страницу и умножать их на размер файла, в этом случае, поскольку вы не обращаете внимания на какие-либо параметры запроса, вы столкнетесь с некоторыми незначительными -очень неточные цифры.

Для более точного значения просто выполните СУММ (sc-байт) вместо MUL (Hits, AvgBytes) как ServedBytes.

У этого парня около десятка полезных запросов:

http://logparserplus.com/Examples/Queries.aspx

Возможно, вы захотите найти свои самые длинные запросы (основы и / или запросы), а также запросы с наибольшим количеством байтов, полученных сервером. Я бы также попробовал тот, который группирует по полученным байтам и 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 также является хорошей идеей, например SELECT, UPDATE, DROP, DELETE и другие странности вроде 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

P.S. Я не могу проверить, действительно ли эти запросы выполняются правильно. Пожалуйста, отредактируйте их, если они нуждаются в исправлении.

Все они были найдены Вот (который является отличным руководством по синтаксическому анализу файлов журналов IIS, кстати):

20 новейших файлов на вашем сайте

logparser -i: FS "ВЫБРАТЬ TOP 20 Path, CreationTime из 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 () КАК Хиты ОТ ex.log ГДЕ sc-status = 200 ГРУППА ПО URL-УПРАВЛЕНИЮ ПО URL-адресу "-rtp: -1

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

Показывать любой IP-адрес, который посещает одну и ту же страницу более 50 раз за день

logparser "ВЫБРАТЬ ОТЛИЧНУЮ дату, cs-uri-stem, c-ip, Count () КАК Хиты ОТ ex.log ГРУППА ПО дате, c-ip, cs-uri-stem ИМЕЕТ ХИТОВ> 50 ПОИСК ХИТОВ 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" (или других распространенных vunerablities), которые получают ошибки 404, может быть хорошим способом выявления атак по сценарию.