Uwierzytelnianie aplikacji hostowanych na platformie Azure do zasobów platformy Azure przy użyciu zestawu Azure SDK dla języka Python

W przypadku hostowania aplikacji na platformie Azure przy użyciu usług takich jak aplikacja systemu Azure Service, Azure Virtual Machines lub Azure Container Instances zalecane jest uwierzytelnianie aplikacji w zasobach platformy Azure przy użyciu tożsamości zarządzanej.

Tożsamość zarządzana zapewnia tożsamość aplikacji, tak aby mogła łączyć się z innymi zasobami platformy Azure bez konieczności używania klucza tajnego lub innego wpisu tajnego aplikacji. Wewnętrznie platforma Azure zna tożsamość aplikacji i zasoby, z którymi może się łączyć. Platforma Azure używa tych informacji do automatycznego uzyskiwania tokenów usługi Microsoft Entra dla aplikacji, aby umożliwić jej łączenie się z innymi zasobami platformy Azure bez konieczności zarządzania wpisami tajnymi aplikacji.

Typy tożsamości zarządzanych

Istnieją dwa typy tożsamości zarządzanych:

  • Tożsamości zarządzane przypisane przez system — ten typ tożsamości zarządzanej jest dostarczany i powiązany bezpośrednio z zasobem platformy Azure. Po włączeniu tożsamości zarządzanej w zasobie platformy Azure uzyskasz tożsamość zarządzaną przypisaną przez system dla tego zasobu. Tożsamość zarządzana przypisana przez system jest powiązana z cyklem życia zasobu platformy Azure, z którym jest skojarzony. Po usunięciu zasobu platforma Azure automatycznie usunie tożsamość. Ponieważ wszystko, co musisz zrobić, to włączenie tożsamości zarządzanej dla zasobu platformy Azure hostowania kodu, to podejście jest najprostszym typem tożsamości zarządzanej do użycia.
  • Tożsamości zarządzane przypisane przez użytkownika — można również utworzyć tożsamość zarządzaną jako autonomiczny zasób platformy Azure. To podejście jest najczęściej używane, gdy rozwiązanie ma wiele obciążeń uruchamianych w wielu zasobach platformy Azure, które muszą współdzielić tę samą tożsamość i te same uprawnienia. Jeśli na przykład rozwiązanie zawiera składniki, które działają w wielu wystąpieniach usługi App Service i maszyn wirtualnych, które wymagają dostępu do tego samego zestawu zasobów platformy Azure, to tożsamość zarządzana przypisana przez użytkownika używana w tych zasobach ma sens.

W tym artykule opisano kroki włączania i używania tożsamości zarządzanej przypisanej przez system dla aplikacji. Jeśli musisz użyć tożsamości zarządzanej przypisanej przez użytkownika, zobacz artykuł Zarządzanie tożsamościami zarządzanymi przypisanymi przez użytkownika, aby zobaczyć, jak utworzyć tożsamość zarządzaną przypisaną przez użytkownika.

1 — Włączanie tożsamości zarządzanej w zasobie platformy Azure hostowania aplikacji

Pierwszym krokiem jest włączenie tożsamości zarządzanej na platformie Azure hostowania aplikacji. Jeśli na przykład hostujesz aplikację Django przy użyciu usługi aplikacja systemu Azure Service, musisz włączyć tożsamość zarządzaną dla aplikacji internetowej usługi App Service, która hostuje aplikację. Jeśli używasz maszyny wirtualnej do hostowania aplikacji, możesz zezwolić maszynie wirtualnej na korzystanie z tożsamości zarządzanej.

Tożsamość zarządzaną można włączyć dla zasobu platformy Azure przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure.

Polecenia interfejsu wiersza polecenia platformy Azure można uruchamiać w usłudze Azure Cloud Shell lub na stacji roboczej z zainstalowanym interfejsem wiersza polecenia platformy Azure.

Polecenia interfejsu wiersza polecenia platformy Azure używane do włączania tożsamości zarządzanej dla zasobu platformy Azure mają postać az <command-group> identity --resource-group <resource-group-name> --name <resource-name>. Poniżej przedstawiono konkretne polecenia dla popularnych usług platformy Azure.

az webapp identity assign --resource-group <resource-group-name> -name <web-app-name>

Dane wyjściowe będą wyglądać podobnie do poniższych.

