Udostępnij za pomocą


Uwierzytelnianie do zasobów platformy Azure z aplikacji 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. Utworzenie nowej jednostki usługi aplikacji powoduje wygenerowanie identyfikatora klienta i tajnego klucza klienta dla aplikacji. Identyfikator klienta, klucz tajny klienta i identyfikator dzierżawy są przechowywane w zmiennych środowiskowych, które mają być używane przez zestaw Azure SDK dla języka Python w celu uwierzytelniania aplikacji na platformie Azure w czasie wykonywania.

Dla każdego środowiska hostowanego w aplikacji należy utworzyć inną rejestrację aplikacji. Utworzenie innej rejestracji aplikacji umożliwia 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.

Rejestrowanie aplikacji na platformie Azure

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

APP_NAME=<app-name>
az ad sp create-for-rbac --name $APP_NAME

Dane wyjściowe polecenia są 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": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
  "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}

Następnie należy pobrać appID wartość i zapisać ją w zmiennej. Ta wartość służy do ustawiania zmiennych środowiskowych w lokalnym środowisku projektowym, aby zestaw Azure SDK dla języka Python mógł uwierzytelniać się na platformie Azure przy użyciu jednostki usługi.

APP_ID=$(az ad sp create-for-rbac \
  --name $APP_NAME --query appId --output tsv)

Przypisz role do podmiotu zabezpieczeń 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 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.

Zasada usługi ma przypisaną rolę w Azure za pomocą polecenia az role assignment create.

RESOURCE_GROUP_NAME=<resource-group-name>
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
ROLE_NAME=<role-name>

az role assignment create \
  --assignee "$APP_ID" \
  --scope "./subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME" \
  --role "$ROLE_NAME"

![!UWAGA] Aby zapobiec traktowaniu przez Git Bash "/subscriptions/..." jako ścieżki pliku, dopełnij ciąg ./ parametrem scope i użyj podwójnych cudzysłowów wokół całego ciągu.

Aby uzyskać nazwy ról, do których można przypisać główną usługę, 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 00001111-aaaa-2222-bbbb-3333cccc4444 na odczyt, zapis i usuwanie dostępu do kontenerów obiektów blob oraz danych we wszystkich kontach magazynu w grupie zasobów msdocs-python-sdk-auth-example w subskrypcji o identyfikatorze aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, należy przypisać tę jednostkę do roli Współautor danych obiektu blob dla zasobów Azure Storage przy użyciu następującego polecenia.

az role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \
    --scope "./subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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.

Konfigurowanie zmiennych środowiskowych dla aplikacji

Należy ustawić zmienne środowiskowe AZURE_CLIENT_ID, AZURE_TENANT_ID i AZURE_CLIENT_SECRET dla procesu, który uruchamia aplikację w języku Python, aby poświadczenia głównego obiektu usługi były dostępne dla aplikacji w czasie jej działania. Obiekt DefaultAzureCredential szuka informacji o głównym obiekcie usługi w tych zmiennych środowiskowych.

W przypadku używania narzędzia Gunicorn do uruchamiania aplikacji internetowych języka Python w środowisku serwera z systemem UNIX zmienne środowiskowe dla aplikacji można określić przy użyciu EnvironmentFile dyrektywy w pliku gunicorn.server. Zobacz poniższy przykład.

[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 w następujący sposób.

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

Wdrażanie DefaultAzureCredential 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 DefaultAzureCredential do konstruktora obiektu klienta Azure SDK.

Przykład tego podejścia 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)

W tym przykładzie, gdy kod tworzy wystąpienie obiektu DefaultAzureCredential, DefaultAzureCredential odczytuje zmienne środowiskowe AZURE_TENANT_ID, AZURE_CLIENT_ID i AZURE_CLIENT_SECRET zawierające informacje o głównej aplikacji usługi, aby połączyć się z platformą Azure.