Zautomatyzuj rotację tajemnicy dla zasobów, które mają dwa zestawy poświadczeń uwierzytelniania

Najlepszym sposobem uwierzytelniania w usługach Azure jest użycie tożsamości zarządzanej, ale niektóre scenariusze nadal wymagają kluczy dostępu lub haseł. Rotuj te poświadczenia często, aby zmniejszyć wpływ wycieku.

W tym samouczku pokazano, jak zautomatyzować okresową rotację sekretów dla baz danych i usług korzystających z dwóch zestawów danych uwierzytelniających. Aby zapoznać się z omówieniem automatycznej rotacji dla różnych typów zasobów, zobacz artykuł Omówienie automatycznej rotacji w Azure Key Vault.

W szczególności w tym samouczku przeprowadzana jest rotacja kluczy konta usługi Azure Storage przechowywanych jako wpisy tajne w usłudze Azure Key Vault. Używa funkcji wyzwalanej przez powiadomienie Azure Event Grid.

Important

W usłudze Azure Storage należy preferować autoryzację Microsoft Entra ID z tożsamością zarządzaną zamiast współdzielonych kluczy konta. Jeśli wymogi zgodności na to pozwalają, wyłącz uwierzytelnianie za pomocą klucza współdzielonego dla konta magazynu i całkowicie wyeliminuj potrzebę rotacji kluczy. Użyj wzorca opisanego w tym samouczku tylko wtedy, gdy obciążenie wymaga klucza konta magazynu lub parametrów połączenia.

Oto rozwiązanie rotacji opisane w tym samouczku:

Diagram przedstawiający rozwiązanie rotacji.

W tym rozwiązaniu usługa Azure Key Vault przechowuje każdy klucz dostępu do konta magazynu jako wersję tego samego sekretu, naprzemiennie używając klucza podstawowego i pomocniczego w kolejnych wersjach. Gdy jeden klucz dostępu jest przechowywany jako najnowsza wersja wpisu tajnego, alternatywny klucz jest ponownie wygenerowany i dodawany do Key Vault jako nowa najnowsza wersja. Takie rozwiązanie zapewnia aplikacji pełen cykl rotacji, aby mogła pobrać nowo wygenerowany klucz.

  1. Na trzydzieści dni przed datą wygaśnięcia sekretu usługa Key Vault publikuje do usługi Event Grid zdarzenie informujące o zbliżającym się wygaśnięciu.
  2. Usługa Event Grid sprawdza subskrypcje zdarzeń i używa żądania HTTP POST do wywołania punktu końcowego aplikacji funkcji subskrybowanego do zdarzenia.
  3. Aplikacja funkcjonalna identyfikuje klucz zamienny (nie najnowszy) i wywołuje konto magazynu, aby go ponownie wygenerować.
  4. Aplikacja funkcji dodaje ponownie wygenerowany klucz do Azure Key Vault jako nową wersję wpisu tajnego.

Wymagania wstępne

  • Subskrypcja Azure. Utwórz je bezpłatnie.
  • Azure Cloud Shell. W tym samouczku użyto usługi Cloud Shell w portalu w środowisku programu PowerShell.
  • Magazyn kluczy platformy Azure.
  • Dwa konta magazynu Azure.

Uwaga / Notatka

Zmiana klucza wspólnego konta magazynu powoduje unieważnienie każdej sygnatury dostępu współdzielonego (SAS) na poziomie konta wygenerowanej przy użyciu tego klucza. Po rotacji ponownie wygeneruj tokeny SAS na poziomie konta, aby uniknąć zakłóceń w aplikacjach.

Jeśli nie masz istniejącego magazynu Key Vault i dwóch kont magazynu, użyj tego linku do wdrożenia:

Link z etykietą Deploy to Azure.

  1. W obszarze Grupa zasobów wybierz pozycję Utwórz nową. Nazwij grupę rotacja sejfu, a następnie wybierz OK.

  2. Wybierz opcję Recenzja i utwórz.

  3. Wybierz Utwórz.

    Zrzut ekranu przedstawiający sposób tworzenia grupy zasobów.

Masz teraz magazyn kluczy i dwa konta magazynowe. Sprawdź tę konfigurację w Azure CLI lub Azure PowerShell:

az resource list -o table -g vaultrotation

Wynik wygląda podobnie do następujących danych wyjściowych:

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

Tworzenie i wdrażanie funkcji rotacji kluczy

Następnie utwórz aplikację funkcji z tożsamością zarządzaną przypisaną przez system wraz z innymi wymaganymi składnikami i wdróż funkcję rotacji dla kluczy konta magazynu.

