Utiliser les journaux de Cloudflare (ELS) pour enquêter sur le trafic DDoS (Enterprise uniquement)

Apprenez à localiser les sources de trafic malveillant en triant efficacement les journaux de Cloudflare (anciennement ELS). 


Présentation

Avec les journaux de Cloudflare (anciennement ELS), vous avez accès à des données utiles pour analyser le trafic qui pourrait montrer des modèles associés à une attaque DDoS. Vous pouvez effectuer ce type d'analyse en triant les données de vos journaux Cloudflare. Pour commencer, procédez comme suit et étudiez l'exemple de flux de travail fourni.

Avant de suivre ces instructions, vous avez besoin de :


Étape 1 : Rassemblez les informations dont vous avez besoin avant de consulter les journaux de Cloudflare

Rassemblez les informations suivantes :

  1. Adresse e-mail de l'administrateur de zone
  2. Identifiant de zone (dansOverview > Zone ID)
  3. Clé d'API client
  4. Heure de début (exemple de format : 1529171100)
  5. Heure de fin (exemple de format : 1529171100)

Pour les besoins de ce tutoriel, vous pouvez utiliser le site web suivant pour convertir les temps en temps Unix :https://www.epochconverter.com/

Étape 2 : Téléchargez et sauvegardez les journaux

Remarque : Le point d’extrémité de Cloudflare a une limite de bande temporelle d’une heure et la taille des fichiers des journaux doit être inférieure à 1 Go par requête. Si la taille du fichier dépasse 1 Go, le téléchargement sera coupé à 1 Go, même si les événements enregistrés à partir du moment désiré ne sont pas inclus. Pour éviter de tronquer vos journaux, réduisez le temps de 1 heure à 45 minutes et ainsi de suite jusqu'à ce que la taille du fichier journal soit inférieure à 1 Go.

Option 1 :

Téléchargez *tous* les champs des journaux Cloudflare, enregistrez-les au format els.txt :

Modèle :

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 "," -)"

Exemple (avec valeurs) :

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 "," -)"

Option 2 :

Téléchargez les champs *spécifiques* des journaux de Cloudflare, sauvegardez-les dans els.txt :

Cette commande inclura uniquement les champs suivants dans les journaux que vous avez demandés : CacheCacheStatus, CacheResponseBytes, CacheResponseStatus, CacheTieredFill, ClientASN.

Vous pouvez consulter la liste complète des champs Cloudflare Logs ici

Modèle :

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

Exemple (avec valeurs) :

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

Étape 3 : Triez les journaux

Triez les journaux par valeur de champ et copiez-les dans un fichier.

Triez-les par réponse HTTP 200, puis copiez-les dans un fichier appelé els-200.txt :

~$ cat els.txt| grep ":200," > els-200.txt

Triez-les par réponse HTTP 525, puis copiez-les dans un fichier appelé els-525.txt

~$ cat els.txt| grep ":525," > els-525.txt

D'où provient la valeur de champ « :525, » ?

Le modèle :525, (deux points, code de statut, virgule) est propre au champ EdgeResponseStatus. La seule recherche du code de statut HTTP 525 sans les deux points et la virgule de fin inclurait également les entrées de journaux qui avaient le modèle 525 dans d'autres champs comme EdgeStartTimeStamp, par exemple, qui contient plusieurs nombres et peut aussi contenir la séquence de nombres 525.

Remarque : les fichiers produits (els-200.txt et els-525.txt) ne sont pas très lisibles tels quels. Afin de les visualiser dans un format plus lisible, utilisez jq dans la commande suivante :

~$ cat els-525.txt | jq '.'

Comptez les requêtes par champ et copiez-les dans un fichier

Dans cet exemple, nous comptons les requêtes par version de protocole SSL, ce qui est défini par le champ ClientSSLProtocol dans les journaux Cloudflare (notez le point précédant le nom de champ ci-dessous).

~$ jq -r .ClientSSLProtocol els-200.txt |sort -n |uniq -c |sort -n > ClientSSLProtocol.txt
~$ cat ClientSSLProtocol.txt

Exemple de sortie :

Les champs ClientRequestURI, ClientIP, ClientRequestUserAgent, ClientCountry et ClientRequestHost sont généralement les plus utiles pour trouver les modèles d'attaque dans ces journaux.

  • Le tri par ClientRequestUserAgent vous permet de définir les règles de blocage d'agent-utilisateur.
  • Le tri par ClientCountry vous permet de définir des règles de pare-feu en fonction du pays.
  • Le tri par ClientRequestURI vous permettra de définir des règles de limitation de débit pour les pages recevant le plus grand nombre de requêtes.


Exemple de flux de travail

Souvent, vous aurez besoin de trier par plusieurs champs pour analyser et identifier la source d'une attaque. Examinons par exemple le flux de travail suivant :

Action 1 : Triez vos journaux Cloudflare téléchargés par réponse HTTP 200, et copiez-les dans els-200.txt.

Raison : Vous n'avez pas besoin des réponses qui sont déjà bloquées par Cloudflare, c'est à dire des requêtes qui donnent lieu à une réponse HTTP 503 ou 403. Une requête qui renvoie une réponse HTTP 200 à notre périmètre n'est pas bloquée par Cloudflare et poursuivra probablement son chemin jusqu'au serveur d'origine si l’actif n'est pas mis en cache sur le périmètre de Cloudflare. De telles requêtes, lorsqu'elles sont malveillantes, sont spécialement conçues pour surcharger le serveur d'origine.

Procédure à suivre :

~$ cat els.txt| grep ":200," > els-200.txt


Action 2
: Triez vos journaux « uniquement HTTP 200 » par URI, puis copiez-les dans els-200-URI.txt.

Raison : Sur les 200 réponses, vous voulez voir les pages faisant l’objet du plus grand nombre de requêtes.

Procédure à suivre :

Trouvez les URI supérieurs :

~$ jq -r .ClientRequestURI els-200.txt |sort -n |uniq -c |sort -n > els-200-top-URIs.txt
~$ cat els-200-top-URIs.txt

Choisissez une URI dans cette liste et copiez les entrées du journal avec cette URI dans leur propre fichier. Pour ce faire, remplacez /ClientRequestURI/path/to/something/ dans la commande ci-dessous avec l'URI de votre choix :

~$ cat els-200.txt| grep "/ClientRequestURI/path/to/something/" > els-200-URI-1.txt


Action 3
 : Comptez les réponses spécifiques URI, « HTTP 200 uniquement » par adresse IP, puis copiez-les dans els-200-URI-1-Top-IP.txt

Raison : Vous devez voir les principales adresses IP qui sollicitent l'URI et qui génèrent une réponse 200.

Comment faire :

~$ jq -r .ClientIP els-200-URI-1.txt |sort -n |uniq -c |sort -n > els-200-URI-1-Top-IP.txt

Copiez le contenu du fichier :

~$ cat els-200-URI-1-Top-IP.txt

Vous pouvez réduire les réponses HTTP 200 à la fois par l'URI de la requête et par les IP qui sollicitent ces URI. Vous pouvez également classer les journaux dans l'autre sens, en réduisant les entrées du journal par les adresses IP supérieures, puis en déterminant quelle URI est la plus sollicitée par adresse IP.

 
Attention, ce n'est pas parce que vous voyez un grand nombre de requêtes provenant d'un seul agent utilisateur ou d'une seule adresse IP que le demandeur est malveillant 
Vous n'avez toujours pas trouvé ce que vous cherchez ?

95% des questions peuvent être répondues en utilisant l'outil de recherche. C'est le moyen le plus rapide d'obtenir une réponse.

Réalisé par Zendesk