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
appsettings.jsondefiniert Key Vault Name und Prefix- Beim App-Start werden alle Secrets mit dem Prefix aus dem Vault geladen
- 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-Pfad | Secret-Name im Vault |
|---|---|
ConnectionStrings:Default | meineapp--ConnectionStrings--Default |
ExternalAuth:Oidc:ClientSecret | meineapp--ExternalAuth--Oidc--ClientSecret |
Regeln:
:wird zu--_wird zu-- Max. 127 Zeichen, nur alphanumerisch und Bindestriche
Authentifizierung gegenueber Key Vault
Die Authentifizierung laeuft ueber DefaultAzureCredential:
| Umgebung | Methode |
|---|---|
| Development | Eingeloggter User (az login / Visual Studio) |
| VuDev bis Stage | Enterprise Application pro Umgebung (Umgebungsvariablen) |
| Prod | Enterprise Application pro Server (Umgebungsvariablen) |
Umgebungsvariablen auf den Servern:
AZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_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
| Umgebung | Key Vault | Subscription | Resource Group |
|---|---|---|---|
| Development | at-tgca-tis-d-default | Together-Fachtest | TIS-Secrets |
| VuDev | at-tgca-tis-v-default | Together-Fachtest | TIS-Secrets |
| Fachtest | at-tgca-tis-f-default | Together-Fachtest | TIS-Secrets |
| Stage | at-tgca-tis-s-default | Together-Fachtest | TIS-Secrets |
| Prod | at-tgca-tis-p-default | Together-Prod | TIS-Secrets |
Enterprise Applications & Berechtigungen
Gruppen mit Key Vault Berechtigungen (Key Vault Certificates User, Key Vault Secrets User, Key Vault Reader):
| Umgebung | Enterprise App | Gruppe | Client ID |
|---|---|---|---|
| VuDev | vudev-apps | Vudev-Applications | de3dff43-e8f5-4971-973d-b8143a48670d |
| Fachtest | fachtest-apps | Fachtest-Applications | 7b099cbc-8d97-456e-9297-c7c5723b3a24 |
| Stage | stage-apps | Stage-Applications | c64135ff-c944-47b8-a9b6-ff9a6deb89e3 |
| Prod | (pro Server) | Prod-Applications | (siehe Server-Status) |
Server-Status
VuDev (Client ID: de3dff43-...670d)
| Server | Status |
|---|---|
| TISWEB001 | ❌ |
| TISAPP001 | ❌ |
| TISAPP01 | ❌ |
| TISAPP003 | ❌ |
| TISDB001 | ❌ |
| TISDB002 | ❌ |
Fachtest (Client ID: 7b099cbc-...3a24)
| Server | Status |
|---|---|
| TISWEB001 | ✅ |
| TISWEB002 | ❌ |
| TISAPP01 | ✅ |
| TISAPP02 | ✅ |
| TISAPP03 | ✅ |
| TISDB003 | ✅ |
| TISDB004 | ✅ |
Stage (Client ID: c64135ff-...89e3)
| Server | Status |
|---|---|
| TISWEB001 | ❌ |
| TISWEB002 | ❌ |
| TISAPP01 | ✅ |
| TISAPP002 | ✅ |
| TISAPP003 | ✅ |
| TISDB001 | ❌ |
| TISDB002 | ❌ |
Prod (je eine Enterprise App pro Server)
| Server | Client ID | Status |
|---|---|---|
| TISWEB01 | 492a80a5-3833-4865-bd63-ab29ea5518df | ✅ |
| TISWEB02 | TBD | ❌ |
| TISAPP01 | ab476948-f483-4c29-9880-0361a6d1f338 | ✅ |
| TISAPP02 | f534c19b-dc96-4c07-a92c-91368b820342 | ✅ |
| TISAPP03 | b31f1912-ec54-4877-9b74-7cbfd23778dc | ✅ |
| TISDB01 | 62de3629-d55f-41da-b5e4-c9f6d967cd2b | ✅ |
| TISDB02 | da762a94-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:
-
Dry-run ausfuehren um Secrets zu erkennen:
tis-secrets migrate -v at-tgca-tis-f-default -p meineapp -e fachtest --dry-run -
Migration durchfuehren (ersetzt Secrets mit AKV-Referenzen):
tis-secrets migrate -v at-tgca-tis-f-default -p meineapp -e fachtest -
Fuer jede Umgebung wiederholen (development, vudev, fachtest, stage, prod)
Optionen:
| Flag | Beschreibung |
|---|---|
--no-replace | Nur zu AKV hochladen, Config-Files nicht aendern |
--replace-base | Auch base appsettings.json ersetzen (nach allen Umgebungen) |
--dry-run | Zeigt was passieren wuerde ohne Aenderungen |
Fuer komplexe Projekte mit mehreren Config-Files: .secret-migration.json im Projektroot anlegen.
Manuell ueber Azure Portal
- Azure Portal > Key Vault > Secrets > Generate/Import
- Secret-Name nach Naming-Konvention:
{prefix}--{section}--{key} - 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-secretsDokumentation)
Lokale Entwicklung
Fuer lokale Entwicklung ohne echte Secrets:
- Azure CLI Login:
az loginausfuehren - DefaultAzureCredential nutzt den eingeloggten User - 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-secretsTool oder manuell in AKV eingetragen werden