Funkcja rotacji wymaga następujących składników i konfiguracji:

  • Plan usługi Azure App Service.
  • Konto magazynu danych służące do zarządzania wyzwalaczami aplikacji funkcji.
  • Przypisanie roli platformy Azure, które umożliwia aplikacji funkcji dostęp do wpisów tajnych w magazynie kluczy.
  • Rola usługi operatora klucza konta magazynu przypisana do aplikacji funkcji, aby mogła uzyskiwać dostęp do kluczy dostępu do konta magazynu.
  • Funkcja rotacji klucza z wyzwalaczem Event Grid i wyzwalaczem HTTP (do rotacji na żądanie).
  • Subskrypcja zdarzeń usługi Event Grid dla zdarzenia SecretNearExpiry .
  1. Wybierz link wdrażania szablonu Azure:

    Link wdrożenia szablonu Azure.

  2. Na liście Grupa zasobów wybierz pozycję vaultrotation.

  3. W polu Storage Account RG wprowadź nazwę grupy zasobów, w której znajduje się konto magazynu. Zachowaj wartość domyślną [resourceGroup().name], jeśli konto magazynu znajduje się w tej samej grupie zasobów co funkcja rotacji.

  4. W polu Nazwa konta magazynu wprowadź nazwę konta magazynu, którego klucze dostępu chcesz obrócić. Zachowaj wartość domyślną [concat(resourceGroup().name, 'storage')], jeśli używasz konta magazynu z sekcji Wymagania wstępne.

  5. W Key Vault RG wprowadź nazwę grupy zasobów, w której znajduje się key vault. Zachowaj wartość domyślną [resourceGroup().name] , jeśli magazyn kluczy znajduje się w tej samej grupie zasobów co funkcja rotacji.

  6. W polu Nazwa usługi Key Vault wprowadź nazwę magazynu kluczy. Zachowaj wartość domyślną [concat(resourceGroup().name, '-kv')], jeśli używasz magazynu kluczy opisanego w sekcji Wymagania wstępne.

  7. W obszarze Typ planu usługi App Service wybierz plan hostingu. Plan Premium jest wymagany tylko wtedy, gdy magazyn kluczy znajduje się za zaporą.

  8. W polu Nazwa aplikacji funkcji wprowadź nazwę aplikacji funkcji.

  9. W polu Nazwa klucza tajnego wprowadź nazwę klucza tajnego przechowującego klucze dostępu.

  10. W polu Adres URL repozytorium wprowadź lokalizację kodu funkcji w serwisie GitHub: https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git.

  11. Wybierz opcję Recenzja i utwórz.

  12. Wybierz Utwórz.

    Zrzut ekranu przedstawiający sposób tworzenia i wdrażania funkcji.

Po zakończeniu wdrażania masz konto magazynu, farmę serwerów, aplikację funkcji i zasób usługi Application Insights:

Zrzut ekranu strony pokazujący, że wdrożenie zostało ukończone.

Uwaga / Notatka

Ten szablon usługi ARM używa wdrożenia kontroli źródła usługi App Service (Kudu) w celu ściągnięcia kodu funkcji z GitHub. W przypadku obciążeń produkcyjnych zamiast tego zalecamy wdrożenie oparte na pakietach, takie jak func azure functionapp publish lub zip deploy z użyciem WEBSITE_RUN_FROM_PACKAGE. Jeśli wdrożenie zakończy się niepowodzeniem, wybierz pozycję Wdróż ponownie, aby ponowić próbę.

Szablony wdrażania i kod funkcji rotacji znajdują się w Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.

Dodaj klucze dostępu do konta magazynu do tajemnic w Key Vault

Najpierw przypisz sobie rolę Key Vault Secrets Officer, aby móc zarządzać wpisami tajnymi w magazynie:

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

Teraz możesz utworzyć klucz tajny o wartości będącej kluczem dostępu do konta magazynu danych. Wraz z wartością dodaj jako tagi identyfikator zasobu konta usługi Storage, okres ważności wpisu tajnego i identyfikator klucza, aby funkcja rotacji mogła ponownie wygenerować klucz na koncie usługi Storage.

Określ identyfikator zasobu konta magazynu. To jest właściwość id:

az storage account show -n vaultrotationstorage

Wyświetl listę kluczy dostępu do konta magazynowego, aby uzyskać wartości tych kluczy.

az storage account keys list -n vaultrotationstorage

Dodaj sekret do magazynu kluczy z okresem ważności wynoszącym 60 dni oraz (na potrzeby demonstracji) z datą wygaśnięcia ustawioną na jutro, aby natychmiast wyzwolić rotację. Uruchom to polecenie przy użyciu pobranych wartości dla key1Value i 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

Ten klucz tajny powoduje wystąpienie zdarzenia SecretNearExpiry w ciągu kilku minut, co z kolei uruchamia funkcję obracania klucza tajnego z wygaśnięciem ustawionym na 60 dni. W tej konfiguracji zdarzenie SecretNearExpiry jest wyzwalane co 30 dni (30 dni przed wygaśnięciem), a funkcja obracania naprzemiennie przełącza się między key1 i key2.

Sprawdź, czy klucze dostępu są generowane ponownie, pobierając klucz konta magazynu i klucz tajny Key Vault, a następnie porównując je.

