AWS Secrets Manager Γ¨ un gestore di chiavi private come credenziali di database, API Keys e password. Oltre allo storage offre la possibilitΓ di versionare i segreti, quindi mantenerne uno storico e di ruotarli, quindi ogni tot tempo questi vengono automaticamente modificati tramite una Lambda. in questo modo anche se un secret viene leakato dopo poco tempo si invalida e viene automaticamente ruotato con uno nuovo. Questo ha lβobiettivo di evitare di includere credenziali nei codici sorgenti.
Pricing
Free trial di 30 giorni e poi 40 cent per secret e 0.05β¬ ogni 10k API call.
ASP.NET
Lβobiettivo Γ¨ avere il secrete nelle mie Ioptions
come se fossero nel file appsettings.json
senza che il secret ci sia effettivamente.
Per prima cosa creo il secret in AWS con la sintassi
{ASPNETCORE_ENVIRONMENT}_{AssemblyName}_{ChiaveAppSettings.json}:{SottoChiaveAppSettings.json}
.
- Lβenvironment lo si trova in
Properties/launchsettings.json
con chiaveenvironmentVariables->ASPNETCORE_ENVIRONMENT
e per esempio assume il valoreDevelopment
. AssemblyName
Γ¨ il nome del progetto, per esempioWeather.Api
ChiaveAppSettings.json
Γ¨ il nome della chiave inappsettings.json
qualora il secret sia lì. in questo modo il codice utilizzatore sarà identico che la chiave sia inappsettings.json
o inAWS Secrets Manager
. EsempioOpenWeatherMapApi
SottoChiaveAppSettings.json
allβinterno della chiave sopra ci sarΓ una chiave, che Γ¨ questa, il cui valore Γ¨ lakey
in questione che sto cercando. EsempioApiKey
.
Per fare questo utilizzo il pacchetto nuget Kralizek.Extensions.Configuration.AWSSecretsManager
e aggiungo queste righe per fare il mapping.
Se invece di IOptions
utilizzo IOptsionsMonitor
posso usare anche la rotazione, impostando un PollingInterval
ogni tot viene richiesto il valore del secret ad AWS ed eventualmente aggiornato.
builder.Configuration.AddSecretsManager(configurator: options =>
{
options.SecretFilter = entry => entry.Name.StartsWith($"{env}_{appName}");
options.KeyGenerator = (_, s) => s
.Replace($"{env}_{appName}_", string.Empty);
options.PollingInterval = TimeSpan.FromMinutes(10);
});