Bezpieczne tokeny odświeżania uwierzytelniania OAuth 2.0 On-Behalf-Of dla usług internetowych

Azure CLIs
Azure DevOps
Azure Functions
Azure Key Vault
Azure Pipelines

Podczas tworzenia usług internetowych może być konieczne uzyskanie tokenów przy użyciu przepływu OAuth 2.0 On-Behalf-Of (OBO). Przepływ OBO obsługuje przypadek użycia, w którym aplikacja wywołuje usługę lub internetowy interfejs API, który z kolei musi wywoływać inną usługę lub internetowy interfejs API. OBO propaguje tożsamość i uprawnienia delegowanego użytkownika za pośrednictwem łańcucha żądań. Gdy aplikacja musi używać tokenów dostępu i odświeżania na czas nieokreślony, zazwyczaj w scenariuszach dostępu w trybie offline, ważne jest bezpieczne przechowywanie tokenów odświeżania.

Ostrzeżenie

Starannie rozważ ryzyko i odpowiedzialność za przechowywanie tokenów zabezpieczających, ponieważ te tokeny mogą zapewnić złośliwym aktorom dostęp do zasobów chronionych przez identyfikator Firmy Microsoft Entra organizacji. Naruszenie zabezpieczeń aplikacji przeznaczonej dla kont w dowolnym katalogu organizacyjnym (dowolny katalog Firmy Microsoft — multitenant) może być szczególnie katastrofalne.

Przechowywanie tokenów dostępu stanowi większe zagrożenie bezpieczeństwa, ponieważ token dostępu i sam w sobie mogą uzyskiwać dostęp do zasobów. Zalecaną metodą nie jest przechowywanie tokenów dostępu, ale uzyskiwanie tokenów dostępu zgodnie z potrzebami. Bezpiecznie przechowuj tylko tokeny odświeżania przy użyciu tak dużej ilości platformy, jak gdyby były tokenami dostępu.

W razie potrzeby można odwołać tokeny odświeżania, jeśli zostaną naruszone.

Potencjalne przypadki użycia

To rozwiązanie używa usług Azure Key Vault, Azure Functions i Azure DevOps do bezpiecznego aktualizowania i przechowywania tokenów odświeżania OBO.

Architektura

Diagram przedstawiający procesy odświeżania klucza i tokenu.

Pobierz plik programu Visio z tą architekturą.

Przepływ danych

Usługa Azure Pipelines to wygodne miejsce do dodawania strategii rotacji kluczy, jeśli już używasz potoków dla infrastruktury jako kodu (IaC) lub ciągłej integracji i ciągłego dostarczania (CI/CD). Nie musisz używać usługi Azure Pipelines, o ile ograniczasz ścieżki do ustawiania i pobierania wpisów tajnych.

Zastosuj następujące zasady, aby zezwolić jednostce usługi na połączenie usługi Azure DevOps w celu ustawienia wpisów tajnych w usłudze Key Vault. <Key Vault Name> Zastąp zmienne i <Service Connection Principal> prawidłowymi wartościami środowiska.

az keyvault set-policy --name $<Key Vault Name> --spn $<Service Connection Principal> --secret-permissions set

Po skonfigurowaniu usługi Azure Pipelines do tworzenia i aktualizowania kluczy można zaplanować okresowe uruchamianie potoku. Potok aktualizuje wpis tajny usługi Key Vault w celu synchronizacji z rotacją kluczy i zapisuje zaszyfrowany token przy użyciu nowej wersji wpisu tajnego. Aby uzyskać więcej informacji, zobacz Konfigurowanie harmonogramów dla potoków.

Tożsamość zarządzana

Preferowanym sposobem uzyskiwania dostępu do usługi Key Vault przez usługę Azure Functions jest użycie tożsamości zarządzanej usługi. Dostęp można udzielić za pośrednictwem witryny Azure Portal, interfejsu wiersza polecenia platformy Azure lub szablonu usługi Azure Resource Manager (ARM) dla scenariuszy IaC.

Azure Portal

W witrynie Azure Portal dodaj zasady dostępu usługi Key Vault, aby zezwolić identyfikatorowi obiektu tożsamości zarządzanej usługi Azure Functions na pobieranie i ustawianie wpisów tajnych. Aby uzyskać więcej informacji, zobacz Add a system-assigned identity (Dodawanie tożsamości przypisanej przez system) i Use Key Vault references for App Service and Azure Functions (Dodawanie tożsamości przypisanej przez system) i Use Key Vault references for App Service and Azure Functions (Używanie odwołań usługi Key Vault dla usług App Service i Azure Functions).

Zrzut ekranu przedstawiający sposób włączania tożsamości zarządzanej w witrynie Azure Portal.

Interfejs wiersza polecenia platformy Azure

Zasady usługi Azure Key Vault można również ustawić przy użyciu interfejsu wiersza polecenia platformy Azure:

az keyvault set-policy --name $<Key Vault Name> --spn $<Service Connection Principal> --secret-permissions set
az keyvault set-policy --name $<Key Vault Name> --spn $<Managed Identity Principal> --secret-permissions get

Szablon ARM

