Uma Breve Introdução Didática à Análise de Logs

Como detetives e parceiros(as) ciumentos(as) muito bem sabem, dá pra inferir muita coisa interessante sobre o que você tem feito somente examinando a lista de chamadas recebidas e enviadas do seu telefone celular. Vários outros sistemas de informática também registram suas atividades em listas de eventos que, no jargão de informática, são chamadas de "logs". No post de hoje, vou tentar explicar como os logs, entre suas mil e uma utilidades, também são usados para detectar e analisar falhas de controle de acesso ou outras perspectivas de segurança.

O que são "Logs"?

Quase todo sistema computacional gera logs. Seu extrato do banco é um log, registrando quanto dinheiro entrou e saiu da sua conta, de onde ele veio, pra onde ele foi, etc. A lista de chamadas que aparece na sua conta telefônica também é um tipo de um log (curiosamente, eles não costumam mostrar todas as ligações, porque senão a lista seria muito longa; pra encurtar, a praxe é só mostrar aqueles itens tarifados de forma "diferenciada"). Dá pra saber muito sobre sua vida observando de onde você recebe dinheiro, no que você o gasta, quem telefona pra você e pra quem você telefona.

Enfim, resumidamente, pode-se definir um "log" como sendo um registro cronológico sistemático de eventos ou atividades. Assim, o livro de visitas de um museu também pode ser considerado um log, bem como o conteúdo de um cartão de ponto que registra o horário de entrada e saída de um funcionário.

Há quem aceite a noção de que o "meu querido Diário" que muitas crianças e adolescentes (e até adultos) mantêm podem ser considerados um tipo de log. Aliás, vale lembrar que o próprio termo "blog" é contração de "web log", pois os blogs originalmente eram uma espécie de "meu querido diário na Web". Todavia, eles não são tão sistemáticos e regulares quanto os exemplos anteriores, o que leva muita gente a limitar a abrangência do termo "log" para incluir apenas os registros feitos por sistemas automáticos e programas de computador.

Um Exemplo: Anatomia dos Logs do Site do Blog da Tempest

Pra muita gente, a Web é sinônimo de Internet, então nada mais natural do que usarmos logs de websites como exemplo. Os servidores web são programas de computador que atendem os pedidos dos navegadores dos visitantes em um site. Cada vez que atendem um pedido, registram em um arquivo-texto alguns dados descrevendo de onde o pedido veio, o que foi pedido, como ele tratou o pedido, se deu tudo certo, e o que exatamente foi fornecido. Vejamos um trechinho do log gerado pelo servidor web que atende esse nosso site do blog da Tempest:

[01] 2010-09-27 14:35:28 187.78.73.74 200 9764 blog.tempest.com.br:80
Mozilla/4.0_(compatible;_MSIE_8.0;_Windows_NT_6.1;_Trident/4.0;
 _SLCC2;_.NET_CLR_2.0.50727;_.NET_CLR_3.5.30729;_.NET_CLR_3.0.30729;
 _Media_Center_PC_6.0;_.NET4.0C;_.NET4.0E;_Tablet_PC_2.0;_MS-RTC_LM_8) 
http://www.google.com.br/url?sa=t&source=web&cd=1&ved=0CBUQFjAA&
 url=http%3A%2F%2Fblog.tempest.com.br%2F&rct=j&q=Tempest%20Blog
 &ei=zNWgTIKoH4L78Aa_2MnLDw&usg=AFQjCNF54Gi_aoBj1pmLRQXAAC1k3x_WTw 
/index.html.gz

[02] 2010-09-27 14:35:29 187.78.73.74 200 1829 blog.tempest.com.br:80 
Mozilla/4.0_(compatible;_MSIE_8.0;_Windows_NT_6.1;_Trident/4.0;
 _SLCC2;_.NET_CLR_2.0.50727;_.NET_CLR_3.5.30729;_.NET_CLR_3.0.30729;
 _Media_Center_PC_6.0;_.NET4.0C;_.NET4.0E;_Tablet_PC_2.0;_MS-RTC_LM_8) 
