Limitação da taxa de HAProxy - banir o abusador por 30 minutos

3

Eu tenho a seguinte configuração, que funciona bem para conexões limitadoras de taxa. Se um abusador for autenticado e ele também acessar o local regex definido mais de 30 vezes por minuto, o limite de taxa será iniciado e ele será encaminhado ao backend rate_limiting, onde receberá uma mensagem de erro:

frontend http_in

bind xx.xx.xx.xx:80
mode http
default_backend backend_nodes
tcp-request inspect-delay 5s
acl location_request path_reg ^/(.*)/(.*)/
acl too_many_requests sc0_gpc0_rate(context) ge 30
acl mark_seen sc0_inc_gpc0 gt 0
stick-table type string size 100k store gpc0_rate(60s)
tcp-request content track-sc0 cookie(authValidation) if location_request
use_backend rate_limiting if mark_seen too_many_requests


backend backend_nodes

mode    http
balance roundrobin
option  http-server-close
server  srv1 192.168.0.1:80 weight 5
server  srv2 192.168.0.2:80 weight 5

backend rate_limiting

mode http
timeout tarpit 2s
errorfile 500 /etc/haproxy/errorfiles/429.http
http-request tarpit

Essa configuração garante que o agressor não possa fazer mais de 30 solicitações por minuto, no entanto, não o bloqueia completamente por mais de um minuto. Agora, o que eu gostaria de alcançar a seguir é bloquear completamente o agressor por 1 hora depois que ele obtiver uma taxa limitada, mas, até onde minha pesquisa me mostrou, nem sei se esse passo adicional é possível. / p>     

por Andy 21.07.2016 / 07:59

1 resposta

2

Andy, O truque é adicionar outro back-end que você usa somente para a tabela extra stick. Você só pode ter uma mesa para cada back-end - MAS você pode usá-las em QUALQUER frente / back end ... Então eu adiciono uma chamada Abuse que você pode usar como uma proibição global de 60 minutos para qualquer backend ... Você precisará alterar meu exemplo, mas tente algo assim:

# ABUSE SECTION works with http mode dependent on src ip
tcp-request content reject if { src_get_gpc0(Abuse) gt 0 }
acl abuse src_http_req_rate(Abuse) ge 10
acl flag_abuser src_inc_gpc0(Abuse) ge 0
acl scanner src_http_err_rate(Abuse) ge 10

# Returns a 403 to the abuser and flags for tcp-reject next time
http-request deny if abuse flag_abuser
http-request deny if scanner flag_abuser

backend Abuse
stick-table type ip size 1m expire 60m store conn_rate(3s),conn_cur,gpc0,http_req_rate(10s),http_err_rate(20s)
    
por 04.06.2017 / 18:18