Blindare un server e mettere un WAF davanti alla tua app
Dalla prima distribuzione,
erpc worker lascia entrare via SSH solo dal tuo indirizzo e scarta ogni altra connessione in entrata. Una tabella [waf] mette un proxy di filtraggio davanti alla tua API.Questa pagina descrive ERPC CLI
v0.1.0-rc.4, una versione pre-release.Il firewall
Una distribuzione imposta il firewall del server prima del primo avvio dell'app:
- SSH solo da
firewall.ssh_allowe dall'indirizzo da cui parte la distribuzione; - ogni altra connessione in entrata scartata, tranne
run.portdafirewall.app_allow; per un'app dietro un WAF, al suo posto la porta del WAF, e solo dove il WAF sul server esegue già le regole che[waf]ora definisce (più avanti).
Ogni modifica viene applicata sotto un timer di rollback di 120 secondi e viene mantenuta solo quando una nuova connessione riesce a entrare, così una modifica sbagliata non può chiuderti fuori.
L'allowlist però sopravvive all'indirizzo da cui è stata creata: se il tuo indirizzo di casa cambia, per rientrare passi dal supporto ERPC per un server ERPC, o dalla console del provider per un server tuo. Prima di fidarti di un indirizzo di casa, tieni in
firewall.ssh_allow un secondo indirizzo da cui puoi raggiungere il server (un ufficio, un'uscita VPN).Se il tuo indirizzo cambia, aggiungi tutti gli indirizzi fissi usati dai tuoi amministratori:
bash
Mettere un WAF davanti alla tua app
Aggiungi una tabella a
erpc.toml:toml
erpc worker deploy esegue quindi un reverse proxy HTTP sul server, in un'unità systemd tutta sua (erpc-waf-<app>-<env>): un utente dinamico senza privilegi, senza chiavi, senza secret e senza nulla del worker, limitato a 1 GiB di memoria. Resta in ascolto su waf.port, legge ogni richiesta prima dell'app, rifiuta ciò che le sue regole indicano e inoltra il resto all'app su 127.0.0.1:<run.port>.-
L'app resta sul loopback. La sua porta non viene mai aperta dall'esterno.
erpc worker apie l'health check raggiungono l'app sul loopback, senza passare dal WAF. -
Chi può connettersi lo decide comunque la lista del firewall, e la porta del WAF è l'unico punto in cui quella lista può dire tutti:shSe nella lista non c'è nessuno, il WAF è in ascolto e nessuno viene lasciato entrare, e la distribuzione lo segnala.
-
La porta viene aperta solo quando il WAF è in ascolto su di essa, mai prima. Una distribuzione il cui WAF non si avvia fallisce e ne spiega il motivo, con l'app ancora in esecuzione.
-
Quando modifichi
[waf], la porta non viene aperta a nessuno in più finché una distribuzione non ha messo in atto le nuove regole. -
Togliere
[waf]daerpc.tomle distribuire rimuove il WAF dal server.
Impostazioni del WAF
Solo
port è obbligatoria. Ogni chiave, con il suo valore predefinito:toml
rate, max_connections_per_address, ban e new_connections si disattivano con false (ban = false), e una chiave omessa assume il suo valore predefinito. erpc worker check dice cosa farà la tabella [waf], e cosa c'è di sbagliato, prima di qualsiasi distribuzione.Cosa fa il WAF senza bisogno di impostazioni
- Una richiesta che non si legge come un'unica richiesta HTTP/1 non ambigua riceve 400, e lo stesso vale per un percorso che non è in forma normale.
- Una richiesta di cambio di protocollo (
Upgrade) riceve 501. - Ogni rifiuto conta per il ban, e ogni rifiuto chiude la sua connessione.
- Un indirizzo è un indirizzo IPv4, oppure un
/64IPv6. - Il WAF non inoltra gli header della connessione tra il client e il proxy (
Connectione gli header che nomina,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Proxy-Connection,TE,Trailer),Expect, gli header il cui nome contiene un trattino basso, né gli headerForwarded,X-Real-IPeX-Forwarded-Protoinviati dal client stesso. ImpostaX-Real-IPsull'indirizzo da cui è arrivata la connessione e aggiunge quell'indirizzo in fondo aX-Forwarded-For; solo l'ultima voce diX-Forwarded-Forè dichiarata dal proxy.
Vedere cosa fa il WAF
Una richiesta inoltrata non lascia alcuna riga di log, e nessun header o corpo viene mai registrato nel log; la query di una richiesta bloccata sì, fin dove arrivano i 200 byte. Ciò che un client invia non può scrivere sul tuo terminale: il WAF scrive il suo journal in ASCII stampabile.
Cosa non fa il WAF
- Niente TLS. Parla HTTP/1.1 in chiaro sulla sua porta.
- Niente HTTP/2: gli risponde 400.
- Niente WebSocket, né alcun altro
Upgrade: 501. - Nessuna ispezione dei corpi. Un corpo viene misurato, mai letto. L'elenco delle sonde è breve ed è un filtro contro il rumore, non una garanzia: l'app controlla comunque il proprio input.
- Nessuna autenticazione. Chi può chiamare l'app spetta all'app deciderlo, e alla lista del firewall.
- Un indirizzo è un client. I client dietro uno stesso NAT, proxy o CDN condividono un limite di richieste e un ban; un client con molti indirizzi ha altrettanti limiti di richieste.
- Ban e conteggi vengono dimenticati quando il WAF si riavvia.
- Ricorda al massimo 8192 indirizzi e mantiene al massimo 1024 connessioni contemporaneamente.
- È in ascolto solo su IPv4, quindi una voce IPv6 in
app_allowper ora non raggiunge nulla. - Un percorso viene confrontato come i byte in cui si decodifica. Un'app che legge i percorsi in modo più permissivo (ignorando maiuscole e minuscole, i parametri
;, decodificando due volte) può essere raggiunta con un nome chedeny_pathsnon copre.allow_pathsnon ha questa lacuna: ciò che non è elencato non viene inoltrato. - Un lettore lento viene servito fino alla fine. Un client che continua a ricevere una risposta, per quanto lentamente, viene servito fino alla fine.
- Un flood può interrompere un upload di grandi dimensioni. Il WAF gira su un solo thread, quindi un flood può interrompere un upload di grandi dimensioni con 408. Un'app che accetta corpi grandi aumenta
body_timeout_secsinsieme amax_body_bytes.
La guida del worker contiene ogni regola, compreso quando una modifica ad
app_allow viene trattenuta fino alla distribuzione successiva.





