Zum Hauptinhalt springen

Secret Management

Co-Authored-By: Claude (noreply@anthropic.com)

Ueberblick

Secrets (Connection Strings, API Keys, Zertifikate) werden zentral in Azure Key Vaults verwaltet. Jede Umgebung hat eigene Key Vaults.

Applikationen laden Secrets beim Start ueber das NuGet-Paket Tis.Hosting.Extensions.Configuration.Secrets, das auf Azure.Extensions.AspNetCore.Configuration.Secrets aufbaut.

So funktioniert es

  1. appsettings.json definiert Key Vault Name und Prefix
  2. Beim App-Start werden alle Secrets mit dem Prefix aus dem Vault geladen
  3. Secrets stehen danach als normale Configuration-Werte zur Verfuegung (IConfiguration)
{
"KeyVault": {
"VaultName": "at-tgca-tis-f-default",
"Prefix": "meineapp"
}
}
builder.Configuration.AddAzureKeyVaultFromConfig();

Secret-Naming im Vault

Secrets folgen dem Pattern {prefix}--{section}--{key}:

appsettings-PfadSecret-Name im Vault
ConnectionStrings:Defaultmeineapp--ConnectionStrings--Default
ExternalAuth:Oidc:ClientSecretmeineapp--ExternalAuth--Oidc--ClientSecret

Regeln:

  • : wird zu --
  • _ wird zu -
  • Max. 127 Zeichen, nur alphanumerisch und Bindestriche

Authentifizierung gegenueber Key Vault

Die Authentifizierung laeuft ueber DefaultAzureCredential:

UmgebungMethode
DevelopmentEingeloggter User (az login / Visual Studio)
VuDev bis StageEnterprise Application pro Umgebung (Umgebungsvariablen)
ProdEnterprise Application pro Server (Umgebungsvariablen)

Umgebungsvariablen auf den Servern:

  • AZURE_CLIENT_ID
  • AZURE_CLIENT_SECRET
  • AZURE_TENANT_ID

Tenant-ID: 13d188a3-27b5-44c8-a858-a4c34d245819

Naming Standards

Siehe Tis.Hosting.Extensions/docs/KEYVAULT_NAMING.md fuer die vollstaendigen Naming-Konventionen.

Kurzfassung:

at-tgca-{produktgruppe}-{environment}-{zweck}

Beispiel: at-tgca-tis-f-default = TIS Fachtest Standard-Secrets

Azure Resourcen & Umgebungen

Key Vaults

UmgebungKey VaultSubscriptionResource Group
Developmentat-tgca-tis-d-defaultTogether-FachtestTIS-Secrets
VuDevat-tgca-tis-v-defaultTogether-FachtestTIS-Secrets
Fachtestat-tgca-tis-f-defaultTogether-FachtestTIS-Secrets
Stageat-tgca-tis-s-defaultTogether-FachtestTIS-Secrets
Prodat-tgca-tis-p-defaultTogether-ProdTIS-Secrets

Enterprise Applications & Berechtigungen

Gruppen mit Key Vault Berechtigungen (Key Vault Certificates User, Key Vault Secrets User, Key Vault Reader):

UmgebungEnterprise AppGruppeClient ID
VuDevvudev-appsVudev-Applicationsde3dff43-e8f5-4971-973d-b8143a48670d
Fachtestfachtest-appsFachtest-Applications7b099cbc-8d97-456e-9297-c7c5723b3a24
Stagestage-appsStage-Applicationsc64135ff-c944-47b8-a9b6-ff9a6deb89e3
Prod(pro Server)Prod-Applications(siehe Server-Status)

Server-Status

VuDev (Client ID: de3dff43-...670d)

ServerStatus
TISWEB001
TISAPP001
TISAPP01
TISAPP003
TISDB001
TISDB002

Fachtest (Client ID: 7b099cbc-...3a24)

ServerStatus
TISWEB001
TISWEB002
TISAPP01
TISAPP02
TISAPP03
TISDB003
TISDB004

Stage (Client ID: c64135ff-...89e3)

ServerStatus
TISWEB001
TISWEB002
TISAPP01
TISAPP002
TISAPP003
TISDB001
TISDB002

Prod (je eine Enterprise App pro Server)

ServerClient IDStatus
TISWEB01492a80a5-3833-4865-bd63-ab29ea5518df
TISWEB02TBD
TISAPP01ab476948-f483-4c29-9880-0361a6d1f338
TISAPP02f534c19b-dc96-4c07-a92c-91368b820342
TISAPP03b31f1912-ec54-4877-9b74-7cbfd23778dc
TISDB0162de3629-d55f-41da-b5e4-c9f6d967cd2b
TISDB02da762a94-2fcf-4e67-8d47-c7bce2d46393

Neues Secret hinzufuegen

Mit tis-secrets Tool (empfohlen)

Das CLI-Tool tis-secrets automatisiert die Migration von Secrets aus appsettings.json nach Azure Key Vault.

Installation:

dotnet tool install --global Tis.Tools.Secrets --add-source https://pkgs.dev.azure.com/togethercca/_packaging/tis-cca/nuget/v3/index.json

Workflow:

  1. Dry-run ausfuehren um Secrets zu erkennen:

    tis-secrets migrate -v at-tgca-tis-f-default -p meineapp -e fachtest --dry-run
  2. Migration durchfuehren (ersetzt Secrets mit AKV-Referenzen):

    tis-secrets migrate -v at-tgca-tis-f-default -p meineapp -e fachtest
  3. Fuer jede Umgebung wiederholen (development, vudev, fachtest, stage, prod)

Optionen:

FlagBeschreibung
--no-replaceNur zu AKV hochladen, Config-Files nicht aendern
--replace-baseAuch base appsettings.json ersetzen (nach allen Umgebungen)
--dry-runZeigt was passieren wuerde ohne Aenderungen

Fuer komplexe Projekte mit mehreren Config-Files: .secret-migration.json im Projektroot anlegen.

Manuell ueber Azure Portal

  1. Azure Portal > Key Vault > Secrets > Generate/Import
  2. Secret-Name nach Naming-Konvention: {prefix}--{section}--{key}
  3. In appsettings.json AKV-Referenz eintragen:
    "ConnectionStrings": {
    "Default": "@Microsoft.KeyVault(VaultName=at-tgca-tis-f-default;SecretName=meineapp--ConnectionStrings--Default)"
    }

Richtlinien fuer Entwickler

Grundregeln

  • Keine Secrets in Source Code - Secrets gehoeren in Azure Key Vault, nicht in appsettings.json oder Code
  • AKV-Referenzen verwenden - Statt Klartext-Werten @Microsoft.KeyVault(...) Referenzen nutzen
  • Git History beachten - Nach Migration Secrets aus Git History entfernen (siehe tis-secrets Dokumentation)

Lokale Entwicklung

Fuer lokale Entwicklung ohne echte Secrets:

  1. Azure CLI Login: az login ausfuehren - DefaultAzureCredential nutzt den eingeloggten User
  2. User Secrets (Alternative): dotnet user-secrets set "ConnectionStrings:Default" "..."

Review-Pflichten

  • PRs mit appsettings-Aenderungen pruefen ob Secrets enthalten sind
  • Neue Secrets muessen ueber tis-secrets Tool oder manuell in AKV eingetragen werden