🔐 Azure Key Vault

Interaktiver Guide: Wie Azure Key Vault funktioniert und wie du es in dein .NET 8 Backend integrierst

Was ist Azure Key Vault?

Azure Key Vault ist ein Cloud-Dienst von Microsoft zum sicheren Speichern und Zugreifen auf Geheimnisse (Secrets). Geheimnisse sind alles, worauf du den Zugriff streng kontrollieren willst - API-Schlüssel, Passwörter, Verbindungsstrings, Zertifikate oder kryptografische Schlüssel.

🔒
Klicke um den Vault zu öffnen
🔑

Secrets Management

Sichere Speicherung und Zugriffskontrolle für Tokens, Passwörter, API-Keys, Verbindungsstrings und andere Geheimnisse.

🗝️

Key Management

Erstelle und kontrolliere Verschlüsselungsschlüssel, die deine Daten schützen. Unterstützt HSM-geschützte Keys.

📜

Zertifikats-Verwaltung

Verwalte TLS/SSL-Zertifikate mit automatischer Erneuerung und einfachem Deployment.

Service-Tiers

Feature Standard Basis Premium HSM
Software-geschützte Keys
HSM-geschützte Keys ✓ FIPS 140-3 Level 3
Secrets
Zertifikate
Verschlüsselung FIPS 140 Level 1 FIPS 140-3 Level 3

Zero Trust: Azure Key Vault folgt dem Zero-Trust-Prinzip - "Verify explicitly", "Use least privilege access" und "Assume breach".

Wie funktioniert Azure Key Vault?

Key Vault hat zwei Ebenen: die Management Plane (Verwaltung des Vault selbst) und die Data Plane (Zugriff auf Secrets, Keys, Zertifikate).

Anfrage-Fluss: App → Key Vault

Deine .NET 8 Web-API oder Worker-Service, der Secrets aus dem Key Vault benötigt.
💻 .NET 8 Backend App Service / Container
Microsoft Entra ID (ehem. Azure AD) prüft die Identität der App mittels Managed Identity oder Service Principal.
👤 Microsoft Entra ID Authentifizierung
Der Key Vault prüft die RBAC-Berechtigungen und gibt bei Erfolg das angeforderte Secret zurück.
🔒 Azure Key Vault Secrets, Keys, Certs
📜 Secrets Passwörter, API-Keys
🔑 Keys RSA, EC-Schlüssel
📄 Certificates TLS/SSL-Zertifikate
💡

Tipp: Hover über die Boxen im Diagramm, um mehr Details zu erfahren!

Management Plane

Verwaltung des Key Vault selbst:

  • Key Vault erstellen / löschen
  • Zugriffsrichtlinien konfigurieren
  • Firewall-Regeln setzen
  • Netzwerkzugriff steuern
Azure Portal / CLI

Data Plane

Arbeit mit den Inhalten:

  • Secrets lesen / schreiben
  • Keys für Verschlüsselung nutzen
  • Zertifikate verwalten
  • Backup / Restore
SDK / REST API

Rollen im Key Vault

RolleAufgabe
Vault OwnerErstellt Key Vaults, hat vollen Zugriff, richtet Auditing ein
Vault ConsumerNutzt Secrets/Keys gemäß zugewiesener Berechtigungen
Security AdminÜberwacht Nutzung, kontrolliert Compliance
DeveloperIntegriert Key Vault über SDK in Anwendungen

Was kann im Key Vault gespeichert werden?

Key Vault speichert drei Arten von Objekten. Klicke auf die Werte unten, um sie ein-/auszublenden:

Typische Secrets in einem .NET 8 Backend

🔌 ConnectionStrings--DefaultDb Server=tcp:myserver.database.windows.net;Database=mydb;...
🔐 Jwt--SecretKey xK8sN2mP9qR4tV7wY1zA3bC5dE8fG0hJ
📧 SendGrid--ApiKey SG.xxxxxxxxxxxxx.yyyyyyyyyyyyy
📚 Storage--ConnectionString DefaultEndpointsProtocol=https;AccountName=...

Namenskonvention: Key Vault erlaubt keine Doppelpunkte (:) in Secret-Namen. Verwende stattdessen -- (zwei Striche) als Trennzeichen. Der ASP.NET Core Configuration Provider ersetzt diese automatisch durch :.

🔒

Secrets

Beliebige Zeichenketten bis 25KB. Ideal für Passwörter, Connection Strings, API-Keys.


