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
Effettuare delete massive con Entity Framework Core 7
Confronto tra moduli in Javascript: ES e commonJS
Ricevere avvisi su metriche dei server Azure Arc
Taggare la output cache in base al routing in ASP.NET Core
Leggere e scrivere su cookie tramite Blazor
Filtrare e rimuovere gli elementi dalla cache del browser tramite le API JavaScript
Catturare la telemetria degli eventi di output cache in ASP.NET Core
Implementare il throttling in ASP.NET Core
Sfruttare l'output cache di ASP.NET Core 7 con i controller
Gestire tipi complessi in query string grazie a IParsable in ASP.NET Core 7.0
Gestire la query string nell'output cache di ASP.NET Core
Migrare un repository che contiene large file storage objects in GitHub
I più letti di oggi
- Usare un KeyedService di default in ASP.NET Core 8
- .NET Conference Italia 2023 - Milano e Online
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Registrare servizi multipli tramite chiavi in ASP.NET Core 8
- Creare dei grafici con OWC
- Ottimizzare le prestazioni di ASP.NET Core con la Cache distribuita su SQL Server