Het roteren van een geheim automatiseren voor resources met twee sets verificatiereferenties

De beste manier om te verifiëren bij Azure-services is met behulp van een beheerde identiteit, maar in enkele gevallen is dat niet mogelijk. In dergelijke gevallen worden toegangssleutels of wachtwoorden gebruikt. U moet toegangssleutels en wachtwoorden regelmatig roteren.

In deze zelfstudie leert u hoe u de periodieke roulatie van geheimen voor databases en services die gebruikmaken van twee sets verificatiereferenties kunt automatiseren. Deze zelfstudie laat met name zien hoe u Azure Storage-accountsleutels kunt roteren die in Azure Key Vault zijn opgeslagen als geheimen. U gebruikt een functie die wordt geactiveerd via een Azure Event Grid-melding.

Notitie

Voor opslagaccountservices wordt het gebruik van Microsoft Entra-id voor het autoriseren van aanvragen aanbevolen. Zie Toegang tot blobs autoriseren met behulp van Microsoft Entra-id voor meer informatie. Er zijn services waarvoor verbindingsreeksen met toegangssleutels voor het opslagaccount zijn vereist. Voor dit scenario bevelen we deze oplossing aan.

Dit is de rotatieoplossing die wordt beschreven in deze zelfstudie:

Diagram that shows the rotation solution.

In deze oplossing worden afzonderlijke toegangssleutels voor opslagaccounts opgeslagen in Azure Key Vault als versies van hetzelfde geheim, die in volgende versies wisselen tussen de primaire en secundaire sleutel. Wanneer de ene toegangssleutel wordt opgeslagen in de nieuwste versie van het geheim, wordt de andere sleutel opnieuw gegenereerd en toegevoegd aan Key Vault als de nieuwe meest recente versie van het geheim. De oplossing biedt de volledige rotatiecyclus van de toepassing voor het vernieuwen van de nieuwste opnieuw gegenereerde sleutel.

  1. Dertig dagen vóór de vervaldatum van een geheim wordt in Key Vault deze bijna verlopende gebeurtenis gepubliceerd naar Event Grid.
  2. De gebeurtenisabonnementen worden gecontroleerd in Event Grid en HTTP POST wordt gebruikt om het eindpunt voor de functie-app aan te roepen die is geabonneerd op de gebeurtenis.
  3. De functie-app identificeert de alternatieve sleutel (niet de meest recente) en roept het opslagaccount aan om deze opnieuw te genereren.
  4. De functie-app voegt de nieuwe opnieuw gegenereerde sleutel toe aan Azure Key Vault als de nieuwe versie van het geheim.

Vereisten

  • Een Azure-abonnement. Maak gratis een account.
  • Azure Cloud Shell. In deze zelfstudie wordt gebruikgemaakt van de portal Cloud Shell met PowerShell-omgeving
  • Azure Key Vault.
  • Twee Azure-opslagaccounts.

Notitie

Bij rotatie van de sleutel van het gedeelde opslagaccount wordt shared access signature (SAS) op accountniveau ingetrokken die op basis van die sleutel is gegenereerd. Nadat sleutelrotatie van het opslagaccount is uitgevoerd, moet u SAS-tokens op accountniveau opnieuw genereren om onderbrekingen van toepassingen te voorkomen.

U kunt deze implementatiekoppeling gebruiken als u geen bestaande sleutelkluis en bestaande opslagaccounts hebt:

Link that's labelled Deploy to Azure.

  1. Selecteer voor Resourcegroep de optie Nieuwe maken. Geef de groepskluis een naam en selecteer VERVOLGENS OK.

  2. Selecteer Controleren + maken.

  3. Selecteer Maken.

    Screenshot that shows how to create a resource group.

U hebt nu een sleutelkluis en twee opslagaccounts. U kunt deze installatie controleren in de Azure CLI of Azure PowerShell door deze opdracht uit te voeren:

az resource list -o table -g vaultrotation

De resultaten zien er ongeveer uit zoals deze uitvoer:

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

De sleutelrotatiefunctie maken en implementeren

Vervolgens maakt u een functie-app met een in het systeem beheerde identiteit, naast andere vereiste onderdelen. U implementeert ook de rotatiefunctie voor de sleutels van de opslagaccounts.