http://blog.tempest.com.br/ 
/static/themes/nonzero_blue/style.css.gz

[03] 2010-09-27 14:35:29 187.78.73.74 200 449 blog.tempest.com.br:80 
Mozilla/4.0_(compatible;_MSIE_8.0;_Windows_NT_6.1;_Trident/4.0; 
 _SLCC2;_.NET_CLR_2.0.50727;_.NET_CLR_3.5.30729;_.NET_CLR_3.0.30729;
 _Media_Center_PC_6.0;_.NET4.0C;_.NET4.0E;_Tablet_PC_2.0;_MS-RTC_LM_8) 
http://blog.tempest.com.br/ 
/static/themes/nonzero_blue/images/n2.gif

[04] 2010-09-27 14:35:29 187.78.73.74 200 1014 blog.tempest.com.br:80 
Mozilla/4.0_(compatible;_MSIE_8.0;_Windows_NT_6.1;_Trident/4.0;
 _SLCC2;_.NET_CLR_2.0.50727;_.NET_CLR_3.5.30729;_.NET_CLR_3.0.30729;
 _Media_Center_PC_6.0;_.NET4.0C;_.NET4.0E;_Tablet_PC_2.0;_MS-RTC_LM_8) 
http://blog.tempest.com.br/
/static/themes/nonzero_blue/images/n1.gif

[05] 2010-09-27 14:35:29 187.78.73.74 200 155 blog.tempest.com.br:80 
Mozilla/4.0_(compatible;_MSIE_8.0;_Windows_NT_6.1;_Trident/4.0;
 _SLCC2;_.NET_CLR_2.0.50727;_.NET_CLR_3.5.30729;_.NET_CLR_3.0.30729;
 _Media_Center_PC_6.0;_.NET4.0C;_.NET4.0E;_Tablet_PC_2.0;_MS-RTC_LM_8) 
http://blog.tempest.com.br/
/static/themes/nonzero_blue/images/n3.gif

[06] 2010-09-27 14:35:30 187.78.73.74 200 72 blog.tempest.com.br:80 
Mozilla/4.0_(compatible;_MSIE_8.0;_Windows_NT_6.1;_Trident/4.0;
 _SLCC2;_.NET_CLR_2.0.50727;_.NET_CLR_3.5.30729;_.NET_CLR_3.0.30729;
 _Media_Center_PC_6.0;_.NET4.0C;_.NET4.0E;_Tablet_PC_2.0;_MS-RTC_LM_8)
http://blog.tempest.com.br/
/static/themes/nonzero_blue/images/n5.gif

[07] 2010-09-27 14:35:30 187.78.73.74 200 70 blog.tempest.com.br:80
Mozilla/4.0_(compatible;_MSIE_8.0;_Windows_NT_6.1;_Trident/4.0;
 _SLCC2;_.NET_CLR_2.0.50727;_.NET_CLR_3.5.30729;_.NET_CLR_3.0.30729;
 _Media_Center_PC_6.0;_.NET4.0C;_.NET4.0E;_Tablet_PC_2.0;_MS-RTC_LM_8) 
http://blog.tempest.com.br/
/static/themes/nonzero_blue/images/n6.gif

[08] 2010-09-27 14:36:55 187.78.73.74 200 3731 www.tempest.com.br:80 
Mozilla/4.0_(compatible;_MSIE_8.0;_Windows_NT_6.1;_Trident/4.0;
 _SLCC2;_.NET_CLR_2.0.50727;_.NET_CLR_3.5.30729;_.NET_CLR_3.0.30729;
 _Media_Center_PC_6.0;_.NET4.0C;_.NET4.0E;_Tablet_PC_2.0;_MS-RTC_LM_8) 
http://blog.tempest.com.br/
/index.html

[09] 2010-09-27 14:37:21 187.78.73.74 200 9049 blog.tempest.com.br:80 
Mozilla/4.0_(compatible;_MSIE_8.0;_Windows_NT_6.1;_Trident/4.0;
 _SLCC2;_.NET_CLR_2.0.50727;_.NET_CLR_3.5.30729;_.NET_CLR_3.0.30729;
 _Media_Center_PC_6.0;_.NET4.0C;_.NET4.0E;_Tablet_PC_2.0;_MS-RTC_LM_8)