Am häufigsten
🔑

Keys

Kryptografische Schlüssel (RSA, EC). Für Verschlüsselung, Signierung, Wrap/Unwrap.


Kryptografie
📄

Certificates

X.509-Zertifikate mit Auto-Renewal. Für TLS/SSL und Code-Signing.


Infrastruktur

Authentifizierung am Key Vault

Um auf Key Vault zuzugreifen, muss sich deine App über Microsoft Entra ID (Azure AD) authentifizieren. Es gibt drei Methoden - wähle eine:

📄 Service Principal + Zertifikat

App registriert sich in Entra ID und authentifiziert sich per X.509-Zertifikat. Für Apps außerhalb von Azure.

🔓 Service Principal + Secret

Authentifizierung per Client-ID und Client-Secret. Einfach, aber nicht empfohlen.

DefaultAzureCredential - Der universelle Ansatz

Das Azure SDK bietet DefaultAzureCredential, das automatisch die richtige Auth-Methode wählt:

Credential-Kette (wird der Reihe nach versucht)
1 Environment Variables - AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET
↓ falls nicht gesetzt
2 Managed Identity - System- oder User-assigned
↓ falls nicht verfügbar
3 Visual Studio / VS Code / Azure CLI - Entwickler-Credentials

Integration in .NET 8 Backend

Schritt-für-Schritt Anleitung zur Einrichtung von Azure Key Vault als Configuration Provider.

1 NuGet-Pakete installieren

Installiere die benötigten NuGet-Pakete in deinem Projekt:

Terminal
# Key Vault Configuration Provider
dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets

# Azure Identity (für DefaultAzureCredential)
dotnet add package Azure.Identity

# Optional: Direkte Secret-Client-Nutzung
dotnet add package Azure.Security.KeyVault.Secrets
2 Key Vault Name in appsettings.json hinterlegen
appsettings.json
{
  "KeyVaultName": "mein-keyvault-name",
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  }
}

Den tatsächlichen Vault-Namen aus dem Azure Portal verwenden (z.B. contoso-vault-prod).

3 Program.cs konfigurieren (Minimal API)
Program.cs
using Azure.Identity;

var builder = WebApplication.CreateBuilder(args);

// Key Vault als Configuration Provider hinzufügen
if (builder.Environment.IsProduction())
{
    builder.Configuration.AddAzureKeyVault(
        new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
        new DefaultAzureCredential());
}

// Services registrieren
builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();
app.Run();
💡

In der Produktion werden Secrets aus Key Vault geladen. Lokal kannst du weiterhin appsettings.Development.json oder User Secrets nutzen.

4 Secrets im Code verwenden

Secrets werden automatisch in die IConfiguration geladen und können wie gewohnt genutzt werden:

MyService.cs - per IConfiguration
public class MyService
{
    private readonly string _connectionString;

    public MyService(IConfiguration configuration)
    {
        // Secret-Name im Vault: "ConnectionStrings--DefaultDb"
        // Wird automatisch zu: "ConnectionStrings:DefaultDb"
        _connectionString = configuration
            .GetConnectionString("DefaultDb")!;
    }
}
Program.cs - per Options Pattern
// Options-Klasse definieren
public class JwtSettings
{
    public string SecretKey { get; set; } = "";
    public string Issuer { get; set; } = "";
    public int ExpiryMinutes { get; set; }
}

// In Program.cs registrieren
builder.Services.Configure<JwtSettings>(
    builder.Configuration.GetSection("Jwt"));

// Im Service per DI nutzen
public class AuthService(IOptions<JwtSettings> jwtSettings)
{
    private readonly JwtSettings _jwt = jwtSettings.Value;
}
5 Secrets im Azure Key Vault anlegen

Per Azure CLI oder Azure Portal:

Azure CLI
# Key Vault erstellen
az keyvault create \
  --name mein-keyvault-name \
  --resource-group MeineRG \
  --location westeurope

# Secrets hinzufügen
az keyvault secret set \
  --vault-name mein-keyvault-name \
  --name "ConnectionStrings--DefaultDb" \
  --value "Server=tcp:myserver.database.windows.net;..."

az keyvault secret set \
  --vault-name mein-keyvault-name \
  --name "Jwt--SecretKey" \
  --value "mein-super-geheimer-jwt-key"

# App Service Managed Identity Zugriff geben
az keyvault set-policy \
  --name mein-keyvault-name \
  --object-id {APP_OBJECT_ID} \
  --secret-permissions get list
