Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Bans et limites de debit

Un exemple

[sftp.ban]
max_failures = 5
window_secs = 300
ban_duration_secs = 600
whitelist_ips = ["10.0.0.0/8"]

[admin]
listen = "0.0.0.0:8080"

[admin.ban]
max_failures = 10
trusted_proxies = ["10.0.0.5"]   # le reverse proxy devant l'API

[api]
enabled = true

[api.ban]
max_failures = 5
trusted_proxies = ["10.0.0.5"]   # le meme : un seul ecouteur

Sans la section, la porte ne bannit rien.

Une liste par porte

ListeSectionPortes
sftp[sftp.ban]SFTP
api[api.ban]API de fichiers, tickets de telechargement, explorateur
admin[admin.ban]API d’administration et console

Les trois listes sont independantes : une adresse bannie sur l’API de fichiers ouvre toujours la console, et inversement.

Les cles d’un ban

Les memes sous [sftp.ban], [api.ban] et [admin.ban], lues au demarrage.

Toutes les cles : Reference [sftp.ban], [api.ban], [admin.ban].

Ce qui compte comme un echec

Un echec est une credential presentee et jugee fausse, quel que soit le compte essaye.

PorteCompte
SFTPmot de passe faux ou nom inconnu ; jeton JWT juge faux ; signature d’une cle refusee ; une connexion finie sans s’authentifier apres des cles declinees (un echec par connexion, pas par cle)
API de fichiersBasic faux ou mal forme ; Bearer vide ou jeton juge faux
Console et API d’administrationjeton statique faux ; Bearer vide, JWT ou jeton de session juge faux ; POST /admin/login : mot de passe faux, nom inconnu ou compte sans role admin

Ne comptent pas : une methode coupee, un jeton expire ou pas encore valide, un ticket de telechargement refuse, quel qu’il soit, un refus apres une credential acceptee (aucun role, limite de sessions), un refus du limiteur de debit, le refus d’une adresse deja bannie. Une connexion reussie ne remet pas le compteur a zero.

Avec [api] cors_origins = ["*"], toute page web peut faire envoyer par le navigateur d’un visiteur des credentials fausses, qui comptent pour le ban de son adresse : listez les origines de vos applications.

La vie d’un ban

MomentEffet
max_failures echecs dans window_secsl’adresse est bannie pour ban_duration_secs ; une ligne d’audit ip_banned
avec [cluster]les echecs que les autres instances tiennent dans leur fenetre s’ajoutent au seuil, lus chaque seconde (≈ 1 s de retard) ; une instance injoignable ne compte plus apres 5 s (2 × peer_timeout_ms + 1 s si plus long)
sur SFTP, au verdictles sessions SFTP ouvertes de l’adresse sont coupees, transferts compris
un echec de plus pendant le banl’echeance recule a ban_duration_secs apres lui
l’echeancele ban finit, sans ligne
DELETE /admin/bans/{protocol}/{ip}le ban est leve

Une adresse IPv4 mappee (::ffff:10.1.2.3) est la meme que 10.1.2.3, pour le ban, la liste blanche et les proxies.

Lever un ban

GET /admin/bans (onglet Bans de la console) les liste ; la levee demande la permission unban, {protocol} est sftp, api ou admin :

curl -X DELETE -H "Authorization: Bearer $TOKEN" \
  http://localhost:8080/admin/bans/sftp/203.0.113.7

Une levee est une decision datee : elle annule les verdicts decides avant elle, jamais un verdict posterieur. Elle ne remet pas le compteur a zero.

Partager les bans entre instances

BackendClesPartage
memoireaucunechaque instance a ses bans, perdus au redemarrage ; avec [cluster], une levee est relayee a chaque instance, comme pour un fichier
fichierpersist_filerelu au demarrage, publie toutes les 30 s, relu sur un changement et toutes les reread_interval_secs ; ecrit de facon atomique, sur un volume partage (NFS, EFS) la relecture suffit
ConfigMapbackend = "configmap", ban_configmap_namesuivi par l’API Kubernetes (feature k8s, un Role) : Kubernetes

Les trois listes peuvent partager un fichier ou un ConfigMap. La fusion garde, par adresse, le ban le plus long et le verdict le plus recent ; un ban appris d’un pair coupe les sessions SFTP de l’adresse, sans ligne ip_banned (celle de l’instance qui l’a decide suffit). A l’arret, chaque liste est publiee, 5 s au plus chacune.

L’adresse d’un client HTTP : trusted_proxies

Les portes HTTP prennent le pair TCP pour adresse. Quand ce pair est dans le trusted_proxies de leur liste ([api.ban] pour l’API de fichiers, [admin.ban] pour l’API d’administration), elles prennent l’adresse la plus a droite de X-Forwarded-For qui n’est pas un proxy de confiance, a defaut X-Real-IP. Le ban, le limiteur, la part de la file de hachage et l’audit utilisent cette adresse. La porte SFTP ne lit que le pair TCP.

Sans [admin] control_listen, l’API de fichiers et l’API d’administration partagent un ecouteur : [api.ban] et [admin.ban] portent alors les memes trusted_proxies.

Limites de debit

Un seau a jetons par adresse : burst connexions ou requetes d’affilee, puis le debit par minute. Sans la section, aucune limite.

[sftp.rate_limit]
connections_per_minute = 30
burst = 10

[api.rate_limit]
requests_per_minute = 600

Toutes les cles : Reference [sftp.rate_limit], [api.rate_limit].

L’API d’administration n’a pas de limite de debit. Un refus de debit ne compte pas pour le ban.

Ce que vous verrez

QuandLigne
un ban decideaudit ip_banned ; INFO IP banned after auth failures
sessions coupees par un banINFO cut the sessions of a banned address ; audit session_end reason=banned
un pair publie des bansINFO merged persisted bans from file