L'IP Filtering è un meccanismo di sicurezza che serve a consentire o negare l'accesso a un'applicazione in base all'indirizzo IP di provenienza del client. Questa tecnica serve a ridurre i tentativi di accesso indesiderati ed è più efficiente quando viene attuata a livello di rete usando un hardware dedicato, come un router firewall posto a protezione del server. Tuttavia, è anche attuabile a livello applicativo con ASP.NET Core, usando un apposito middleware fornito dal pacchetto ZNetCS.AspNetCore.IPFiltering, che andiamo a referenziare nel progetto con il seguente comando.
dotnet add package ZNetCS.AspNetCore.IPFiltering
Poi, rechiamoci nel metodo Configure della classe Startup e configuriamo il middleware prima di qualsiasi altro, come si vede nell'esempio seguente.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseIPFiltering(); //Qui altri middleware }
Infine, sempre all'interno della classe Startup, aggiungiamo la configurazione del servizio dal metodo ConfigureServices.
public void ConfigureServices(IServiceCollection services) { services.AddIPFiltering(configuration.GetSection("IPFiltering")); }
Il middleware è in grado di attuare l'IP Filtering con le due strategie tipiche:
- Whitelisting: l'accesso è negato a tutti i client, ad esclusione di quelli che si collegano da uno o più indirizzi IP ben determinati;
- Blacklisting: l'accesso è consentito a tutti i client, tranne a quelli che si collegano con indirizzi IP indesiderati.
Ora vediamo come configurare il middleware per queste due strategie.
Whitelisting
Definire una whitelist è indicato quando l'applicazione deve essere consumata da client che conosciamo bene e che si collegano da un insieme ristretto di indirizzi IP. I casi tipici sono quelli di una web application che deve essere accessibile solo dalle varie sedi distaccate della nostra azienda, oppure una Web API che deve essere consumata unicamente da un'altra applicazione situata in un altro server. In questi casi, apriamo il file appsettings.json e aggiungiamo la seguente configurazione.{ "IPFiltering": { "DefaultBlockLevel": "All", "Whitelist": [ "127.0.0.1", "::1", "192.168.1.1-192.168.1.254", "1.2.3.4/30" ], "HttpStatusCode": 403 } }
Con l'impostazione "DefaultBlockLevel": "All" neghiamo l'accesso a tutti i client, tranne a quelli indicati nella proprietà "Whitelist". Come si vede nell'esempio, possiamo indicare gli indirizzi IPv4 o IPv6 in vari modi:
- Indicando gli indirizzi IP singolarmente. Fintanto che siamo in fase di sviluppo, ricordiamoci di aggiungere almeno gli indirizzi "127.0.0.1" e "::1", che identificano entrambi localhost;
- Indicando un IP Range come 192.168.1.1-192.168.1.254 che riporta gli IP estremi (compresi) separati dal trattino;
- Indicando un intervallo con la notazione CIDR (https://it.wikipedia.org/wiki/Supernetting#CIDR) come 1.2.3.4/30 che oltre all'indirizzo IP riporta il numero di bit significativi della maschera.
Se un client dovesse collegarsi da un IP non compreso nella whitelist, il middleware restituirebbe immediatamente lo status code indicato nella proprietà "HttpStatusCode", impedendo di fatto che la richiesta raggiunga gli altri middleware configurati nell'applicazione.
Blacklisting
Usare una blacklist è utile per le applicazioni web destinate al grande pubblico, che possono ricevere attenzioni indesiderate da parte di bot o utenti malintenzionati. Per dissuaderli dall'inviare richieste frequenti e ripetute, possiamo aggiungere i loro indirizzi IP alla blacklist, come nella configurazione seguente inserita nel file appsettings.json.{ "IPFiltering": { "DefaultBlockLevel": "None", "Blacklist": [ "1.2.3.4", "2001:db8::" ], "HttpStatusCode": 403 } }
Come si vede, con l'impostazione "DefaultBlockLevel": "None" consentiamo l'accesso a tutti i client, tranne a coloro che si collegano da un indirizzo IP indicato nella proprietà "Blacklist". Anche in questo caso possiamo definire degli intervalli, se rilevassimo che le richieste indesiderate arrivano da una intera rete di computer. Va comunque usata cautela nell'uso della blacklist, perché potremmo inavvertitamente negare l'accesso anche a dei client legittimi che hanno la sfortuna di condividere lo stesso indirizzo IP dell'aggressore. Ad ogni modo, la configurazione del file appsettings.json è aggiornabile a caldo e questo significa che non sarà necessario riavviare l'applicazione in seguito a una modifica.
Conclusioni
L'IP Filtering è una contromisura in più che ci aiuta a proteggere l'applicazione da accessi indesiderati e, come abbiamo visto, si implementa facilmente grazie a un middleware. Questa tecnica non va a sostituire altri meccanismi di protezione: infatti, anche nel caso in cui usassimo l'approccio whitelist, è comunque consigliato usare HTTPS per garantire la riservatezza delle comunicazioni e un sistema di login robusto che sfrutta ASP.NET Core Identity.Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Paginare i risultati con QuickGrid in Blazor
Sostituire la GitHub Action di login su private registry
Generare un hash con SHA-3 in .NET
Gestione dei nomi con le regole @layer in CSS
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Limitare le richieste lato server con l'interactive routing di Blazor 8
Aggiornare a .NET 9 su Azure App Service
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Generare la software bill of material (SBOM) in GitHub
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Referenziare un @layer più alto in CSS
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8