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
Personalizzare le richieste con i rule set di Azure Front Door
Raggruppare i parametri di una minimal API in un singolo oggetto in ASP.NET Core
Creare applicazioni distribuite con Azure Container Apps e Dapr
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
Evitare la command injection in un workflow di GitHub
Utilizzare .NET Framework con le Azure Function in modalità isolata
Specificare il versioning nel path degli URL in ASP.NET Web API
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Sfruttare la local cache del browser tramite gli ETag in ASP.NET Core
Usare Azure Application Gateway come reverse proxy per ASP.NET Core
Scoprire le ottimizzazioni di Entity Framework Core in fase di scrittura di un solo record
Utilizzare l'attributo HTML inert per disabilitare gli eventi