Sdílet prostřednictvím


Ověřování prostředků Azure z aplikací Pythonu hostovaných místně

Aplikace hostované mimo Azure (například místně nebo v datacentru třetí strany) by měly při přístupu k prostředkům Azure používat instanční objekt aplikace k ověřování v Azure. Objekty instančního objektu aplikace se vytvářejí pomocí procesu registrace aplikace v Azure. Po vytvoření instančního objektu aplikace se pro vaši aplikaci vygeneruje ID klienta a tajný klíč klienta. ID klienta, tajný klíč klienta a ID vašeho tenanta se pak ukládají do proměnných prostředí, aby je sada Azure SDK pro Python mohli použít k ověření aplikace v Azure za běhu.

Pro každé prostředí, ve které je aplikace hostovaná, by se měla vytvořit jiná registrace aplikace. To umožňuje nakonfigurovat pro každý instanční objekt oprávnění pro konkrétní prostředí a zajistit, aby aplikace nasazená do jednoho prostředí nemluvila s prostředky Azure, které jsou součástí jiného prostředí.

1. Registrace aplikace v Azure

Aplikaci je možné zaregistrovat v Azure pomocí webu Azure Portal nebo Azure CLI.

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

Výstup příkazu bude podobný následujícímu. Poznamenejte si tyto hodnoty nebo nechte toto okno otevřené, protože je budete potřebovat v dalších krocích a nebudete moct znovu zobrazit hodnotu hesla (tajný klíč klienta).

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

2. Přiřazení rolí k instančnímu objektu aplikace

Dále musíte určit, jaké role (oprávnění) vaše aplikace potřebuje k jakým prostředkům, a přiřadit tyto role k aplikaci. Role je možné přiřadit roli v oboru prostředku, skupiny prostředků nebo předplatného. Tento příklad ukazuje, jak přiřadit role instančního objektu v oboru skupiny prostředků, protože většina aplikací seskupí všechny prostředky Azure do jedné skupiny prostředků.

Instančnímu objektu se přiřadí role v Azure pomocí příkazu az role assignment create .

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

Pokud chcete získat názvy rolí, ke kterým je možné instanční objekt přiřadit, použijte příkaz az role definition list .

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

Pokud například chcete instančnímu objektu povolit appId 00000000-0000-0000-0000-000000000000 čtení, zápisu a odstranění přístupu ke kontejnerům objektů blob a datům služby Azure Storage ve všech účtech úložiště ve skupině prostředků msdocs-python-sdk-auth-example v předplatném s ID 11111111-1111-1111-1111-111111111111, přiřadili byste instanční objekt aplikace k roli Přispěvatel dat objektů blob služby Storage pomocí následujícího příkazu.

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"

Informace o přiřazování oprávnění na úrovni prostředku nebo předplatného pomocí Azure CLI najdete v článku Přiřazení rolí Azure pomocí Azure CLI.

3. Konfigurace proměnných prostředí pro aplikaci

Pro proces, který spouští aplikaci Python, musíte nastavit AZURE_CLIENT_IDproměnné prostředí a AZURE_TENANT_IDAZURE_CLIENT_SECRET zpřístupnit přihlašovací údaje instančního objektu aplikace pro aplikaci za běhu. Objekt DefaultAzureCredential vyhledá informace instančního objektu v těchto proměnných prostředí.

Při použití Gunicornu ke spouštění webových aplikací Pythonu v prostředí serveru UNIX je možné pomocí direktivy EnvironmentFile v gunicorn.server souboru zadat proměnné prostředí pro aplikaci, jak je znázorněno níže.

[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

Soubor zadaný v direktivě EnvironmentFile by měl obsahovat seznam proměnných prostředí s jejich hodnotami, jak je znázorněno níže.

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

4. Implementace defaultAzureCredential v aplikaci

K ověřování klientských objektů sady Azure SDK v Azure by vaše aplikace měla používat DefaultAzureCredential třídu z azure.identity balíčku.

Začněte přidáním balíčku azure.identity do aplikace.

pip install azure-identity

V dalším kroku pro libovolný kód Pythonu, který ve vaší aplikaci vytvoří objekt klienta sady Azure SDK, budete chtít:

  1. Naimportujte třídu DefaultAzureCredential z azure.identity modulu.
  2. Vytvoření objektu DefaultAzureCredential
  3. DefaultAzureCredential Předejte objekt konstruktoru klientského objektu sady Azure SDK.

Příklad je znázorněn v následujícím segmentu kódu.

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)

Když výše uvedený kód vytvoří instanci objektuDefaultAzureCredential, DefaultAzureCredential přečte proměnné AZURE_CLIENT_IDAZURE_TENANT_IDprostředí a AZURE_CLIENT_SECRET informace o instančním objektu aplikace pro připojení k Azure.