Automatisera rotationen av en hemlighet för resurser som har två uppsättningar autentiseringsuppgifter

Det bästa sättet att autentisera till Azure tjänster är med en hanterad identitet, men vissa scenarier kräver fortfarande åtkomstnycklar eller lösenord. Rotera dessa autentiseringsuppgifter ofta för att minska effekten av en läcka.

Den här handledningen visar hur du kan automatisera regelbunden rotation av hemligheter för databaser och tjänster som använder två uppsättningar autentiseringsuppgifter. En översikt över autorotation över olika tillgångstyper finns i Förstå autorotation i Azure Key Vault.

Närmare bestämt byter den här självstudien ut kontonycklar för Azure Storage som lagras som hemligheter i Azure Key Vault. Den använder en funktion som utlöses av ett Azure Event Grid meddelande.

Important

För Azure Storage föredrar du Microsoft Entra ID auktorisering med en hanterad identitet framför delade kontonycklar. Om efterlevnad tillåter inaktiverar du auktorisering av delad nyckel på lagringskontot och tar bort behovet av nyckelrotation helt. Använd mönstret i den här självstudien endast när en arbetsbelastning kräver en lagringskontonyckel eller en anslutningssträng.

Här är rotationslösningen som beskrivs i denna handledning:

Diagram som visar rotationslösningen.

I den här lösningen lagrar Azure Key Vault åtkomstnyckeln för varje lagringskonto som en version av samma hemlighet och växlar mellan den primära och sekundära nyckeln i efterföljande versioner. När en åtkomstnyckel lagras som den senaste versionen av hemligheten återskapas den alternativa nyckeln och läggs till i Key Vault som den nya senaste versionen. Den här designen ger programmet en fullständig rotationscykel för att hämta den nyligen återskapade nyckeln.

  1. Trettio dagar före utgångsdatumet för en hemlighet publicerar Key Vault händelsen om nära förestående utgång till Event Grid.
  2. Event Grid kontrollerar händelseprenumerationerna och använder HTTP POST för att anropa funktionsappens slutpunkt som prenumererar på händelsen.
  3. Funktionsappen identifierar den alternativa nyckeln (inte den senaste) och anropar lagringskontot för att återskapa den.
  4. Funktionsappen lägger till den återskapade nyckeln till Azure Key Vault som den nya versionen av hemligheten.

Förutsättningar

  • En Azure-abonnemang. Skapa en kostnadsfritt.
  • Azure Cloud Shell. I den här självstudien används portalen Cloud Shell med PowerShell-miljön.
  • Ett Azure-nyckelvalv.
  • Två Azure lagringskonton.

Anmärkning

Om du roterar en delad lagringskontonyckel återkallas alla signaturer för delad åtkomst på kontonivå (SAS) som genereras från den nyckeln. Efter rotationen återskapar du SAS-token på kontonivå för att undvika avbrott i program.

Om du inte har ett befintligt nyckelvalv och två lagringskonton använder du den här distributionslänken:

Link som är märkt Deploy to Azure.

  1. Välj Skapa ny under Resursgrupp. Ge gruppvalvet namnet rotation och välj sedan OK.

  2. Välj Förhandsgranska + skapa.

  3. Välj Skapa.

    Skärmbild som visar hur du skapar en resursgrupp.

Nu har du ett nyckelvalv och två lagringskonton. Kontrollera den här konfigurationen i Azure CLI eller Azure PowerShell:

az resource list -o table -g vaultrotation

Resultatet ser ut ungefär som följande utdata:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
vaultrotation-kv         vaultrotation      westus      Microsoft.KeyVault/vaults
vaultrotationstorage     vaultrotation      westus      Microsoft.Storage/storageAccounts
vaultrotationstorage2    vaultrotation      westus      Microsoft.Storage/storageAccounts

Skapa och distribuera nyckelroteringsfunktionen

Skapa sedan en funktionsapp med en systemtilldelad hanterad identitet tillsammans med de andra nödvändiga komponenterna och distribuera rotationsfunktionen för lagringskontonycklarna.

