Archiviare in modo sicuro i segreti dell'applicazione durante lo sviluppo
Suggerimento
Questo contenuto è un estratto dell'eBook "Microservizi .NET: Architettura per le applicazioni .NET incluse in contenitori", disponibile in .NET Docs o come PDF scaricabile gratuitamente e da poter leggere offline.
Per connettersi a risorse protette e ad altri servizi, le applicazioni ASP.NET Core in genere usano stringhe di connessione, password o altre credenziali che contengono informazioni sensibili. Queste informazioni sensibili sono chiamate segreti. È consigliabile non includere i segreti nel codice sorgente e verificare di non archiviarli nel controllo del codice sorgente. È invece necessario usare il modello di configurazione di ASP.NET Core per eseguire la lettura dei segreti da posizioni più sicure.
È necessario separare i segreti per accedere alle risorse di sviluppo e di staging da quelli usati per accedere alle risorse di produzione, perché utenti diversi dovranno accedere a set di segreti diversi. Per archiviare i segreti usati per lo sviluppo, gli approcci comuni ne prevedono che vengano archiviati in variabili di ambiente o usando lo strumento Secret Manager di ASP.NET Core. Per l'archiviazione sicura negli ambienti di produzione, i microservizi possono archiviare i segreti in un'istanza del servizio Azure Key Vault.
Archiviare i segreti in variabili di ambiente
Un modo per mantenere i segreti al di fuori del codice sorgente è impostare i segreti basati su stringa come variabili di ambiente nei computer di sviluppo. Quando si usano le variabili di ambiente per archiviare i segreti con nomi gerarchici (ad esempio quelli annidati nelle sezioni di configurazione), è necessario creare un nome per le variabili che includa l'intera gerarchia delle sezioni, separate dai due punti (:).
Se ad esempio si imposta la variabile di ambiente Logging:LogLevel:Default
sul valore Debug
, questo equivale al valore di configurazione del file JSON seguente:
{
"Logging": {
"LogLevel": {
"Default": "Debug"
}
}
}
Per accedere a questi valori dalle variabili di ambiente, l'applicazione deve solo chiamare AddEnvironmentVariables
su ConfigurationBuilder
nell'ambito della costruzione di un oggetto IConfigurationRoot
.
Nota
Le variabili di ambiente vengono in genere archiviate come testo normale, quindi se il computer o il processo con le variabili di ambiente viene compromesso, i valori delle variabili di ambiente saranno visibili.
Archiviare i segreti tramite lo strumento Secret Manager di ASP.NET Core
Lo strumento Secret Manager di ASP.NET Core fornisce un altro metodo per mantenere i segreti al di fuori del codice sorgente durante lo sviluppo. Per usare lo strumento Secret Manager, installare il pacchetto Microsoft.Extensions.Configuration.SecretManager nel file di progetto. Quando questa dipendenza è presente ed è stata ripristinata, è possibile usare il comando dotnet user-secrets
per impostare il valore dei segreti dalla riga di comando. I segreti verranno archiviati in un file JSON nella directory del profilo dell'utente (i dettagli variano in base al sistema operativo), lontano dal codice sorgente.
I segreti impostati dallo strumento Secret Manager sono organizzati dalla proprietà UserSecretsId
del progetto che usa i segreti. Di conseguenza è necessario accertarsi di impostare la proprietà UserSecretsId nel file di progetto, come illustrato nel frammento di codice seguente. Il valore predefinito è un GUID assegnato da Visual Studio, ma la stringa vera e propria non è importante, purché sia univoca nel computer in uso.
<PropertyGroup>
<UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>
I segreti archiviati con Secret Manager vengono usati in un'applicazione chiamando AddUserSecrets<T>
nell'istanza di ConfigurationBuilder
per includere i segreti per l'applicazione nella relativa configurazione. Il parametro generico T
deve essere un tipo dell'assembly a cui la proprietà UserSecretId è stata applicata. In genere l'uso di AddUserSecrets<Startup>
funziona correttamente.
AddUserSecrets<Startup>()
è inclusa tra le opzioni predefinite per l'ambiente di sviluppo quando si usa il metodo CreateDefaultBuilder
in Program.cs.