http://blog.tempest.com.br/
/marco-carnut/outro-caso-dados-pessoais-acessiveis.html.gz

Como dá pra ver até de relance, logs de servidores web são longos, feiosos e esquisitos para quem não está acostumado com eles. Nesse exemplo, eu já fiz várias coisas para torná-los menos feios e mais legíveis: eu cortei as linhas longas em parágrafos separados por uma linha em branco, numerei cada linha para facilitar referenciá-los aqui no texto e quebrei o campo "Mozilla/4.0" em várias linhas, pra fazer o texto todo caber dentro de uma largura razoável sem ter que usar barras de rolagem horizontais no seu navegador.

O primeiro campo que você vê após o número da linha entre colchetes é a data e hora do evento, com precisão de um segundo. Só esse campo já nos diz coisas interessantes: os eventos do 01 a 07 aconteceram em um intervalo de 2 segundos entre si – isso foi o navegador carregando a página de entrada do Blog. Uma única página às vezes gera vários eventos no log porque diferentes partes da página são requisitados independentemente – o evento 01 se referiu ao texto da página em si, o evento 02 tratou-se da "folha de estilos" que dá as cores e formatação visual à página e os eventos de 03 a 07 relatam a transferência de algumas figuras (os ícones ao lado do 'postado por' e do número de comentários, o zebrado azul inclinado no fundo da seção de título e o degradê cinza nas abas de navegação). O fato de tudo isso ter levado só dois segundos é porque o próprio navegador se encarrega de baixar automaticamente os componentes da página, sem requerer nenhuma ação por parte do usuário.

O segundo campo (187.78.73.74) nos dá o endereço IP de onde a conexão se originou. É como o identificador de chamadas (conhecido vulgarmente como "Bina") do seu telefone – ele diz o número de origem da "ligação". Há várias semelhanças e diferenças entre os endereços IP e os números de telefone. Todo computador na Internet tem um endereço IP, mas é preciso lembrar que ele pode ser mascarado por firewalls, roteadores, proxies ou outros tipos de intermediários, da mesma forma que se alguém te ligar através de um PABX, o número de telefone que aparece no seu bina é o da linha-tronco do PABX e não o do ramal que te ligou. Da mesma forma, o endereço IP mais ou menos identifica "de onde" a conexão veio, mas só até certo ponto – apenas até a borda entre o provedor de Internet e a rede interna da residência ou empresa que é cliente daquele provedor.

Não obstante, se consultarmos esse endereço IP no site do registro.br (a autoridade brasileira que aloca os endereços IP para os provedores), veremos que ele pertence a uma empresa chamada "Tele Norte Leste Participações S.A.", popularmente conhecida como "Telemar", que passou a se chamar Oi há uns anos atrás. Isso que fizemos é um exemplo modesto de uma "correlação" – cruzarmos o dado que obtivemos no nosso log com o banco de dados de uma outra instituição.

O próximo campo no nosso log de exemplo é sempre o valor "200", que, segundo a especificação técnica do protocolo HTTP, é um código númerico significando "Ok" ou "Tudo certo". Nesse trecho que selecionei para mostrar para vocês, todas os acessos foram bem sucedidos. Todavia, algumas coisas poderiam ter dado errado: por exemplo, se o navegador do usuário tivesse requisitado uma página que não existe no meu site (digamos, '/marco-carnut/alguma-pagina-doida-que-nao-existe.html'), o servidor web teria respondido com o código 404, que significa "Não Encontrado". Se seu navegador tivesse requisitado uma página à qual não tivesse permissão de acessar, ele receberia o código 403 ("Priobido" ou "Permissão Negada") – código esse que também seria registrado no log. A crescente popularidade dos códigos de retorno do protocolo HTTP pode ser vista nesse adorável exemplo de humor nerd: roupas de baixo femininas escrito "200", "403", etc., para as moças comunicarem seus status de acessibilidade.

