Limitation du débit IP et liste blanche

Vue d'ensemble

La limitation du débit IP et l'établissement de listes blanches permettent de restreindre l'accès aux objets Zato en fonction de deux séries de conditions :

  • Combien de fois dans un temps donné un objet particulier est accédé (limitation de la vitesse)
  • D'où proviennent les requêtes entrantes (liste blanche)

Il est possible d'exprimer des scénarios de complexité variable, comme le scénario simple ci-dessous :

  • Ce service peut être utilisé au maximum 1 000 fois par jour.

Ou un autre plus complexe, comme celui-ci :

  • Cet utilisateur peut utiliser le système au maximum 10.000 fois par jour.
  • Mais uniquement à partir de ces trois plages d'adresses IP
  • Les informations d'identification de l'API de cette personne devraient également être incluses dans la limite
  • Mais ils ont leur propre limite supplémentaire - au maximum 50 fois par heure
  • Sauf si les requêtes sont faites à partir de localhost auquel cas la limite est de 200 fois par minute

Blocs de construction

Les définitions de limitation de débit peuvent être attachées à plusieurs types d'objets, chacun d'entre eux étant vérifié en cours d'exécution dans l'ordre décrit ci-dessous :

  • Si la requête entrante utilise une définition Basic Auth ou JWT, les règles de limitation de débit de cette définition sont vérifiées
  • Si la requête entrante est accessible via un canal REST, JSON-RPC ou SOAP, les règles de définition de ce canal sont vérifiées
  • Si le canal est sécurisé par un utilisateur qui a un compte d'utilisateur SSO lié, les règles de limitation de débit de ce compte d'utilisateur SSO sont vérifiées
  • Si un service invoqué a une règle de limitation de débit, sa définition est également vérifiée

Notez que si l'ordre des vérifications est fixe, toutes ces étapes sont facultatives et si un objet particulier n'a pas de définition, ou s'il n'est pas activé, il ne sera pas vérifié du tout.

Gestion des définitions

Une définition pour chaque type d'objet possible est toujours du même format :

  • Flags
  • Type
  • Un ensemble de zéro ou plusieurs règles

Par exemple, voici un exemple de définition pour un objet de service - tous les autres types d'objets suivent le même style :

Flags

  • Enabled - détermine si une définition donnée doit être traitée ou non. Si elle n'est pas activée, la définition sera complètement ignorée, comme si elle n'existait pas.

  • Return errors - si elle est activée, les clients dont les limites de débit ont été atteintes recevront des détails sur cette situation, sinon un message d'erreur générique sera renvoyé.

Types de définition

À l'exception des utilisateurs SSO, les définitions peuvent être de deux types : exactes ou approximatives.

  • Exact - la définition est partagée par tous les processus du serveur Zato et toutes les vérifications et comparaisons pour savoir si elle est déjà atteinte sont sérialisées. Cette méthode n'est pas aussi rapide que les méthodes approximatives, mais elle offre une meilleure garantie que si une limite est atteinte par un serveur, tous les autres le reconnaîtront immédiatement.

  • Approximate - Approximative - la définition est spécifiée par chaque processus serveur plutôt qu'au niveau du cluster. Cela signifie que les vérifications et les comparaisons sont plus longues que dans le cas d'une définition exacte, mais cela peut conduire à des situations où un serveur atteint la limite alors que les autres peuvent encore accepter des requêtes - en fin de compte, tous les serveurs atteindront la même limite.

Notez que les utilisateurs SSO utilisent toujours des définitions exactes, il n'est pas possible de les changer en définitions approximatives.

Règles

Chaque définition contient zéro ou plusieurs règles qui sont comparées en temps réel aux requêtes entrantes. Chaque règle se trouve sur sa propre ligne. Les règles sont comparées dans l'ordre dans lequel elles sont listées dans la définition.

Le traitement s'arrête dès que la première règle correspondante est trouvée. Si aucune règle ne correspond, la requête est rejetée.

Notez qu'il est possible de créer des règles vides, c'est-à-dire sans aucune ligne à comparer. Cela aura pour effet de rejeter toutes les requêtes sans distinction.

Chaque ligne a le format suivant source = limit. Les espaces autour du signe égal sont ignorés.

Source peut être l'une des suivantes :

  • Une adresse IP exacte, par exemple 10.151.29.11
  • Un réseau IP, par exemple, 10.151.0.0/16
  • Un astérisque pour indiquer "toute adresse source"

  • Limit est un taux exprimé en unités de temps, où:

  • d = jour

  • h = heure
  • m = minute
  • * = aucune limite

Par exemple:

* 10/m = dix fois par minute
* 500/h = cinq cents fois par heure
* 10000/d = dix mille fois par jour

Appliquer les changements aux définitions

Toute partie d'une définition de limitation de débit peut être modifiée à tout moment, par exemple les limites peuvent être modifiées librement chaque fois que cela est nécessaire.

Chaque fois qu'une définition est modifiée, son compteur interne d'occurrences est remis à zéro - par exemple :

  • La définition laissait auparavant passer au maximum 1 000 requêtes par jour
  • Un objet donné a déjà été consulté 500 fois
  • Maintenant, la définition a été modifiée pour permettre un maximum de 2 000 requêtes par jour.
  • A ce stade, les appelants seront confrontés à la limite de 2.000 requêtes par jour, le fait que le nombre de 500 requêtes ait déjà été atteint ne sera pas pris en compte.

Le seul changement qui ne remet pas le compteur à zéro est la modification de l'indicateur "Is active" - le fait de basculer l'état de la définition entre actif et inactif, peu importe le nombre de fois, ne remet pas à zéro son compteur d'occurrences.

Exemples

Quelle que soit l'adresse source, cet objet peut être consulté au maximum mille fois par jour :

* = 1000/d

Les utilisateurs du premier bloc de réseau peuvent accéder à l'objet cent fois par minute, tandis que ceux d'un autre bloc n'y accèdent que cinq fois par jour :

172.16.13.0/24 = 100/m
192.168.79.0/24 = 5/d

Certains réseaux d'adresses auront des limites mais pour localhost il n'y en aura pas :

172.16.97.0/24 = 400/h
192.168.33.0/24 = 150/d
192.168.1.199 = 500/d
127.0.0.1 = *

Aucune limite, quelle que soit l'adresse source :

* = *