Rotationsfunktionen kräver följande komponenter och konfiguration:

  • En Azure App Service plan.
  • Ett lagringskonto för att hantera utlösare för funktionsappen.
  • En Azure rolltilldelning som låter funktionsappen komma åt hemligheter i nyckelvalvet.
  • Tjänstrollen För lagringskontonyckeloperatör tilldelad till funktionsappen så att den kan komma åt lagringskontots åtkomstnycklar.
  • En nyckelrotationsfunktion med en Event Grid-utlösare och en HTTP-utlösare (för rotation på begäran).
  • En Event Grid-händelseprenumeration för SecretNearExpiry-händelsen .
  1. Välj distributionslänken Azure mall:

    Azure malldistributionslänk.

  2. I listan Resursgrupp väljer du valvrotation.

  3. I Lagringskontots RG anger du namnet på resursgruppen där lagringskontot finns. Behåll standardvärdet [resourceGroup().name] om lagringskontot finns i samma resursgrupp som rotationsfunktionen.

  4. I Lagringskontonamn anger du namnet på det lagringskonto vars åtkomstnycklar du vill rotera. Behåll standardvärdet [concat(resourceGroup().name, 'storage')] om du använder lagringskontot från Krav.

  5. I Key Vault RG anger du namnet på resursgruppen där key vault finns. Behåll standardvärdet [resourceGroup().name] om nyckelvalvet finns i samma resursgrupp som rotationsfunktionen.

  6. I Key Vault Namn anger du namnet på key vault. Behåll standardvärdet [concat(resourceGroup().name, '-kv')] om du använder nyckelvalvet från Förutsättningar.

  7. I App Service-plantyp väljer du värdplanen. Premium-plan krävs endast när nyckelvalvet ligger bakom en brandvägg.

  8. I Funktionsappens namn anger du funktionsappens namn.

  9. I Hemligt namn anger du det hemliga namn som lagrar åtkomstnycklarna.

  10. I Repo-URL anger du GitHub plats för funktionskoden: https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git.

  11. Välj Förhandsgranska + skapa.

  12. Välj Skapa.

    Skärmbild som visar hur du skapar och distribuerar funktionen.

När distributionen är klar har du ett lagringskonto, en servergrupp, en funktionsapp och en Application Insights-resurs:

Skärmbild som visar sidan Distributionen är klar.

Anmärkning

Den här ARM-mallen använder App Service-distributionen för källkontroll (Kudu) för att hämta funktionskoden från GitHub. För en produktionsarbetsbelastning rekommenderar vi en paketbaserad distribution, till exempel func azure functionapp publish eller zip-distribution med WEBSITE_RUN_FROM_PACKAGE i stället. Om distributionen misslyckas väljer du Omdistribuera för att försöka igen.

Distributionsmallar och kod för rotationsfunktionen finns i Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.

Lägg till lagringskontots åtkomstnycklar till Key Vault hemligheter

Först tilldelar du dig rollen Key Vault Secrets Officer så att du kan hantera hemligheter i valvet:

az role assignment create --role "Key Vault Secrets Officer" --assignee <email-address-of-user> --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/vaultrotation-kv

Nu kan du skapa en hemlighet vars värde är en åtkomstnyckel för lagringskontot. Tillsammans med värdet lägger du till resurs-ID för lagringskontot, hemlig giltighetsperiod och nyckel-ID som taggar så att rotationsfunktionen kan återskapa nyckeln i lagringskontot.

Fastställa lagringskontots resurs-ID. Det är egenskapen id :

az storage account show -n vaultrotationstorage

Ange åtkomstnycklarna för lagringskontot så att du kan hämta nyckelvärdena:

az storage account keys list -n vaultrotationstorage

Lägg till hemligheten i nyckelvalvet med en giltighetsperiod på 60 dagar och (för demonstrationssyfte) ett utgångsdatum imorgon så att rotation utlöses omedelbart. Kör det här kommandot med dina hämtade värden för key1Value och storageAccountResourceId:

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1-value> --tags "CredentialId=key1" "ProviderAddress=<storage-account-resource-id>" "ValidityPeriodDays=60" --expires $tomorrowDate

Den här hemligheten utlöser en händelse av typen SecretNearExpiry inom några minuter, vilket i sin tur gör att funktionen roterar hemligheten med ett utgångsdatum 60 dagar fram i tiden. I den konfigurationen utlöses händelsen SecretNearExpiry var 30:e dag (30 dagar före utgångsdatumet), och rotationsfunktionen växlar mellan key1 och key2.

Kontrollera att åtkomstnycklarna har återskapats genom att hämta lagringskontonyckeln och den Key Vault hemligheten och sedan jämföra dem.

Använd det här kommandot för att hämta den hemliga informationen:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey

Observera att CredentialId har uppdaterats till det alternativa keyName och som value återskapas:

Skärmbild som visar utdata från kommandot A Z keyvault secret show för det första lagringskontot.

