Uwierzytelnianie w zasobach platformy Azure z aplikacji języka Python hostowanych lokalnie

Aplikacje hostowane poza platformą Azure (na przykład lokalnie lub w centrum danych innej firmy) powinny używać jednostki usługi aplikacji do uwierzytelniania na platformie Azure podczas uzyskiwania dostępu do zasobów platformy Azure. Obiekty jednostki usługi aplikacji są tworzone przy użyciu procesu rejestracji aplikacji na platformie Azure. Po utworzeniu jednostki usługi aplikacji zostanie wygenerowany identyfikator klienta i klucz tajny klienta dla aplikacji. Identyfikator klienta, klucz tajny klienta i identyfikator dzierżawy są następnie przechowywane w zmiennych środowiskowych, dzięki czemu mogą być używane przez zestaw Azure SDK dla języka Python do uwierzytelniania aplikacji na platformie Azure w czasie wykonywania.

Dla każdego środowiska hostowanego w aplikacji należy utworzyć inną rejestrację aplikacji. Umożliwia to skonfigurowanie uprawnień określonych zasobów środowiska dla każdej jednostki usługi i gwarantuje, że aplikacja wdrożona w jednym środowisku nie rozmawia z zasobami platformy Azure, które są częścią innego środowiska.

1 — Rejestrowanie aplikacji na platformie Azure

Aplikację można zarejestrować na platformie Azure przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure.

az ad sp create-for-rbac --name <app-name>

Dane wyjściowe polecenia będą podobne do poniższych. Zanotuj te wartości lub pozostaw to okno otwarte, ponieważ te wartości będą potrzebne w następnych krokach i nie będą mogły ponownie wyświetlić wartości hasła (klucza tajnego klienta).

{
  "appId": "00000000-0000-0000-0000-000000000000",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "abcdefghijklmnopqrstuvwxyz",
  "tenant": "33333333-3333-3333-3333-333333333333"
}

2 — Przypisywanie ról do jednostki usługi aplikacji

Następnie należy określić, jakich ról (uprawnień) potrzebuje twoja aplikacja na temat zasobów i przypisać te role do aplikacji. Role mogą być przypisywane do roli w zakresie zasobu, grupy zasobów lub subskrypcji. W tym przykładzie pokazano, jak przypisać role dla jednostki usługi w zakresie grupy zasobów, ponieważ większość aplikacji grupuje wszystkie zasoby platformy Azure w jedną grupę zasobów.

Jednostka usługi ma przypisaną rolę na platformie Azure przy użyciu polecenia az role assignment create .

az role assignment create --assignee {appId} \
    --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ć jednostce usługi z identyfikatorem appId 00000000-0000-0000-0000-000000000000 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 00000000-0000-0000-0000-000000000000 \
    --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 — Konfigurowanie zmiennych środowiskowych dla aplikacji

Należy ustawić AZURE_CLIENT_IDzmienne środowiskowe , AZURE_TENANT_IDi AZURE_CLIENT_SECRET dla procesu, który uruchamia aplikację w języku Python, aby udostępnić poświadczenia jednostki usługi aplikacji dla aplikacji w czasie wykonywania. Obiekt DefaultAzureCredential szuka informacji o jednostce usługi w tych zmiennych środowiskowych.

Korzystając z narzędzia Gunicorn do uruchamiania aplikacji internetowych języka Python w środowisku serwera system UNIX, zmienne środowiskowe dla aplikacji można określić przy użyciu EnvironmentFile dyrektywy w gunicorn.server pliku, jak pokazano poniżej.

[Unit]
Description=gunicorn daemon
After=network.target  
  
[Service]  
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
            
[Install]  
WantedBy=multi-user.target

Plik określony w EnvironmentFile dyrektywie powinien zawierać listę zmiennych środowiskowych z ich wartościami, jak pokazano poniżej.

AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>

4 — Implementowanie wartości domyślnejAzureCredential w aplikacji

Aby uwierzytelnić obiekty klienta zestawu Azure SDK na platformie Azure, aplikacja powinna używać DefaultAzureCredential klasy z azure.identity pakietu.

Zacznij od dodania pakietu azure.identity 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 jest pokazany 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)

Gdy powyższy kod tworzy wystąpienie DefaultAzureCredential obiektu, DefaultAzureCredential odczytuje zmienne AZURE_TENANT_IDśrodowiskowe , AZURE_CLIENT_IDi AZURE_CLIENT_SECRET informacje o jednostce usługi aplikacji w celu nawiązania połączenia z platformą Azure za pomocą polecenia .