Mise en place de rate-limit sur Haproxy

De Ikoula Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Introduction

Nous allons voir comment mettre en place du rate-limit sur une fenêtre glissante ou fixe au niveau d'Haproxy.
Cela peut s'avérer efficace contre les Bots ou encore les attaques de type Deny of service HTTP/HTTPS.

Déroulé

Nous allons commencer par du rate-limit sur une fenêtre glissante, au niveau de notre frontend nous allons ajouter la configuration ci-dessous :

stick-table type ipv6 size 100k  expire 5m  store http_req_rate(10s)
http-request track-sc0 src
http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }

Dans notre exemple, nous allons renvoyer un code 429 aux adresses IP effectuant plus de 100 requêtes en 10 secondes sur une fenêtre de 5 minutes.

La directive stick-table crée un magasin clé-valeur pour stocker des compteurs, comme le taux de requête HTTP par client. La clé est l'adresse IP du client, telle que configurée par le paramètre type (ipv6 ne signifie pas que nous stockons que des IPv6, mais permet de stocker les IPv4 et IPv6), qui est utilisée pour stocker et agréger le nombre de demandes de ce client.

La ligne http-request track-sc0 src ajoute le client en tant qu'enregistrement dans la table stick. Les compteurs commencent à être enregistrés dès que l'IP est ajoutée.

Un enregistrement dans la sticky-table expire et est supprimé après une période d'inactivité par le client, tel que défini par le paramètre expire (ici 5 minutes). Sans paramètre d'expiration, les enregistrements les plus anciens sont supprimés lorsque le stockage est plein (ici, nous autorisons 100k donc 100 000 enregistrements).

La ligne http-request deny définit le seuil de limite et l'action à entreprendre lorsque quelqu'un le dépasse (ici, nous autorisons jusqu'à 100 demandes et en refusons d'autres avec une réponse de 429 Too Many Requests jusqu'à ce que le nombre au cours des 10 dernières secondes soit à nouveau inférieur au seuil.

La méthode d'extraction sc_http_req_rate renvoie le taux de requête actuel du client.

Voici maintenant la mise en place de rate-limit sur une fenêtre fixe :

stick-table  type ipv6  size 100k  expire 24h  store http_req_cnt
http-request track-sc0 src
http-request deny deny_status 429 if { sc_http_req_cnt(0) gt 1000 }

Dans ce cas ci, nous allons autoriser 1000 requêtes d'une adresse IP sur une fenêtre de 24 heures. Plutôt que d'utiliser le compteur http_req_rate, qui remonte le taux de requêtes sur une période donnée, nous utilisons ici http_req_cnt, qui lui renvoi le nombre de requêtes qui s'incrémente pour toujours jusqu'à la réinitialisation ou jusqu'à ce que l'expiration soit atteinte.

La méthode d'extraction sc_http_req_cnt renvoie le nombre de requêtes actuel du client.




Cet article vous a semblé utile ?

0



Vous n'êtes pas autorisé à publier de commentaire.