
Proxy HTTP inverso filtrante
Proxy HTTP inverso per filtrare le richieste tramite diverse regole. Può essere utilizzato tra il webserver di produzione e il server applicativo per prevenire abusi del backend dell'applicazione.
Lo scopo originale di questo programma era difendere searx, ma può essere usato per proteggere qualsiasi applicazione web.
$ go install github.com/asciimoo/filtron
$ "$GOPATH/bin/filtron" --help
Una regola ha due attributi obbligatori: name e actions
Una regola può contenere tutti i seguenti attributi:
limit intero - Definisce quante richieste corrispondenti possono accedere all'applicazione entro interval secondi. (Può essere omesso se 0)interval intero - Intervallo di tempo in secondi per resettare i numeri delle regole (Può essere omesso se limit è 0)filters lista di selettoriaggregations lista di selettori (se filters è specificato si attiva solo in caso di corrispondenza del filtro)subrules lista di regole (se filters è specificato si attiva solo in caso di corrispondenza del filtro)disabled booleano - Disabilita una regola (default è false)stop booleano - Termina immediatamente la validazione della richiesta e salta le regole rimanenti (default è false)Rappresentazione JSON di una regola:
{
"name": "example rule",
"interval": 60,
"limit": 10,
"filters": ["GET:q", "Header:User-Agent=^curl"],
"actions": [
{"name": "log",
"params": {"destination": "stderr"}},
{"name": "block",
"params": {"message": "Not allowed"}}
]
}
Spiegazione: Permette solo 10 richieste al minuto dove q è rappresentato come parametro GET e l'header user agent inizia con curl. La richiesta viene registrata su STDERR e bloccata con un messaggio di errore personalizzato se il limite viene superato. Vedi altri esempi qui.
actionsLe azioni della regola vengono attivate sequenzialmente se una richiesta supera il limite della regola.
Nota: Solo la prima azione della regola che fornisce una risposta personalizzata verrà eseguita.
logRegistra la richiesta
blockFornisce una risposta HTTP 429 invece di passare la richiesta all'applicazione
shellEsegue un comando shell. cmd (stringa) e args (lista di selettori) sono parametri obbligatori (Esempio: {"name": "shell", "params": {"cmd": "echo %v is the IP", "args": ["IP"]}})
filtersSe tutti i selettori vengono trovati, incrementa un contatore. La regola blocca la richiesta se il contatore raggiunge limit.
aggregationsConta i valori restituiti dai selettori. La regola blocca la richiesta se il numero di qualsiasi valore raggiunge limit.
subrulesOgni regola può contenere un numero qualsiasi di sottoregole. Si attiva in caso di corrispondenza del filtro della regola padre.
Diverse parti della richiesta possono essere estratte usando espressioni di selettori.
I selettori sono stringhe che possono corrispondere a qualsiasi attributo di una richiesta HTTP con la seguente sintassi:
[!]RequestAttribute[:SubAttribute][=Expression]
! può negare il selettoreRequestAttribute (obbligatorio) seleziona una parte specifica di una richiesta - valori possibili:
IPHostPathMethodGETPOSTParam - è un alias sia per GET che per POSTCookieHeaderSubAttribute se non è un valore singolo, questo può specificare l'attributo internoIP restituisce l'indirizzo IP del client
GET:x restituisce il parametro GET x se esiste
!Header:Accept-Language restituisce vero se non c'è l'header HTTP Accept-Language
Path=^/(x|y)$ corrisponde se il percorso è /x o /y
IP=nslookup(example.com) corrisponde se l'indirizzo IP del client è uno degli indirizzi IP di example.com.
Filtron può essere configurato tramite la sua API REST che ascolta su 127.0.0.1:4005 di default.
/rulesRegole caricate in formato JSON
/rules/reloadRicarica il file delle regole specificato all'avvio
UI costruita sull'API

Bug o suggerimenti? Visita il tracciatore di problemi.
RequestAttributeExpression valore possibile:
nslookup(Hostname) per filtrare i valori dell'attributo selezionato con gli indirizzi IP di Hostname. Filtron risolve Hostname nei suoi indirizzi IP quando la regola viene caricata (IPv4 e IPv6).