O próximo campo é um número que diz o tamanho, em bytes, do objeto que o servidor mandou em resposta ao navegador.

O campo seguinte diz qual para qual "site virtual" o pedido foi direcionado. Explico: um mesmo servidor web pode ser responsável por vários sites. É o que acontece no par formado pelo site institucional da Tempest (www.tempest.com.br) e o site do Blog (blog.tempest.com.br) – para o servidor, os dois são apenas "pastas" diferentes, mas, para o navegador, aparecem como sites completamente distintos.

No trecho acima, esse campo nos diz uma coisa interessante: nas linhas de 01 a 07, o usuário vinha acessando o site do blog.tempest.com.br:80, ao passo que na linha 08, ele acessou o site www.tempest.com.br:80, o que nos diz que ele deve ter clicado no link para o site principal da Tempest contido no subtítulo 'o dia-a-dia da equipe da Tempest'.

O campo seguinte, tão longo que precisei parti-lo em três linhas, é a identificação do navegador, indicando se ele é um Internet Explorer, Firefox, Chrome, etc.; identifica também o número da versão, sob qual sistema operacional está rodando, etc. No nosso exemplo, o trecho "MSIE_8.0" nos informa tratar-se de um Interent Explorer 8 e o "Windows_NT_6.1" é o nome 'oficial' do que se conhece mercadologicamente como Windows Vista.

É importante notar, porém, que o envio desse campo é voluntário e, como ele não é essencial para o funcionamento do site, ele pode ser omitido ou alterado – ou seja, o navegador pode mentir sobre sua identidade. O navegador Opera, por exemplo, possui uma opção facilmente acessível onde se pode fazer com que ele se identifique como sendo um Internet Explorer ou qualquer outro navegador. Essa prática se chama "User Agent Spoofing".

O próximo e penúltimo campo é o chamado "Referrer" e nos diz em qual endereço aquela janela do navegador estava antes de iniciar o novo acesso. Ou seja, quando você clica em um link pra o site, o navegador informa, para esse novo site para onde você o está levando, qual era o endereço do site em que ele estava antes. Isso é tremendamente útil para os gestores do site aprenderem "como é que o usuário chega no meu site".

Na linha 01, o Referrer também é enorme – tive de parti-lo em três linhas para caber na largura da página. Mas note que ele começa com "http://wwww.google.com.br", indicando que esse usuário chegou até nós através do Google. Não vou explicar aqui todos os detalhes dos parâmetros que o Google aceita nos seus endereços, mas dá pra ver um trecho dizendo q=Tempest%20Blog: isso significa que o usuário chegou até nos digitando "Tempest Blog" no Google (o %20 siginfica "espaço" na notação de percent-encoding).

O último campo indica o que foi que o navegador realmente pediu ao site. Por convenção, a página inicial de um site se chama "index.html" – o navegador pede essa página quando o usuário não dita nenhuma página específica no endereço do site. O programa específico que usamos como servidor web no Blog informa não exatamente o que o navegador pediu, mas o que ele entregou. Na linha 01, o nosso servidor web entregou o arquivo "index.html.gz", que é uma versão compactada do "index.html", pois ele identificou que o navegador entende páginas compactadas. O uso da compactação torna o carregamento das páginas web mais veloz e economiza banda.

Como disse anteriormente, nas linhas 02 a 07, pode-se ver o servidor enviando a folha de estilos (chamada styles.css.gz, indicando que também foi enviada a versão compactada) e as várias figurinhas acessórias, chamadas n1.gif, n2.gif,..., até n6.gif. Na linha 08, como também já dissemos, vimos o usuário visitar a página principal da Tempest. E na linha 09, vemos o usuário acessando um dos meus posts intitulado "Outro Caso de Dados Pessoais Acessíveis".

