DevelopmentAzure Key Vault

Azure Key Vault

Key Vault SDK versus Key Vault references

Tegenwoordig komt het steeds vaker voor dat er data wordt buitgemaakt door hackers. Recente cases zijn bijvoorbeeld die van Terravision, Vrienden van Amstel Live en nog meer..! Het wordt dan ook steeds belangrijker om op een zorgvuldige en “goede” manier om te gaan met onze gegevens. Eén van de onderdelen hiervan is het opslaan van credentials die door applicaties worden gebruikt. Binnen de Microsoft stack is Azure Key Vault één van  de aangewezen producten om hierin te voorzien.

Wat is Azure Key Vault ook alweer..? Dit is een cloud service waarin we geheimen veilig kunnen opslaan en openen. Een geheim is alles waarvan je de toegang strikt wil beheren. Bijvoorbeeld wachtwoorden en certificaten. In deze blog bespreek ik op welke mogelijkheden er zijn om in een .NET applicatie de geheimen in een Azure Key Vault te “openen” en wat de verschillen tussen deze opties zijn.

Korte recap: Wat zijn de .Net Secret(s) Client Library en Azure Keyvault References ook alweer?

De .NET client library biedt een configuratie provider aan die inhaakt op IConfiguration. De NuGet Package Azure.Extensions.AspNetCore.Configuration.Secrets bevat een methode “AddAzureKeyVault” die het mogelijk maakt om de naam van de Keyvault te specificeren en de authenticatie in te stellen. Eenmaal ingesteld worden alle secrets in één keer ingeladen voor de levensduur van je applicatie. Dit gebeurt zoals weergegeven hieronder:

Azure Keyvault

Azure Key Vault References worden ingesteld in het App Settings gedeelte van een bijv. Azure Function of Azure App Services. Het format hier van is @Microsoft.Keyvault(…) en kent twee annotaties:

  1. @Microsoft.KeyVault(SecretUri=https://<key-vault-name>.vault.azure.net/secrets/<secret-name>/<secret-version>/)
  2. @Microsoft.KeyVault(VaultName=<key-vault-name>; SecretName=<secret-name>; SecretVersion=<secret-version>/)

Verschillen tussen .Net Secret Client Library en Azure Key Vault references

Zoals we in de korte recap hebben gezien, zijn beide verschilende manieren om toegang te krijgen tot een geheim in de Azure Key Vault, maar hoe zit het nu met de verschillen? De belangrijkste verschillen die er zijn:

  • Manier van implementeren: De .NET Secret Client library voeg je toe als een NuGet Package in je project. Hiermee kunnen geheimen run time worden opgehaald uit Key Vault. Azure Key Vault References daarentegen laad je direct in je appsettings in.
  • Performance: De .NET Secret Client library heeft een betere performance dan Key Vault Reference. De NuGet package slaat de geheim in-memory (oftewel in het geheugen) van je applicatie, wat het aantal requests naar Key Vault verminderd. Key Vault References lezen de geheimen telkens opnieuw in wanneer de applicatie ze nodig heeft, wat overall de performance beïnvloed.
  • Kosten: Microsoft rekent 0,03 USD per 10000 transacties. Het in één keer betalen hiervan tijdens het opstarten van je applicatie is veel goedkoper dan telkens per request.
  • Authenticatie:  De .NET Secret Client library biedt bij het gebruik van DefaultAzureCredential meerdere manieren van authenticatie aan die allemaal worden uitgeprobeerd om te zien welke de applicatie “nodig” heeft. Onderstaand wordt de volgorde weergegeven:
    • Environment variables
    • Managed Identity
    • Shared Token
    • Visual Studio
    • Visual Studio Code
    • Azure CLI
    • Azure Powershell
    • Interactive Browser

Azure Key Vault References maken gebruik van de Azure AD credentials van de applicatie of service die toegang proberen te krijgen tot de Key Vault.

  • Onderhoud: Beide manieren vergen onderhoud. Wanneer de .NET Secret Client library wordt gebruikt moet bij elke update van een geheim in de Key Vault de Azure App service/function worden herstart waar de .NET applicatie op draait om de laatste versie van een geheim te laten inlezen. Azure Key Vault references vergen minder onderhoud zolang de uri van eindigt met een backslash. Dan wordt standaard de laatste versie van een geheim gebruikt. Verder heb je initieel minder programmeerwerk, doordat een reference wordt omgezet in een omgevingsvariabele die je makkelijk kunt benaderen middels Environment.GetEnvironmentVariable(“SomeName”).

Wanneer kies je .Net Client Secret library of Azure Key Vault references?

De .NET Secret Client library is de betere keuze in scenario’s waarbij je applicatie frequent toegang nodig heeft tot Key Vault of performance een must is. Verder biedt deze optie ook meer flexibiliteit en customization mogelijkheden dan Azure Key Vault references. Te denken valt aan versiebeheer van je geheimen, cache instellingen of aantal retry-pogingen. Tot slot heeft .Net Secret Client library nog als bijkomend voordeel dat hij gebruikt kan worden in omgevingen anders dan Azure.

Azure Key Vault references zijn handiger in scenario’s wanneer je applicatie gebruikt maakt van een beperkt aantal geheimen en customization niet belangrijk is. Verder zijn ze eenvoudiger in gebruik wanneer directe toegang tot Azure Key Vault is toegestaan.

Conclusie

Azure Key Vault kan op meerdere manieren worden geïmplementeerd voor .NET-applicaties. De .NET Secret(s) Client library is met name geschikt voor scenario’s waarin frequent toegang tot Key Vault nodig is, performance van belang is en meer flexibiliteit/aanpassingsmogelijkheden nodig zijn. Azure Key Vault references zijn handiger voor applicaties met een beperkt aantal geheimen en weinig aanpassingen. De uiteindelijke keuze hangt van de wensen van het project.

Meer vragen over Azure Key Vault en hoe wij deze gebruiken? Stuur ons dan een e-mail.

Gideon Kuijpers – Software Developer

  • Wil jij ook dagelijks Mederne Applicaties bouwen? Bekijk vacatures!