Automatyzowanie rotacji wpisu tajnego dla zasobów, które mają dwa zestawy poświadczeń uwierzytelniania

Najlepszym sposobem uwierzytelniania w usługach platformy Azure jest użycie tożsamości zarządzanej, ale istnieją pewne scenariusze, w których nie jest to opcja. W takich przypadkach używane są klucze dostępu lub hasła. Klucze dostępu i hasła należy często wymieniać.

W tym samouczku pokazano, jak zautomatyzować okresową rotację wpisów tajnych dla baz danych i usług korzystających z dwóch zestawów poświadczeń uwierzytelniania. W szczególności w tym samouczku pokazano, jak obracać klucze konta usługi Azure Storage przechowywane w usłudze Azure Key Vault jako wpisy tajne. Użyjesz funkcji wyzwalanej przez powiadomienie usługi Azure Event Grid.

Uwaga

W przypadku usług konta magazynu zalecane jest użycie identyfikatora Entra firmy Microsoft do autoryzowania żądań. Aby uzyskać więcej informacji, zobacz Autoryzowanie dostępu do obiektów blob przy użyciu identyfikatora Entra firmy Microsoft. Istnieją usługi, które wymagają parametry połączenia konta magazynu z kluczami dostępu. W tym scenariuszu zalecamy to rozwiązanie.

Oto rozwiązanie rotacji opisane w tym samouczku:

Diagram that shows the rotation solution.

W tym rozwiązaniu usługa Azure Key Vault przechowuje indywidualne klucze dostępu konta magazynu jako wersje tego samego wpisu tajnego, naprzemiennie między kluczem podstawowym i pomocniczym w kolejnych wersjach. Gdy jeden klucz dostępu jest przechowywany w najnowszej wersji wpisu tajnego, alternatywny klucz jest ponownie wygenerowany i dodawany do usługi Key Vault jako nowa najnowsza wersja wpisu tajnego. Rozwiązanie zapewnia cały cykl rotacji aplikacji w celu odświeżenia do najnowszego ponownie wygenerowanego klucza.

  1. Trzydzieści dni przed datą wygaśnięcia wpisu tajnego usługa Key Vault publikuje zdarzenie bliskiego wygaśnięcia w usłudze Event Grid.
  2. Usługa Event Grid sprawdza subskrypcje zdarzeń i używa protokołu HTTP POST do wywoływania punktu końcowego aplikacji funkcji, który jest subskrybowany do zdarzenia.
  3. Aplikacja funkcji identyfikuje klucz alternatywny (nie najnowszy) i wywołuje konto magazynu, aby je ponownie wygenerować.
  4. Aplikacja funkcji dodaje nowy ponownie wygenerowany klucz do usługi Azure Key Vault jako nową wersję wpisu tajnego.

Wymagania wstępne

  • Subskrypcja platformy Azure. Utwórz je bezpłatnie.
  • Azure Cloud Shell. Ten samouczek korzysta z usługi Cloud Shell w portalu z programem PowerShell env
  • Azure Key Vault.
  • Dwa konta usługi Azure Storage.

Uwaga

Rotacja klucza współużytkowanego konta magazynu powoduje odwołanie sygnatury dostępu współdzielonego na poziomie konta wygenerowanego na podstawie tego klucza. Po rotacji klucza konta magazynu należy ponownie wygenerować tokeny SAS na poziomie konta, aby uniknąć zakłóceń w aplikacjach.

Możesz użyć tego linku wdrożenia, jeśli nie masz istniejącego magazynu kluczy i istniejących kont magazynu:

Link that's labelled Deploy to Azure.

  1. W obszarze Grupa zasobów wybierz pozycję Utwórz nową. Nadaj nazwę rotacji magazynu grup, a następnie wybierz przycisk OK.

  2. Wybierz pozycję Przejrzyj i utwórz.

  3. Wybierz pozycję Utwórz.

    Screenshot that shows how to create a resource group.

Teraz będziesz mieć magazyn kluczy i dwa konta magazynu. Tę konfigurację można sprawdzić w interfejsie wiersza polecenia platformy Azure lub w programie Azure PowerShell, uruchamiając następujące polecenie:

az resource list -o table -g vaultrotation

Wynik będzie wyglądać mniej więcej tak:

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 utworzysz aplikację funkcji z tożsamością zarządzaną przez system, oprócz innych wymaganych składników. Wdrożysz również funkcję rotacji dla kluczy konta magazynu.

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

  • Plan usługi aplikacja systemu Azure
  • Konto magazynu do zarządzania wyzwalaczami aplikacji funkcji
  • Zasady dostępu do dostępu do wpisów tajnych w usłudze Key Vault
  • 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 kluczy z wyzwalaczem zdarzeń i wyzwalaczem HTTP (rotacja na żądanie)
  • Subskrypcja zdarzeń usługi Event Grid dla zdarzenia SecretNearExpiry
  1. Wybierz link wdrażania szablonu platformy Azure:

    Azure template deployment link.

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

  3. W polu Grupa zasobów konta magazynu wprowadź nazwę grupy zasobów, w której znajduje się konto magazynu. Zachowaj wartość domyślną [resourceGroup().name], jeśli konto magazynu znajduje się już w tej samej grupie zasobów, w której wdrożysz funkcję rotacji kluczy.

  4. W polu Nazwa konta magazynu wprowadź nazwę konta magazynu zawierającego klucze dostępu do rotacji. Zachowaj wartość domyślną [concat(resourceGroup().name, 'storage')], jeśli używasz konta magazynu utworzonego w wymaganiach wstępnych.

  5. W polu Grupa zasobów usługi Key Vault wprowadź nazwę grupy zasobów, w której znajduje się magazyn kluczy. Zachowaj wartość domyślną [resourceGroup().name], jeśli magazyn kluczy już istnieje w tej samej grupie zasobów, w której wdrożysz funkcję rotacji kluczy.

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

  7. W polu Typ planu usługi App Service wybierz pozycję 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 wpisu tajnego wprowadź nazwę wpisu tajnego, w którym będą przechowywane klucze dostępu.

  10. W polu Adres URL repozytorium wprowadź lokalizację usługi GitHub kodu funkcji. W tym samouczku możesz użyć polecenia https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git .

  11. Wybierz pozycję Przejrzyj i utwórz.

  12. Wybierz pozycję Utwórz.

    Screenshot that shows how to create and deploy function.

Po wykonaniu powyższych kroków będziesz mieć konto magazynu, farmę serwerów, aplikację funkcji i Szczegółowe informacje aplikacji. Po zakończeniu wdrażania zostanie wyświetlona ta strona:

Screenshot that shows the Your deployment is complete page.

Uwaga

Jeśli wystąpi błąd, możesz wybrać pozycję Wdróż ponownie, aby zakończyć wdrażanie składników.

Szablony wdrażania i kod funkcji rotacji można znaleźć w temacie Przykłady platformy Azure.

Dodawanie kluczy dostępu konta magazynu do wpisów tajnych usługi Key Vault

Najpierw ustaw zasady dostępu, aby udzielić uprawnień do zarządzania wpisami tajnymi podmiotu zabezpieczeń użytkownika:

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

Teraz możesz utworzyć nowy wpis tajny z kluczem dostępu do konta magazynu jako jego wartością. Potrzebny będzie również identyfikator zasobu konta magazynu, okres ważności wpisu tajnego i identyfikator klucza, aby dodać go do wpisu tajnego, aby funkcja rotacji mogła ponownie wygenerować klucz na koncie magazynu.

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

az storage account show -n vaultrotationstorage

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

az storage account keys list -n vaultrotationstorage

Dodaj wpis tajny do magazynu kluczy z okresem ważności przez 60 dni, identyfikatorem zasobu konta magazynu i w celu demonstracyjnego wyzwolenia rotacji natychmiast ustawić datę wygaśnięcia na jutro. Uruchom to polecenie, używając pobranych wartości dla key1Value i 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