De volgende onderdelen en configuratie zijn vereist voor de rotatiefunctie van de functie-app:

  • Een Azure App Service-plan
  • Een opslagaccount om de triggers voor de functie-app te beheren
  • Een toegangsbeleid voor het openen van geheimen in Key Vault
  • De servicerol Sleuteloperator voor opslagaccounts toegewezen aan de functie-app, voor toegang tot de toegangssleutels van het opslagaccount
  • Een sleutelrotatiefunctie met een gebeurtenistrigger en een HTTP-trigger (roulatie op aanvraag)
  • Een Event Grid-gebeurtenisabonnement voor de gebeurtenis SecretNearExpiry
  1. Selecteer de koppeling voor de Azure-sjabloonimplementatie:

    Azure template deployment link.

  2. Selecteer in de lijst Resourcegroep de optie vaultrotation.

  3. Voer in het vak Opslagaccount-RG de naam in van de resourcegroep waarin het opslagaccount zich bevindt. Behoud de standaardwaarde [resourceGroup().name] als het opslagaccount zich al in dezelfde resourcegroep bevindt waar u de sleutelrotatiefunctie implementeert.

  4. Voer in het vak Naam van opslagaccount de naam in van het opslagaccount dat de toegangssleutels bevat die moeten worden geroteerd. Laat de standaardwaarde [concat(resourceGroup().name, 'storage')] ongewijzigd als u het opslagaccount gebruikt dat u hebt gemaakt in Vereisten.

  5. Voer in het vak Sleutelkluis-RG de naam in van de resourcegroep waarin uw sleutelkluis zich bevindt. Behoud de standaardwaarde [resourceGroup().name] als de sleutelkluis al bestaat in dezelfde resourcegroep waar u de sleutelrotatiefunctie implementeert.

  6. Voer in het vak Naam van sleutelkluis de naam in van de sleutelkluis. Laat de standaardwaarde [concat(resourceGroup().name, '-kv')] ongewijzigd als u de sleutelkluis gebruikt die u hebt gemaakt in Vereisten.

  7. Selecteer in het vak Type App Service-plan het hostingabonnement. Een Premium-abonnement hebt u alleen nodig als uw sleutelkluis zich achter een firewall bevindt.

  8. Voer in het vak Naam van functie-app de naam in van de functie-app.

  9. Voer in het vak Naam van geheim de naam in van het geheim waar u de toegangssleutels wilt opslaan.

  10. Voer in het vak Opslagplaats-URL de GitHub-locatie in van de functiecode. In deze zelfstudie kunt u .https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git

  11. Selecteer Controleren + maken.

  12. Selecteer Maken.

    Screenshot that shows how to create and deploy function.

Als u de voorgaande stappen hebt voltooid, beschikt u over een opslagaccount, een serverfarm, een functie-app, en Application Insights. Wanneer de implementatie is voltooid, ziet u deze pagina:

Screenshot that shows the Your deployment is complete page.

Notitie

Als er een fout optreedt, kunt u Opnieuw implementeren selecteren om de implementatie van onderdelen te voltooien.

In Azure-voorbeelden vindt u implementatiesjablonen en code voor de rotatiefunctie.

De toegangssleutels voor het opslagaccount toevoegen aan Key Vault-geheimen

Stel eerst uw toegangsbeleid in om machtigingen voor het beheren van geheimen te verlenen aan uw user principal:

az keyvault set-policy --upn <email-address-of-user> --name vaultrotation-kv --secret-permissions set delete get list

U kunt nu een nieuw geheim maken met een toegangssleutel voor het opslagaccount als bijbehorende waarde. U moet ook de resource-id van het opslagaccount, de geldigheidsperiode van het geheim, en de sleutel-id toevoegen aan het geheim, zodat de rotatiefunctie de sleutel in het opslagaccount opnieuw kan genereren.

Achterhaal de resource-id voor het opslagaccount. U vindt deze waarde in de eigenschap id.

az storage account show -n vaultrotationstorage

Vermeld de toegangssleutels van het opslagaccount zodat u de sleutelwaarden kunt ophalen:

az storage account keys list -n vaultrotationstorage

Voeg geheim toe aan de sleutelkluis met een geldigheidsperiode van 60 dagen, resource-id van het opslagaccount en voor demonstratiedoeleinden om rotatie onmiddellijk in te stellen op de vervaldatum van morgen. Voer deze opdracht uit met behulp van de opgehaalde waarden voor key1Value en storageAccountResourceId:

$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-MM-ddTHH:mm:ssZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1Value> --tags "CredentialId=key1" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

Dit geheim activeert SecretNearExpiry binnen enkele minuten een gebeurtenis. Deze gebeurtenis activeert vervolgens de functie voor het roteren van het geheim waarvoor de vervaldatum van 60 dagen is ingesteld. In deze configuratie wordt de gebeurtenis SecretNearExpiry elke 30 dagen (30 dagen vóór verloop) geactiveerd en de rotatiefunctie wisselt tussen key1 en key2.

U kunt controleren of de toegangssleutels opnieuw zijn gegenereerd door de opslagaccountsleutel en het Key Vault-geheim op te halen en te vergelijken.

