2017-06-08 1 views
2

J'essaie de configurer modsecurity pour Apache afin de limiter le nombre d'accès à une ressource donnée par unité de temps (disons 10 accès par minute par ressource, non importe quelle adresse IP fait la demande). Les ressources ont un modèle d'url sous la forme de « https://myhost/my-resource/my-resource-id »La modsécurité d'Apache limite les hits par uri par unité de temps

# Limit the requests count by unit of time. 
SecRuleEngine On 

<LocationMatch "^.*/my-resource/.*"> 
    # SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog,id:132 
    SecAction initcol:uri=%{REQUEST_URI},pass,nolog,id:232 
    SecAction "phase:5,deprecatevar:uri.counter=10/60,pass,nolog,id:332" 
    SecRule URI:COUNTER "@ge 10" "phase:2,pause:10,deny,status:429,setenv:RATELIMITED,skip:1,nolog,id:432" 
    SecAction "phase:2,pass,setvar:uri.counter=+1,nolog,id:532" 
    Header always set Retry-After "60" env=RATELIMITED 
</LocationMatch> 

ErrorDocument 429 "Too Many Requests" 

Si je comprends bien cet extrait, il dit modsecurity « créer une variable nommée uri pour chaque request_uri et associer un compteur pour chacun, puis décrémenter de 10 Si le compteur d'uri du courant atteint la valeur de 10, échouez avec un code d'erreur 429, sinon augmentez-le "ce dont j'ai besoin.

Cette configuration conduit à l'erreur "uri variable not found", dont je ne comprends pas pourquoi. Si je décommente le 1er SecAction et change la configuration restante pour la référencer, cela fonctionne (renvoie un 429 après 10 appels rapides), mais ne prend évidemment pas en compte l'uri (il échoue pour toute ressource, par exemple. my-resource/123 et/my-resource/456)

Quelqu'un peut-il vous aider? Toutes mes tentatives échouent misérablement et je ne suis pas très familier avec la config d'Apache en général, donc je suppose que je manque une notion importante ici.

PS: Apache est v2.4, mod-sécurité est v2.9

Merci!

Répondre

0

La configuration qui fonctionne est comme suit:

# Limit the requests count by unit of time. 
SecRuleEngine On 

<LocationMatch "^.*/my-resource/.*"> 
    SecAction initcol:resource=%{REQUEST_URI},pass,nolog,id:132 
    SecRule RESOURCE:COUNTER "@ge 10" "phase:3,pause:10,deny,status:429,setenv:RATELIMITED,skip:1,nolog,id:232" 
    SecAction "phase:2,setvar:resource.counter=+1,pass,nolog,id:332" 
    SecAction "phase:2,deprecatevar:resource.counter=10/60,pass,nolog,id:432" 
    Header always set Retry-After "60" env=RATELIMITED 
</LocationMatch> 

ErrorDocument 429 "Too Many Requests" 

NDLR: changer le nom de la collection de « uri » à « ressource » et d'adapter la suppression progressive un peu

Ensuite, il fonctionne comme prévu (cf. liste de diffusion pour la sécurité publique: https://sourceforge.net/p/mod-security/mailman/message/35889575/)