Poniższy szablon usługi ARM zapewnia usłudze Azure Functions dostęp do usługi Azure Key Vault. *** Zastąp zmienne prawidłowymi wartościami środowiska.

{
  "type": "Microsoft.KeyVault/vaults",
  "apiVersion": "2019-09-01",
  "name": "***",
  "location": "***",
  "properties": {
    "sku": {
      "family": "A",
      "name": "standard"
    },
    "tenantId": "***",
    "enableSoftDelete": true,
    "enabledForDeployment": false,
    "enabledForTemplateDeployment": false,
    "enabledForDiskEncryption": false,
    "accessPolicies": [
      {
        "tenantId": "***",
        "objectId": "<Managed Identity Principal>",
        "permissions": {
          "secrets": [
            "get"
          ]
        }
      },
      {
        "tenantId": "***",
        "objectId": "<Service Connection Principal>",
        "permissions": {
          "secrets": [
            "set"
          ]
        }
      }
    ]
  }
}

Magazyn tokenów

Do przechowywania tokenów w postaci zaszyfrowanej można użyć dowolnej bazy danych. Na poniższym diagramie przedstawiono sekwencję przechowywania tokenów odświeżania w bazie danych:

Diagram przedstawiający sekwencję dodawania tokenu.

Sekwencja ma dwie funkcje userId() i secretId(). Te funkcje można zdefiniować jako kombinację elementów token.oid, token.tidi token.sub. Aby uzyskać więcej informacji, zobacz Using the id_token (Korzystanie z id_token).

Za pomocą klucza kryptograficznego przechowywanego jako wpis tajny można wyszukać najnowszą wersję klucza w usłudze Azure Key Vault.

Użycie tokenu

Użycie klucza jest proste. Poniższa sekwencja wykonuje zapytanie o klucz w oparciu o najnowszą wersję klucza.

Diagram przedstawiający sekwencję użycia przechowywanego tokenu.

Odświeżanie tokenu DoWork jest ortogonalne dla funkcji, więc usługa Azure Functions może wykonywać DoWork asynchronicznie odświeżanie tokenów i je odświeżać przy użyciu rozszerzenia Durable Functions. Aby uzyskać więcej informacji na temat funkcji wyzwalanych przez protokół HTTP za pomocą rozszerzenia Durable Functions, zobacz Funkcje PROTOKOŁU HTTP.

Nie zaleca się używania usługi Azure Key Vault w potoku żądań HTTP, więc zawsze, gdy jest to uzasadnione, buforuj odpowiedzi. W tym przykładzie odpowiedź usługi Key Vault na getSecret(secretId, secretVersion) wywołanie jest zapisywalna w pamięci podręcznej.

Rotacja kluczy i odświeżanie tokenu

Klucz tajny można obrócić w tym samym czasie, gdy odświeżysz token odświeżania, dzięki czemu najnowszy token zostanie zaszyfrowany przy użyciu najnowszej wersji wpisu tajnego szyfrowania. W tym procesie jest używana wbudowana obsługa usługi Azure Functions dla wyzwalaczy czasomierza. Aby uzyskać więcej informacji, zobacz Wyzwalacz czasomierza dla usługi Azure Functions.

Na poniższym diagramie sekwencji przedstawiono proces synchronizowania odświeżania tokenu z rotacją kluczy:

Diagram przedstawiający sekwencję synchronizowania odświeżania tokenu z rotacją kluczy.

Kontrola dostępu i użytkownika

Platforma tożsamości Microsoft oferuje możliwość odwoływanie tokenów odświeżania w przypadku naruszenia zabezpieczeń. Zobacz Odwołania tokenów i Odwołaj-AzureADUserAllRefreshToken.

Uwaga

Moduły usług Azure AD i MSOnline programu PowerShell są przestarzałe od 30 marca 2024 r. Aby dowiedzieć się więcej, przeczytaj aktualizację o wycofaniu. Po tej dacie obsługa tych modułów jest ograniczona do pomocy dotyczącej migracji do zestawu MICROSOFT Graph PowerShell SDK i poprawek zabezpieczeń. Przestarzałe moduły będą nadal działać do 30 marca 2025 r.

Zalecamy migrację do programu Microsoft Graph PowerShell w celu interakcji z identyfikatorem Entra firmy Microsoft (dawniej Azure AD). W przypadku typowych pytań dotyczących migracji zapoznaj się z często zadawanymi pytaniami dotyczącymi migracji. Uwaga: wersje 1.0.x usługi MSOnline mogą wystąpić zakłócenia po 30 czerwca 2024 r.

Aby usunąć użytkownika z identyfikatora Entra firmy Microsoft, po prostu usuń rekord użytkownika. Aby usunąć dostęp do aplikacji na użytkownika, usuń refreshToken część danych użytkownika.

Aby usunąć dostęp dla grupy użytkowników, takich jak wszyscy użytkownicy w dzierżawie docelowej, możesz użyć usługi Azure Pipelines do usunięcia wpisu tajnego grupy na secretId()podstawie .

Współautorzy

Ten artykuł jest obsługiwany przez firmę Microsoft. Pierwotnie został napisany przez następujących współautorów.

Główny autor:

Następne kroki