Hämta åtkomstnycklarna för att jämföra värdena:

az storage account keys list -n vaultrotationstorage

Observera att nyckelvärdet matchar hemligheten i nyckelvalvet:

Skärmbild som visar utdata från kommandot A Z storage account keys list för det första lagringskontot.

Använda en befintlig rotationsfunktion för flera lagringskonton

Du kan återanvända samma funktionsapp för att rotera nycklar för mer än ett lagringskonto.

Om du vill lägga till ett annat lagringskontos nycklar till en befintlig rotationsfunktion behöver du:

  • Tjänstrollen För lagringskontonyckeloperatör tilldelad till funktionsappen så att den kan komma åt lagringskontots åtkomstnycklar.
  • En Event Grid-händelseprenumeration för SecretNearExpiry-händelsen .
  1. Välj distributionslänken Azure mall:

    Azure malldistributionslänk.

  2. I listan Resursgrupp väljer du valvrotation.

  3. I Lagringskontots RG anger du namnet på resursgruppen där lagringskontot finns. Behåll standardvärdet [resourceGroup().name] om lagringskontot finns i samma resursgrupp som rotationsfunktionen.

  4. I Lagringskontonamn anger du namnet på det lagringskonto vars åtkomstnycklar du vill rotera.

  5. I Key Vault RG anger du namnet på resursgruppen där key vault finns. Behåll standardvärdet [resourceGroup().name] om nyckelvalvet finns i samma resursgrupp som rotationsfunktionen.

  6. I Key Vault Namn anger du namnet på key vault.

  7. I Funktionsappens namn anger du funktionsappens namn.

  8. I Hemligt namn anger du det hemliga namn som lagrar åtkomstnycklarna.

  9. Välj Förhandsgranska + skapa.

  10. Välj Skapa.

    Skärmbild som visar hur du skapar ytterligare ett lagringskonto.

Lägga till åtkomstnyckel för lagringskonto i Key Vault hemligheter

Fastställa lagringskontots resurs-ID. Du hittar det här värdet i egenskapen id .

az storage account show -n vaultrotationstorage2

Visa en lista över åtkomstnycklarna för lagringskontot så att du kan hämta key2-värdet:

az storage account keys list -n vaultrotationstorage2

Lägg till hemligheten i nyckelvalvet med en giltighetsperiod på 60 dagar och (för demonstration) ett förfallodatum i morgon för att utlösa rotation omedelbart. Kör det här kommandot med dina hämtade värden för key2Value och storageAccountResourceId:

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2-value> --tags "CredentialId=key2" "ProviderAddress=<storage-account-resource-id>" "ValidityPeriodDays=60" --expires $tomorrowDate

Använd det här kommandot för att hämta den hemliga informationen:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey2

Observera att CredentialId har uppdaterats till det alternativa keyName och som value återskapas:

Skärmbild som visar utdata från kommandot A Z keyvault secret show för det andra lagringskontot.

Hämta åtkomstnycklarna för att jämföra värdena:

az storage account keys list -n vaultrotationstorage2

Observera att nyckelvärdet matchar hemligheten i nyckelvalvet:

Skärmbild som visar utdata från kommandot A Z storage account keys list för det andra lagringskontot.

Stäng av rotation för en hemlighet

Om du vill inaktivera rotation för en hemlighet tar du bort Event Grid-prenumerationen för den hemligheten. Använd cmdleten Azure PowerShell Remove-AzEventGridSubscription eller kommandot Azure CLI az eventgrid event-subscription delete.

Använda AI för att anpassa rotationsfunktionen för andra tjänster

Den här självstudien demonstrerar rotation av hemligheter för Azure Storage-konton, men du kan anpassa rotationsfunktionen för andra Azure-tjänster som använder dubbla autentiseringsmetoder. GitHub Copilot kan hjälpa dig att ändra PowerShell-rotationsfunktionskoden så att den fungerar med din tjänst.

I'm using the Azure Key Vault dual-credential secret rotation tutorial for Storage accounts. Help me modify the PowerShell rotation function to work with Azure Cosmos DB instead. The function should:
1. Connect to Cosmos DB and regenerate the secondary key
2. Store the new key in Key Vault as a new secret version
3. Alternate between primary and secondary keys on each rotation
Show me the changes needed to the PowerShell function code, including the correct Cosmos DB PowerShell cmdlets.

GitHub Copilot drivs av AI, så överraskningar och misstag är möjliga. Mer information finns i vanliga frågor och svar om Copilot.

Nästa steg