Enfim, lendo-se os logs, dá pra saber de onde o usuário está acessando, o que foi acessado, aproximadamente quando e por quanto tempo se deu o acesso, como o usuário veio parar em nosso site, mais ou menos como ele saiu clicando e navegando por dentro do nosso site, qual o provável navegador e sistema operacional que ele usa, etc. E se correlacionarmos isso com o cadastro de clientes do provedor de acesso, podemos ter uma idéia razoável de quem ele(a) seja, ou, no mínimo, quem é que paga a conta da Internet dele(a).

Note que esse exemplo, apesar de qualitativamente realista, foi quantitativamente de muitíssima pequena escala, com apenas nove itens – pequeno o bastante para serem lidos individualmente um a um, como fizemos acima. Na "vida real", os logs são grandes demais pra serem lidos diretamente pelas pessoas. Para se ter uma idéia, os logs de alguns dos clientes da Tempest geram tipicamente centenas de milhares de itens (ou vários gigabytes) por hora.

Para dar conta de um volume tão grande, é preciso usar programas de computador para transformar esse "minério cru" em algo mais tratável. Esses programas usam uma série de técnicas sofisticadas – estatística, inteligência artificial, aprendizado de máquina, reconhecimento automático de padrões – para descartar o que é irrelevante e trazer à tona o que é relevante. Quando se deseja fazer uma análise mais detida, esses programas pinçam somente um trecho relativamente pequeno dos logs que satisfazem aos critérios de relevância.

Dá pra se ver que a análise de logs é um trabalho metódico e detalhista que requer entendimento profundo de como os sistemas computacionais funcionam, de como eles registram os eventos, e de qual é o contexto em que eles estão inseridos. Há quem considere também um trabalho enfadonho; eu, pessoalmente, não acho. É um pouco como um garimpo: você processa toneladas de entulho, mas algumas vezes é recompensado com algumas pepitas de ouro que ninguém mais acharia.

Algumas das Mil-e-uma Utilidades dos Logs

As informações que os logs oferecem têm diversas utilidades pra diferentes grupos de pessoas: o "pessoal da informática" costuma consultar os logs principalmente quando montam um novo site, para conferir que ele está funcionando; ou, para procurar defeitos quando alguém reclama que algo não está funcionando. Fora esses casos esporádicos, é raro eles lerem os logs. Alguns são negligentes a ponto de esquecer de apagá-los, fazendo com que o servidor pare simplesmente porque o log ficou tão grande que encheu todo o espaço no disco rígido.

Já a turma do marketing gosta de ler não os logs crus em si, mas versões destiladas deles que mostram análises estatísticas da demografia e os hábitos de navegação dos usuários. Há diversos produtos que captam os logs e os transformam em gráficos bonitos – talvez os mais famosos entre eles talvez sejam o Google Analytics e o Open Web Analytics. De uns anos atrás, vários livros têm sido escritos delineando essa nova disciplina de Análise de Logs voltado para Marketing, que tem se tornado conhecida como "Web Analytics".

Detetives e autoridades investigativas, por sua vez, usam os logs para rastrear pedófilos, estelionatários e malfeitores em geral. A data e hora, juntamente com o endereço IP, consistem nos dados que as polícias, juízes de direito e demais autoridades investigativas mais requisitam em casos de suspeitas de "crimes de informática" ou "auxiliados pela informática", pois consistem no primeiro passo para tentar identificar o perpetrador.

De fato, se fôssemos um policial suspeitando que o usuário de nosso exemplo acima tivesse cometido um ilícito, nosso próximo passo seria pedir a um juiz para intimar a Oi para que consulte nos seus logs a qual usuário o endreço IP 187.78.73.74 estava atribuído por volta de 27 de setembro de 2010, às 14:35:28. Dizemos "por volta" devido a um probleminha técnico: o relógio do computador onde está rodando nosso servidor web pode estar acertado diferente do relógio do computador da Oi que registrou a alocação do IP do usuário. Por isso, sempre que se faz correlação por data/hora, é necessário fazer uma "busca aproximada", para tratar esses casos de relógios desacertados, fusos horários e horários de verão, etc.