Użyj tego polecenia, aby uzyskać tajne informacje.

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

Zwróć uwagę, że CredentialId jest aktualizowany do alternatywnej wersji keyName i value jest regenerowany.

Zrzut ekranu pokazujący wynik polecenia `az keyvault secret show` dla pierwszego konta magazynowego.

Pobierz klucze dostępu, aby porównać wartości:

az storage account keys list -n vaultrotationstorage

Zwróć uwagę, że wartość klucza odpowiada wpisowi tajnemu w magazynie kluczy:

Zrzut ekranu przedstawiający dane wyjściowe polecenia listy kluczy konta magazynu Z dla pierwszego konta magazynu.

Użyj istniejącej funkcji rotacji dla wielu kont magazynu

Możesz ponownie użyć tej samej aplikacji funkcji platformy Azure do rotacji kluczy dla więcej niż jednego konta magazynu.

Aby dodać klucze innego konta magazynu do istniejącej funkcji rotacji, potrzebne są następujące elementy:

  • Rola usługi operatora klucza konta magazynu przypisana do aplikacji funkcji, aby mogła uzyskiwać dostęp do kluczy dostępu do konta magazynu.
  • Subskrypcja zdarzeń usługi Event Grid dla zdarzenia SecretNearExpiry .
  1. Wybierz link wdrażania szablonu Azure:

    Link wdrożenia szablonu Azure.

  2. Na liście Grupa zasobów wybierz pozycję vaultrotation.

  3. W polu Storage Account RG wprowadź nazwę grupy zasobów, w której znajduje się konto magazynu. Zachowaj wartość domyślną [resourceGroup().name], jeśli konto magazynu znajduje się w tej samej grupie zasobów co funkcja rotacji.

  4. W polu Nazwa konta magazynu wprowadź nazwę konta magazynu, którego klucze dostępu chcesz obrócić.

  5. W Key Vault RG wprowadź nazwę grupy zasobów, w której znajduje się key vault. Zachowaj wartość domyślną [resourceGroup().name] , jeśli magazyn kluczy znajduje się w tej samej grupie zasobów co funkcja rotacji.

  6. W polu Nazwa usługi Key Vault wprowadź nazwę magazynu kluczy.

  7. W polu Nazwa aplikacji funkcji wprowadź nazwę aplikacji funkcji.

  8. W polu Nazwa sekretu wprowadź nazwę sekretu zawierającego klucze dostępu.

  9. Wybierz opcję Recenzja i utwórz.

  10. Wybierz Utwórz.

    Zrzut ekranu przedstawiający sposób tworzenia dodatkowego konta magazynu.

Dodaj klucz dostępu do konta magazynu jako tajemnicę w Key Vault

Określ identyfikator zasobu konta magazynu. Wartość tę można znaleźć we właściwości id.

az storage account show -n vaultrotationstorage2

Wyświetl listę kluczy dostępu do konta magazynu, aby uzyskać wartość key2:

az storage account keys list -n vaultrotationstorage2

Dodaj sekret do magazynu kluczy z okresem ważności wynoszącym 60 dni oraz (na potrzeby demonstracji) z datą wygaśnięcia ustawioną na jutro, aby natychmiast wyzwolić rotację. Uruchom to polecenie przy użyciu pobranych wartości dla key2Value i 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

Użyj tego polecenia, aby uzyskać tajne informacje.

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

Zwróć uwagę, że CredentialId jest aktualizowany do alternatywnej wersji keyName i value jest regenerowany.

Zrzut ekranu przedstawiający dane wyjściowe polecenia A Z keyvault secret show dla drugiego konta magazynu.

Pobierz klucze dostępu, aby porównać wartości:

az storage account keys list -n vaultrotationstorage2

Zwróć uwagę, że wartość klucza odpowiada wpisowi tajnemu w magazynie kluczy:

Zrzut ekranu przedstawiający dane wyjściowe polecenia listy kluczy konta magazynu Z dla drugiego konta magazynu.

Wyłącz rotację klucza tajnego

Aby wyłączyć rotację wpisu tajnego, usuń subskrypcję usługi Event Grid dla tego wpisu tajnego. Użyj polecenia cmdlet programu Azure PowerShell Remove-AzEventGridSubscription lub polecenia Azure CLI az eventgrid event-subscription delete.

Dostosowywanie funkcji rotacji dla innych usług za pomocą sztucznej inteligencji

W tym samouczku przedstawiono rotację tajemnic dla kont usługi Azure Storage, ale można dostosować funkcję rotacji dla innych usług Azure korzystających z dwóch poświadczeń. GitHub Copilot może pomóc w zmodyfikowaniu kodu funkcji rotacji w programie PowerShell tak, aby działał z usługą.

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 jest obsługiwana przez sztuczną inteligencję, więc możliwe są niespodzianki i błędy. Aby uzyskać więcej informacji, zobacz Copilot CZĘSTO zadawane pytania.

Dalsze kroki