По мере роста 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.
Андерс Лундстрём написал серию статей в блоге о распространенных запросах 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-адреса с минутой часа, чтобы определить, есть ли какие-либо регулярно повторяющиеся посещения, которые могут быть сценариями. Это будет небольшая модификация сценария почасовых обращений.
На любых сайтах, не связанных с программированием, поиск в журналах ключевых слов 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, может быть хорошим способом выявления атак по сценарию.