{
  "principalId": "99999999-9999-9999-9999-999999999999",
  "tenantId": "33333333-3333-3333-3333-333333333333",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

Wartość principalId jest unikatowym identyfikatorem tożsamości zarządzanej. Zachowaj kopię tych danych wyjściowych, ponieważ będą one potrzebne w następnym kroku.

2 — Przypisywanie ról do tożsamości zarządzanej

Następnie należy określić, jakich ról (uprawnień) potrzebuje twoja aplikacja, i przypisać tożsamość zarządzaną do tych ról na platformie Azure. Tożsamość zarządzana może mieć przypisane role w zakresie zasobu, grupy zasobów lub subskrypcji. W tym przykładzie pokazano, jak przypisywać role w zakresie grupy zasobów, ponieważ większość aplikacji grupuje wszystkie zasoby platformy Azure w jedną grupę zasobów.

Tożsamość zarządzana ma przypisaną rolę na platformie Azure przy użyciu polecenia az role assignment create . W przypadku przypisania użyj principalId skopiowanego w kroku 1.

az role assignment create --assignee {managedIdentityprincipalId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

Aby uzyskać nazwy ról, do których można przypisać jednostkę usługi, użyj polecenia az role definition list .

az role definition list \
    --query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
    --output table

Aby na przykład zezwolić tożsamości zarządzanej na identyfikator 99999999-9999-9999-9999-999999999999 odczytu, zapisu i usuwania do kontenerów obiektów blob usługi Azure Storage i danych we wszystkich kontach magazynu w grupie zasobów msdocs-python-sdk-auth-example w subskrypcji o identyfikatorze 11111111-1111-1111-1111-111111111111, należy przypisać jednostkę usługi aplikacji do roli Współautor danych obiektu blob usługi Storage przy użyciu następującego polecenia.

az role assignment create --assignee 99999999-9999-9999-9999-999999999999 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"

Aby uzyskać informacje na temat przypisywania uprawnień na poziomie zasobu lub subskrypcji przy użyciu interfejsu wiersza polecenia platformy Azure, zobacz artykuł Przypisywanie ról platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure.

3 — Implementowanie wartości domyślnejAzureCredential w aplikacji

Gdy kod jest uruchomiony na platformie Azure, a tożsamość zarządzana została włączona w zasobie platformy Azure hostowanym przez aplikację, DefaultAzureCredential określa poświadczenia do użycia w następującej kolejności:

  1. Sprawdź środowisko dla jednostki usługi zdefiniowanej przez zmienne AZURE_CLIENT_IDśrodowiskowe , AZURE_TENANT_IDi AZURE_CLIENT_SECRET lub AZURE_CLIENT_CERTIFICATE_PATH (opcjonalnie) AZURE_CLIENT_CERTIFICATE_PASSWORD.
  2. Sprawdź parametry słowa kluczowego dla tożsamości zarządzanej przypisanej przez użytkownika. Tożsamość zarządzaną przypisaną przez użytkownika można przekazać, określając jej identyfikator klienta w parametrze managed_identity_client_id .
  3. Sprawdź zmienną AZURE_CLIENT_ID środowiskową pod kątem identyfikatora klienta tożsamości zarządzanej przypisanej przez użytkownika.
  4. Jeśli jest włączona, użyj przypisanej przez system tożsamości zarządzanej dla zasobu platformy Azure.

Tożsamości zarządzane można wykluczyć z poświadczeń, ustawiając parametr Truesłowa kluczowego exclude_managed_identity_credential .

W tym artykule używamy tożsamości zarządzanej przypisanej przez system dla aplikacji internetowej usługi aplikacja systemu Azure Service, więc nie musimy konfigurować tożsamości zarządzanej w środowisku ani przekazywać jej jako parametru. W poniższych krokach pokazano, jak używać polecenia DefaultAzureCredential.

Najpierw dodaj azure.identity pakiet do aplikacji.

pip install azure-identity

Następnie w przypadku dowolnego kodu w języku Python, który tworzy obiekt klienta zestawu Azure SDK w aplikacji, należy wykonać następujące czynności:

  1. Zaimportuj klasę DefaultAzureCredential z modułu azure.identity .
  2. Utwórz DefaultAzureCredential obiekt.
  3. Przekaż obiekt do konstruktora DefaultAzureCredential obiektu klienta zestawu Azure SDK.

Przykład tych kroków przedstawiono w następującym segmencie kodu.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Acquire a credential object
token_credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
        account_url="https://<my_account_name>.blob.core.windows.net",
        credential=token_credential)

Jak opisano w artykule Omówienie uwierzytelniania zestawu Azure SDK dla języka Python, DefaultAzureCredential obsługuje wiele metod uwierzytelniania i określa metodę uwierzytelniania używaną w czasie wykonywania. Zaletą tego podejścia jest to, że aplikacja może używać różnych metod uwierzytelniania w różnych środowiskach bez implementowania kodu specyficznego dla środowiska. Po uruchomieniu poprzedniego kodu na stacji roboczej podczas programowania lokalnego DefaultAzureCredential użyje jednostki usługi aplikacji określonej przez ustawienia środowiska lub poświadczeń narzędzia deweloperskiego w celu uwierzytelnienia się w innych zasobach platformy Azure. W związku z tym ten sam kod może służyć do uwierzytelniania aplikacji w zasobach platformy Azure zarówno podczas programowania lokalnego, jak i podczas wdrażania na platformie Azure.