Configurare l'applicazione in maniera sicura
Nel corso del capitolo 3 abbiamo visto come configurare l'applicazione ASP.NET Core usando varie fonti, tra cui i file di testo come appsettings.json. Tipicamente, i file di testo sono sottoposti a controllo di versione insieme al codice sorgente dell'applicazione e perciò non sono consigliati per contenere valori di configurazione sensibili, come API key o chiavi di crittografia, che andrebbero tenuti segreti. Se li aggiungessimo al controllo di versione, infatti, verrebbero divulgati a tutti coloro che hanno accesso al repository. Il problema è particolarmente sentito nei progetti open-source, dove il codice è pubblicamente accessibile da chiunque.
Inoltre, anche le stringhe di connessione contengono informazioni segrete come username e password e, dato che cambiano in base all'ambiente, è opportuno valutare altre fonti di configurazione che mantengano i valori in uno spazio di archiviazione separato dal progetto.
- Nell'ambiente di sviluppo possiamo valutare User secrets o variabili d'ambiente;
- Nell'ambiente di staging e produzione usiamo Azure Key Vault o variabili d'ambiente.
Nel corso del capitolo 3 abbiamo già visto come usare le variabili d'ambiente, quindi ci concentreremo su User secrets e Azure Key Vault.
User secrets
Gli User secrets sono una fonte alternativa alle variabili d'ambiente da usare in ambiente di sviluppo. I valori di configurazione che gli affidiamo sono memorizzati all'interno della home directory del nostro utente, perciò in uno spazio separato da quello in cui si trova il progetto. I valori sono salvati in chiaro ma questo è raramente un problema dato che, anche in caso di furto della nostra macchina di sviluppo, il contenuto della home directory è tipicamente accessibile solo entrando col nostro utente.
Prima di iniziare a usare User secrets, dobbiamo indicare lo UserSecretsId all'interno del file .csproj, come si vede nell'esempio 18.33. È importante che tale valore sia univoco per ogni progetto, dato che viene usato come chiave per mantenere isolati i vari contenitori.
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<UserSecretsId>MyApp1</UserSecretsId>
</PropertyGroup>
La fonte degli user secrets è già aggiunta in ogni applicazione ASP.NET Core in cui sia stato usato il web host builder di default, quindi non sarà necessario apportare ulteriori modifiche al codice. Ci basta usare il sottocomando dotnet user-secrets per impostare le nostre chiavi di configurazione come nell'esempio 18.34. Tali valori saranno poi accessibili dall'applicazione nel modo consueto, ad esempio usando la proprietà Configuration che viene esposta dalla classe Startup o il servizio IOptionsMonitor<T> già visto nel capitolo 3.
dotnet user-secrets set Smtp:Host smtp.example1.com
I due punti sono usati come carattere separatore nel percorso di una chiave gerarchica. I valori invece sono salvati nel file secrets.json situato in una sottodirectory della home dell'utente. Lo specifico percorso è riepilogato dalla tabella 18.1 per ogni sistema operativo.
Sistema operativo | Percorso di archiviazione |
---|
Windows | %APPDATA%\microsoft\UserSecrets\UserSecretsId\ |
Linux | ~/.microsoft/usersecrets/UserSecretsId/ |
macOS | ~/.microsoft/usersecrets/UserSecretsId/ |
Il file secrets.json può essere modificato manualmente. Gli utenti di Visual Studio possono raggiungere il file con facilità dal Solution Explorer, cliccando il progetto con il tasto destro e selezionando Manage user secrets dal menu contestuale. Affinché le nuove modifiche abbiano effetto, l'applicazione dovrà essere riavviata.
Essendo una fonte aggiunta in maniera più prioritaria rispetto ai file di testo, User secrets è anche una buona soluzione per ridefinire facilmente i valori presenti in appsettings.json, così che ogni sviluppatore possa adattarli al suo ambiente di sviluppo senza apportare modifiche al file.
Azure Key Vault
Per l'ambiente di produzione, possiamo valutare Azure Key Vault, un servizio cloud per l'archiviazione sicura di chiavi crittografiche e ogni altro genere di valore di configurazione da tenere segreto. I valori sono protetti da crittografia at-rest, eventualmente supportata da moduli hardware dedicati (HMS) in modo da garantire un insuperabile livello di protezione. Inoltre, Azure Key Vault attua anche la crittografia in-transit, in modo che i valori di configurazione possano essere usati in maniera sicura anche all'esterno del datacenter di Azure, da applicazioni situate on-premise. L'accesso alle chiavi è regolato in lettura e in scrittura da un dettagliato sistema di permessi da concedere a utenti, applicazioni o macchine virtuali.