Ten wpis tajny wyzwoli SecretNearExpiry zdarzenie w ciągu kilku minut. To zdarzenie spowoduje z kolei wyzwolenie funkcji w celu rotacji wpisu tajnego z wygaśnięciem ustawionym na 60 dni. W tej konfiguracji zdarzenie "SecretNearExpiry" zostanie wyzwolone co 30 dni (30 dni przed wygaśnięciem), a funkcja rotacji zmieni rotację między kluczem1 i klucz2.

Możesz sprawdzić, czy klucze dostępu zostały ponownie wygenerowane, pobierając klucz konta magazynu i wpis tajny usługi Key Vault i porównując je.

Użyj tego polecenia, aby uzyskać informacje o wpisie tajnym:

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

Zwróć uwagę, że CredentialId element jest aktualizowany do alternatywnej keyName wersji i value jest ponownie wygenerowany:

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

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

az storage account keys list -n vaultrotationstorage 

Zwróć uwagę, że value klucz jest taki sam jak klucz tajny w magazynie kluczy:

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

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

Możesz ponownie użyć tej samej aplikacji funkcji, aby obrócić klucze dla wielu kont magazynu.

Aby dodać klucze konta magazynu do istniejącej funkcji do 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 platformy Azure:

    Azure template deployment link.

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

  3. W polu Grupa zasobów konta magazynu wprowadź nazwę grupy zasobów, w której znajduje się konto magazynu. Zachowaj wartość domyślną [resourceGroup().name], jeśli konto magazynu znajduje się już w tej samej grupie zasobów, w której wdrożysz funkcję rotacji kluczy.

  4. W polu Nazwa konta magazynu wprowadź nazwę konta magazynu zawierającego klucze dostępu do rotacji.

  5. W polu Grupa zasobów usługi Key Vault wprowadź nazwę grupy zasobów, w której znajduje się magazyn kluczy. Zachowaj wartość domyślną [resourceGroup().name], jeśli magazyn kluczy już istnieje w tej samej grupie zasobów, w której wdrożysz funkcję rotacji kluczy.

  6. W polu Nazwa magazynu kluczy wprowadź nazwę magazynu kluczy.

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

  8. W polu Nazwa wpisu tajnego wprowadź nazwę wpisu tajnego, w którym będą przechowywane klucze dostępu.

  9. Wybierz pozycję Przejrzyj i utwórz.

  10. Wybierz pozycję Utwórz.

    Screenshot that shows how to create an additional storage account.

Dodawanie klucza dostępu konta magazynu do wpisów tajnych usługi Key Vault

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

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 wpis tajny do magazynu kluczy z okresem ważności przez 60 dni, identyfikatorem zasobu konta magazynu i w celu demonstracyjnego wyzwolenia rotacji natychmiast ustawić datę wygaśnięcia na jutro. Uruchom to polecenie, używając pobranych wartości dla key2Value i 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

Użyj tego polecenia, aby uzyskać informacje o wpisie tajnym:

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

Zwróć uwagę, że CredentialId element jest aktualizowany do alternatywnej keyName wersji i value jest ponownie wygenerowany:

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

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

az storage account keys list -n vaultrotationstorage 

Zwróć uwagę, że value klucz jest taki sam jak klucz tajny w magazynie kluczy:

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

Wyłączanie rotacji dla wpisu tajnego

Rotację wpisu tajnego można wyłączyć po prostu, usuwając subskrypcję usługi Event Grid dla tego wpisu tajnego. Użyj polecenia cmdlet Remove-AzEventGridSubscription programu Azure PowerShell lub polecenia az event grid event-subscription delete.

Funkcje rotacji usługi Key Vault dla dwóch zestawów poświadczeń

Szablon funkcji rotacji dla dwóch zestawów poświadczeń i kilka gotowych do użycia funkcji:

Uwaga

Te funkcje rotacji są tworzone przez członka społeczności, a nie przez firmę Microsoft. Funkcje społeczności nie są obsługiwane w ramach żadnego programu pomocy technicznej lub usługi firmy Microsoft i są udostępniane jako środowisko bez gwarancji jakiegokolwiek rodzaju.

Następne kroki