Gebruik deze opdracht om de informatie over het geheim op te halen:

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

U ziet dat CredentialId is bijgewerkt naar de andere keyName, en dat value opnieuw is gegenereerd:

Screenshot that shows the output of the A Z keyvault secret show command for the first storage account.

Haal de toegangssleutels op om de waarden te vergelijken:

az storage account keys list -n vaultrotationstorage 

U ziet dat value van de sleutel gelijk is aan het geheim in de sleutelkluis:

Screenshot that shows the output of the A Z storage account keys list command for the first storage account.

Bestaande rotatiefunctie gebruiken voor meerdere opslagaccounts

U kunt dezelfde functie-app opnieuw gebruiken om sleutels voor meerdere opslagaccounts te roteren.

Als u opslagaccountsleutels wilt toevoegen aan een bestaande functie voor rotatie, hebt u het volgende nodig:

  • De servicerol Sleuteloperator voor opslagaccounts toegewezen aan de functie-app, voor toegang tot de toegangssleutels van opslagaccounts.
  • Een Event Grid-gebeurtenisabonnement voor de gebeurtenis SecretNearExpiry.
  1. Selecteer de koppeling voor de Azure-sjabloonimplementatie:

    Azure template deployment link.

  2. Selecteer in de lijst Resourcegroep de optie vaultrotation.

  3. Voer in het vak Opslagaccount-RG de naam in van de resourcegroep waarin het opslagaccount zich bevindt. Behoud de standaardwaarde [resourceGroup().name] als het opslagaccount zich al in dezelfde resourcegroep bevindt waar u de sleutelrotatiefunctie implementeert.

  4. Voer in het vak Naam van opslagaccount de naam in van het opslagaccount dat de toegangssleutels bevat die moeten worden geroteerd.

  5. Voer in het vak Sleutelkluis-RG de naam in van de resourcegroep waarin uw sleutelkluis zich bevindt. Behoud de standaardwaarde [resourceGroup().name] als de sleutelkluis al bestaat in dezelfde resourcegroep waar u de sleutelrotatiefunctie implementeert.

  6. Voer in het vak Naam van sleutelkluis de naam in van de sleutelkluis.

  7. Voer in het vak Naam van functie-app de naam in van de functie-app.

  8. Voer in het vak Naam van geheim de naam in van het geheim waar u de toegangssleutels wilt opslaan.

  9. Selecteer Controleren + maken.

  10. Selecteer Maken.

    Screenshot that shows how to create an additional storage account.

Toegangssleutel voor opslagaccounts toevoegen aan Key Vault-geheimen

Achterhaal de resource-id voor het opslagaccount. U vindt deze waarde in de eigenschap id.

az storage account show -n vaultrotationstorage2

Vermeld de toegangssleutels van het opslagaccount zodat u de waarde van sleutel 2 kunt ophalen:

az storage account keys list -n vaultrotationstorage2

Voeg geheim toe aan de sleutelkluis met een geldigheidsperiode van 60 dagen, resource-id van het opslagaccount en voor demonstratiedoeleinden om rotatie onmiddellijk in te stellen op de vervaldatum van morgen. Voer deze opdracht uit met behulp van de opgehaalde waarden voor key2Value en storageAccountResourceId:

$tomorrowDate = (Get-Date).AddDays(+1).ToString('yyyy-MM-ddTHH:mm:ssZ')
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2Value> --tags "CredentialId=key2" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

Gebruik deze opdracht om de informatie over het geheim op te halen:

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

U ziet dat CredentialId is bijgewerkt naar de andere keyName, en dat value opnieuw is gegenereerd:

Screenshot that shows the output of the A Z keyvault secret show command for the second storage account.

Haal de toegangssleutels op om de waarden te vergelijken:

az storage account keys list -n vaultrotationstorage 

U ziet dat value van de sleutel gelijk is aan het geheim in de sleutelkluis:

Screenshot that shows the output of the A Z storage account keys list command for the second storage account.

Rotatie uitschakelen voor geheim

U kunt de rotatie van een geheim uitschakelen door het Event Grid-abonnement voor dat geheim te verwijderen. Gebruik de azure PowerShell Remove-AzEventGridSubscription-cmdlet of azure CLI az event grid event--subscription delete command.

Rotatiefuncties van Key Vault voor twee referentiesets

De sjabloon voor roulatiefuncties voor twee referentiesets en verschillende kant-en-klare functies:

Notitie

Deze rotatiefuncties worden gemaakt door een lid van de community en niet door Microsoft. Communityfuncties worden niet ondersteund onder een Microsoft-ondersteuningsprogramma of -service en worden beschikbaar gesteld ALS IS zonder enige garantie.

Volgende stappen