6 Für lokale Entwicklung einrichten

Lokal authentifiziert sich DefaultAzureCredential über Azure CLI oder Visual Studio:

Terminal
# Einmalig: Bei Azure anmelden
az login

# Optional: Key Vault auch in Development laden
# (dann if-Bedingung in Program.cs entfernen)
Program.cs - Alle Umgebungen
var builder = WebApplication.CreateBuilder(args);

// Key Vault in ALLEN Umgebungen laden
var keyVaultName = builder.Configuration["KeyVaultName"];
if (!string.IsNullOrEmpty(keyVaultName))
{
    builder.Configuration.AddAzureKeyVault(
        new Uri($"https://{keyVaultName}.vault.azure.net/"),
        new DefaultAzureCredential());
}
7 Erweitert: Auto-Reload und Präfix-Filter
Program.cs - Erweiterte Konfiguration
using Azure.Extensions.AspNetCore.Configuration.Secrets;
using Azure.Identity;

builder.Configuration.AddAzureKeyVault(
    new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
    new DefaultAzureCredential(),
    new AzureKeyVaultConfigurationOptions
    {
        // Secrets alle 5 Minuten neu laden
        ReloadInterval = TimeSpan.FromMinutes(5),

        // Optional: Nur bestimmte Secrets laden
        Manager = new KeyVaultSecretManager()
    });

// Für User-Assigned Managed Identity:
builder.Configuration.AddAzureKeyVault(
    new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
    new DefaultAzureCredential(new DefaultAzureCredentialOptions
    {
        ManagedIdentityClientId = builder.Configuration["AzureADManagedIdentityClientId"]
    }));

Best Practices

✓ Do's

  • Ein Key Vault pro App + Umgebung - Trennung von Dev, Staging, Prod
  • Managed Identity verwenden - Keine Credentials im Code
  • Azure RBAC nutzen - Statt Legacy Access Policies
  • Least Privilege Principle - Nur Get + List für Apps
  • Auditing aktivieren - Alle Zugriffe protokollieren
  • Soft-Delete aktivieren - Schutz vor versehentlichem Löschen
  • Netzwerkzugriff einschränken - Private Endpoints oder Service Endpoints

✗ Don'ts

  • Secrets im Code oder appsettings.json speichern
  • Key Vault als allgemeinen Config-Store nutzen - Dafür Azure App Configuration verwenden
  • Service Principal + Secret verwenden - Henne-Ei-Problem
  • Einen Key Vault für alle Apps teilen - Blast Radius!
  • Legacy Access Policies - Sicherheitslücken, kein PIM-Support
  • Zertifikate als Secrets speichern - Dafür Certificate-Typ verwenden
  • Kunden-Konfiguration im Key Vault - Azure Storage nutzen

Environments-Strategie für .NET 8

Umgebung Secret-Quelle Auth-Methode
Development User Secrets (dotnet user-secrets) Azure CLI / Visual Studio
Staging Azure Key Vault (Staging-Vault) Managed Identity
Production Azure Key Vault (Prod-Vault) Managed Identity

Vollständiges Beispiel: Program.cs

Program.cs - Production-Ready
using Azure.Identity;

var builder = WebApplication.CreateBuilder(args);

// ============================================
// Key Vault Configuration Provider
// ============================================
var keyVaultName = builder.Configuration["KeyVaultName"];
if (!string.IsNullOrEmpty(keyVaultName))
{
    builder.Configuration.AddAzureKeyVault(
        new Uri($"https://{keyVaultName}.vault.azure.net/"),
        new DefaultAzureCredential());
}

// ============================================
// Services
// ============================================
builder.Services.AddControllers();

// Secrets über Options Pattern nutzen
builder.Services.Configure<JwtSettings>(
    builder.Configuration.GetSection("Jwt"));

// Connection String aus Key Vault
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(
        builder.Configuration.GetConnectionString("DefaultDb")));

var app = builder.Build();

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

Wissenstest: Azure Key Vault

Teste dein Wissen mit diesen Fragen!

1. Welche Authentifizierungsmethode wird für Azure Key Vault empfohlen?

2. Wie trennt man hierarchische Konfigurationswerte in Key Vault Secret-Namen?

3. Welches NuGet-Paket wird für den Key Vault Configuration Provider benötigt?

4. Was ist die empfohlene Key Vault Strategie für mehrere Apps?

5. Was macht DefaultAzureCredential?