Apesar dessas complicações, a Oi provavelmente seria capaz de nos passar o cadastro dos prováveis usuários e isso já seria um grande ponto de partida para o nosso inquérito. Todavia, em um futuro artigo, vou mostrar várias artimanhas simples pelas quais esse endereço IP e vários outros itens do log podem ser mascarados, de forma que é sempre importante considerar esses dados apenas um "possível indício" e não necessariamente uma "evidência".

Quando um computador é invadido, os logs costumam ser o principal insumo para se fazer uma "autópsia digital" e tentar entender por onde e como o invasor procedeu – essa área tem se tornado conhecida como "Digital Forensics". Muitos sistemas também usam os logs como uma forma de "alarme antecipado", reconhecendo padrões de ataque antes que eles tenham sucesso (é comum o atacante falhar várias vezes antes de acertar) e alertando os "donos" do sistema.

Nesse artigo, por brevidade, focamos apenas em logs de servidores Web. Mas existem diversos outros programas de computador que geram logs, desde o seu próprio sistema operacional até o MSN, o próprio navegador, os sites que você visita, seu banco, e até mesmo a urna eletrônica. Cada tipo de máquina registra seus logs de maneira própria. Por isso, a disciplina de análise de logs tem se tornado, ao longo dos anos, muito, muito vasta.

Este artigo terá pelo menos duas continuações: eu vou seguir uma vertente versando sobre como mascarar nossos endereços IP nos logs, para dificultar o rastreamento por investigadores abelhudos ou abusivos. Já alguns dos membros da equipe de Gestão de Logs e Eventos da Tempest vão mostrar exemplos de como os logs podem ser usados para detectar estratégias de reconhecimento de vulnerabilidades e algumas tentativas de ataque em web sites.

Próximas partes

Comentários
Aceita-se formatação à la TWiki. HTML e scripts são filtrados. Máximo 15KiB.

 
Enviando... por favor aguarde...
Comentário enviado com suceso -- obrigado.
Ele aparecerá quando os moderadores o aprovarem.
Houve uma falha no envio do formulário!
Deixei uma nota para os admins verificarem o problema.
Perdoe-nos o transtorno. Por favor tente novamente mais tarde.
Guilherme Mendonca | 2011-06-18 12:16:02 | permalink | topo

Ótima abordagem, antes de entrar pra equipe de Log's na Tempest, foi um dos textos que enfatizou mais ainda a vontade de atuar neste campo, agradecimento ao Mestre Kiko por compartilhar sempre sua experiência (:

Marco Carnut | 2011-03-10 21:50:03 | permalink | topo

Guido,

Esse artigo na Wikipedia explica melhor e em mais detalhe do que eu jamais poderia.

-K.

Guido | 2011-03-09 23:31:12 | permalink | topo

O que significa Mozilla/4.0 que aparece nos logs? Tem alguma relação com a empresa Mozilla ?

ps: Timido Visitante Anônimo foi muito engraçado. :D

Aldo Albuquerque | 2010-10-05 10:18:23 | permalink | topo

Kiko;

Explicando um pouco mais sobre o que é o "Trident/4.0" nos logs:

"Trident (also known as MSHTML) is the name of the layout engine for Internet Explorer. The version that comes with IE 8 is 4.

The User Agent string includes the string 'Trident/4.0' in order to allow differentiation between the Internet Explorer 7 User Agent String and the Internet Explorer 8 User Agent string when running in Internet Explorer 7 Compatibility View.

All applications which display content based on a markup language use a layout engine. Gecko is the layout engine for Firefox, Camino, Netscape while WebKit is used in Safari & Chrome

For more info on Trident & layout engines, check these links: http://msdn.microsoft.com/en-us/library/dd371735(VS.85).aspx http://en.wikipedia.org/wiki/Trident(layout_engine) http://en.wikipedia.org/wiki/List_of_layout_engines "

(não sabia o que era e resolvi pesquisar :P )

Lucas Marques | 2010-10-04 12:37:57 | permalink | topo

Muito interessante! Fico no aguardo dos próximos textos.

balrog | 2010-10-03 23:26:35 | permalink | topo

muito bom o artigo, me esclareceu várias dúvidas que tinha sobre o assunto, valeu! :p