Uso do Cloudflare Logs (ELS) para investigar o tráfego DDoS (somente Enterprise)
Aprenda a identificar fontes de tráfego mal-intencionado classificando efetivamente o Cloudflare Logs (antigo ELS).
Neste artigo
- Visão geral
- Etapa 1: Reunir as informações necessárias antes de consultar os Cloudflare Logs
- 1ª etapa: Baixe e salve os logs
- Etapa 3: classificar os logs
- Exemplo de fluxo de trabalho
Visão geral
Com o Cloudflare Logs (antigo ELS), você tem acesso a dados úteis para analisar o tráfego que pode mostrar padrões associados a um ataque de DDoS. Você pode executar esse tipo de análise, classificando os dados do Cloudflare Logs. Para começar, siga as etapas descritas abaixo e revise o exemplo de fluxo de trabalho fornecido.
Antes de seguir estas instruções, você precisa:
Etapa 1: Reunir as informações necessárias antes de consultar os Cloudflare Logs
Reúna as seguintes informações:
- Endereço de email do administrador da zona
- ID da zona (encontrado em Visão geral > ID da zona )
- Chave da API do cliente
- Hora de início (formato de exemplo: 1529171100)
- Hora de término (formato de exemplo: 1529171100)
1ª etapa: Baixe e salve os logs
O endpoint do Cloudflare tem um limite de faixa de tempo de 1 hora e o tamanho do arquivo de logs deve estar abaixo de 1 GB por solicitação. Se o tamanho do arquivo exceder 1 GB, o download será cortado em 1 GB, mesmo que os eventos registrados a partir do momento solicitado não estejam incluídos. Para evitar truncar seus logs, diminua o tempo de 1 hora para 45 minutos e assim por diante até que o tamanho do arquivo de log esteja abaixo de 1 GB.
Opção 1:
Faça o download de *todos* os campos do Cloudflare Logs, salve em els.txt:
Modelo:
curl -sv -o els.txt -H "X-Auth-Email: email" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received?start=starttime&end=endtime&fields=(curl -s -H "X-Auth-Email: email" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received/fields" | jq '. | to_entries[] | .key' -r | paste -sd "," -)"
Exemplo (com valores):
curl -sv -o els.txt-H "X-Auth-Email:monkey@bannana.com" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/5b5f0xxxcbfbaxxxxxx0416d22f7b/logs/received?start=1529171100&end=1529171100&fields=(curl -s -H "X-Auth-Email: monkey@bannana.com" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received/fields" | jq '. | to_entries[] | .key' -r | paste -sd "," -)"
Opção 2:
Faça o download de campos *específicos* do Cloudflare Logs, salve em els.txt:
Este comando incluirá apenas os seguintes campos nos logs solicitados: CacheCacheStatus, CacheResponseBytes, CacheResponseStatus, CacheTieredFill, ClientASN .
Veja a lista completa dos campos do Cloudflare Logs aqui . Modelo:
curl -sv -o els.txt-H "X-Auth-Email:email" -H "X-Auth-Key:api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received?start=starttime&end=endtime&fields=CacheCacheStatus,CacheResponseBytes,CacheResponseStatus,CacheTieredFill,ClientASN”
Exemplo (com valores):
curl -sv -o els.txt-H "X-Auth-Email:monkey@bannana.com" -H "X-Auth-Key:api key" "https://api.cloudflare.com/client/v4/zones/xx5x0xxxc45baxxxxxx0x6d23fxx/logs/received?start=1529171100&end=1529171100&fields=CacheCacheStatus,CacheResponseBytes,CacheResponseStatus,CacheTieredFill,ClientASN”
Etapa 3: classificar os logs
Classifique os logs pelo valor do campo e envie-os para um arquivo.
- Classifique pela resposta HTTP 200, com saída para o arquivo chamado els-200.txt
~ $ cat els.txt | grep " : 200, " > els-200.txt
- Classifique pela resposta HTTP 525, com saída para o arquivo chamado els-525.txt
~ $ cat els.txt | grep " : 525, " > els-525.txt
De onde vem o valor do campo " : 525, " ?
O padrão : 525, (dois pontos, código de status, vírgula) é exclusivo para o campo EdgeResponseStatus . A simples pesquisa no código de status HTTP 525 sem dois pontos e vírgula à direita também incluiria entradas de log com o padrão 525 em outros campos como EdgeStartTimeStamp , por exemplo, que contém muitos números e também pode conter a sequência numérica 525 .
Os arquivos de saída (els-200.txt e els-525.txt) não são muito legíveis como estão. Para visualizá-los em um formato mais legível, use jq no seguinte comando:
~ $ cat els-525.txt | jq '.'
Contar as solicitações por campo e enviá-las para um arquivo
Neste exemplo, contamos solicitações por versão do protocolo SSL, que é indicado pelo campo ClientSSLProtocol no Cloudflare Logs (observe o período antes do nome do campo abaixo).
~ $ jq -r .ClientSSLProtocol els-200.txt | sort -n | uniq -c | sort -n > ClientSSLProtocol.txt
~ $ cat ClientSSLProtocol.txt
Saída de exemplo:
Os campos ClientRequestURI, ClientIP, ClientRequestUserAgent, ClientCountry e ClientRequestHost geralmente são os mais úteis para encontrar padrões de ataque nesses logs.
- Classificar por ClientRequestUserAgent permite definir regras de bloqueio do User-Agent.
- Classificando por ClientCountry permite definir regras de firewall com base no país.
- Classificar por ClientRequestURI permitirá definir regras de limitação de taxa para as páginas com o maior número de solicitações.
Exemplo de fluxo de trabalho
Freqüentemente, você precisará classificar por vários campos para analisar e identificar a origem de um ataque. Por exemplo, dê uma olhada no seguinte fluxo de trabalho:
Ação 1 : Classifique seus Cloudflare Logs baixados por respostas HTTP 200 , com saída para els-200.txt.
Reason: você não está interessado em respostas que já estão sendo bloqueadas pelo Cloudflare; ou seja, solicitações que resultam em uma resposta HTTP 503 ou 403. Uma solicitação que resulta em uma resposta 200 HTTP em nossa borda não é bloqueada pelo Cloudflare e provavelmente está indo até a origem se o ativo não estiver em cache na borda do Cloudflare. Tais solicitações, quando mal-intencionadas, são projetadas especificamente para sobrecarregar a origem.
How to:
~ $ cat els.txt | grep " : 200, " > els-200.txt
Ação 2 : Classifique seus " HTTP 200 apenas " logs por URI, com saída para els-200-URI.txt.
Reason: dentre 200 respostas, você deseja ver as páginas que estão sendo mais solicitadas. How to:
Encontre os principais URIs:
~ $ jq -r .ClientRequestURI els-200.txt | sort -n | uniq -c | sort -n > els-200-top-URIs.txt
~ $ cat els-200-top-URIs.txt
Escolha um URI dessa lista e envie as entradas de log com esse URI para seu próprio arquivo. Para fazer isso, substitua /ClientRequestURI/path/to/something/ no comando abaixo pelo URI de sua escolha:
~ $ cat els-200.txt | grep " /ClientRequestURI/caminho/para/algo/ " > els-200-URI-1.txt
Ação 3 : Contagem específica de URI, " HTTP 200 apenas " respostas por endereço IP, saída para els-200-URI-1-Top-IP.txt
Motivo : você deseja ver os principais endereços IP que estão solicitando o URI e resultando em uma resposta 200.
Como:
~$ jq -r .ClientIP els-200-URI-1.txt |sort -n |uniq -c |sort -n > els-200-URI-1-Top-IP.txt
Saída do conteúdo do arquivo:
~$ cat els-200-URI-1-Top-IP.txt
Você pode restringir 200 respostas HTTP pelo URI da solicitação e pelos IPs que estão solicitando esses URIs. Você também pode classificar os logs ao contrário, restringindo as entradas de log pelos principais endereços IP e vendo qual URI é mais solicitado por endereço IP.