Consultas recomendadas do LogParser para monitoramento do IIS?

86

À medida que o estouro de pilha cresce, começamos a examinar atentamente nossos logs do IIS para identificar clientes HTTP problemáticos - coisas como web spiders desonestos , usuários que possuem uma página grande configurada para atualizar a cada segundo, scrapers únicos e mal escritos, complicados os usuários que tentam aumentar a página contam um zilhão de vezes e assim por diante.

Fiz algumas consultas ao LogParser que nos ajudam a identificar a maioria das esquisitices e anormalidades quando apontadas para um arquivo de log do IIS.

Principal uso de largura de banda por 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 atinge avgbyte exibido
------------------------------------------------- - ---- ------- -------
/favicon.ico 16774 522 8756028
/content/img/search.png 15342 446 6842532

Principais hits por 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
hits de URL
------------------------------------------------- - ----
/content/img/sf/vote-arrow-down.png 14076
/content/img/sf/vote-arrow-up.png 14018

Largura de banda e hits principais por 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
hits de totbytes do agente usuário do cliente
------------- ------------------------------------- -------- --------- -----
66.249.68.47 Mozilla / 5.0 + (compatível; + Googlebot / 2.1; 135131089 16640
194.90.190.41 omgilibot / 0.3 ++ omgili.com 133805857 6447

Largura de banda superior por hora por 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 cliente-agente 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

Principais hits por hora por 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 user user agent atinge totbytes
- ------------- ----------------------------------- ------ ---- --------
10 194.90.190.41 omgilibot / 0.3 ++ omgili.com 1503 29070370
12 66.249.68.47 Mozilla / 5.0 + (compatível; + Googlebot / 2.1 1363 13186302

O {filename}, é claro, seria um caminho para um arquivo de log do IIS, como

c:\working\sologs\u_ex090708.log

Eu fiz muitas pesquisas na Web para obter boas consultas do IIS LogParser e achei muito pouco. Esses 5, acima, nos ajudaram tremendamente a identificar clientes com problemas sérios. Mas eu estou pensando - o que estamos perdendo?

Que outras maneiras existem para dividir e cortar os logs do IIS (de preferência com consultas do LogParser ) para explorá-los em busca de anomalias estatísticas? Você tem alguma consulta boa do IIS LogParser executada em seus servidores?

Jeff Atwood
fonte
5
Referenciado por blog.stackoverflow.com/2009/07/podcast-63
Brad Gilbert:
Na consulta de uso de largura de banda superior, há a palavra-chave DISTINCT. Para que serve?
Jakub Šturc

Respostas:

19

Um bom indicador para atividades de hackers ou outros ataques é o número de erros por hora. O script a seguir retorna as datas e horas que tiveram mais de 25 códigos de erro retornados. Ajuste o valor dependendo da quantidade de tráfego no site (e da qualidade do seu aplicativo da 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

O resultado pode ser algo assim:

Data Hora 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
...

A próxima consulta detecta um número excepcionalmente alto de ocorrências em um único URL de um endereço IP . Neste exemplo, escolhi 500, mas pode ser necessário alterar a consulta para casos extremos (excluindo o endereço IP do Google London, por exemplo ;-).)

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
Data URL Acessos do endereço IP
---------- ----------------------------------- ----- ---------- ----
24/07/2009 /Login.aspx 111.222.111.222 1889
12/07/2009 /AccountUpdate.aspx 11.22.33.44 973
19/07/2009 /Login.aspx 123.231.132.123 821
21-07-2009 /Admin.aspx 44.55.66.77 571
...
splattne
fonte
a segunda consulta, já fazemos - observe o agrupamento em várias consultas. Por IP e User Agent, esse é o melhor dos dois mundos, pois se o User Agent for nulo, será o mesmo que IP; caso contrário, será mais informação.
21411 Jeff Atwood
Ok Jeff, adicionar o agente do usuário faz sentido. Desculpe, uma combinação de memória ruim de curto prazo e transtorno de déficit de atenção. :-)
splattne
substituindo o havingcom um Limit npode fazer para uma boa maneira de ajustar a primeira consulta
BCS
6

Uma coisa que você pode considerar para filtrar o tráfego legítimo (e ampliar seu escopo) é ativar cs(Cookie)nos logs do IIS, adicionar um pouco de código que defina um pequeno cookie usando javascript e adicionar WHERE cs(Cookie)=''.

Devido ao seu pequeno pedaço de código, todo usuário deve ter um cookie, a menos que tenha desativado manualmente os cookies (o que uma pequena porcentagem de pessoas pode fazer) ou a menos que esse usuário seja realmente um bot que não suporta Javascript (por exemplo, wget, httpclient , etc. não suportam Javascript).

Suspeito que se um usuário tiver um alto volume de atividades, mas aceitar cookies e ativar o javascript, é mais provável que seja um usuário legítimo, enquanto que se você encontrar um usuário com um alto volume de atividades, mas sem suporte a cookies / javascript , é mais provável que sejam um bot.

Adam Brand
fonte
6

Desculpe, não posso comentar ainda, então sou obrigado a responder.

Há um pequeno erro na consulta 'Uso da largura de banda principal por URL'. Embora na maioria das vezes você esteja bem, aceitando suas solicitações de uma página e multiplicando pelo tamanho do arquivo, nesse caso, como você não está prestando atenção a nenhum parâmetro de consulta, encontrará algumas números muito imprecisos.

Para um valor mais preciso, basta fazer um SUM (sc-bytes) em vez de MUL (Hits, AvgBytes) como ServedBytes .

James Skemp
fonte
4

Convém procurar as solicitações mais longas (hastes e / ou consultas) e aquelas com mais bytes recebidos pelo servidor. Eu também tentaria um que agrupasse os bytes recebidos e o IP, para que você possa ver se um formato de solicitação específico provavelmente é repetido por um 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

Também contaria as ocorrências para o grupo de IP solicitante por uma hora e minuto do dia ou agruparia o IP solicitante com o minuto da hora para descobrir se há visitas recorrentes regularmente que possam ser scripts. Isso seria uma pequena modificação no script de hits por hora.

Em sites não-programação, procurando seus logs por palavras-chave SQL também é uma boa idéia, coisas como SELECT, UPDATE, DROP, DELETEe outras esquisitices, como FROM sys.tables, ORing que juntos e contando por IP parece acessível. Para a maioria dos sites, incluindo esses, as palavras raramente apareceriam na parte de consulta do URI, mas aqui elas podem aparecer legitimamente no tronco e nas partes de dados do URI. Gosto de reverter os IPs de qualquer ocorrência apenas para ver quem está executando scripts pré-fabricados. Eu tendo a ver .ru, .br, .cze .cn. Não pretendo julgar, mas tenho tendência a bloqueá-los a partir de agora. Em sua defesa, os países geralmente são maioritariamente habitado, embora, até agora, não vejo muito de, digamos .in, .fr, .usou .aufazendo o mesmo.

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 Não consigo verificar se essas consultas realmente seriam executadas corretamente. Por favor, edite-os livremente se eles precisarem de correção.

dlamblin
fonte
3

Todos foram encontrados aqui (que é um excelente guia para analisar seus arquivos de log do IIS, btw):

20 arquivos mais recentes em seu site

logparser -i: FS "SELECIONE 20 caminhos principais, CreationTime de c: \ inetpub \ wwwroot *. * PEDIDO POR 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 arquivos modificados mais recentemente

logparser -i: FS "SELECT TOP 20 Path, LastWriteTime de 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

Arquivos que resultaram em 200 códigos de status (no caso de trojans serem excluídos)

logparser "SELECT DISTINCT TO_LOWERCASE (cs-uri-stem) COMO URL, Count ( ) AS Acessado por ex .log WHERE sc-status = 200 GRUPO POR URL ORDEM POR URL" -rtp: -1

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

Mostrar qualquer endereço IP que chegue à mesma página mais de 50 vezes em um único dia

logparser "SELECT DISTINCT date, cs-uri-stem, c-ip, Count ( ) AS Acessos do ex .log GROUP BY date, c-ip, cs-uri-stem TENDO Hits> 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
GregD
fonte
Eu olhei para eles e não os achei particularmente úteis. Eles são na sua maioria "encontrar o compromisso" e isso não é realmente o nosso objetivo (não ter sido comprometida)
Jeff Atwood
0

Não sei como fazer isso com o LogParser, mas procurar sequências de solicitações para coisas como "phpMyAdmin" (ou outras recompensas comuns) que obtêm 404s podem ser uma boa maneira de identificar ataques com script.

BCS
fonte
o objetivo não é encontrar ataques com script desse tipo, mas clientes irresponsáveis ​​/ com problemas relacionados à largura de banda e tráfego.
9119 Jeff Atwood
2
Eu diria que qualquer cliente que está tentando me machucar é um cliente problemático e eu prefiro não tê-los usando minha largura de banda.
BCS