Ověřování aplikací Pythonu ve službách Azure během místního vývoje pomocí instančních objektů

Při vytváření cloudových aplikací musí vývojáři ladit a testovat aplikace na místní pracovní stanici. Když je aplikace spuštěná na pracovní stanici vývojáře během místního vývoje, musí se stále ověřovat u všech služeb Azure, které aplikace používá. Tento článek popisuje, jak nastavit vyhrazené objekty instančního objektu aplikace, které se mají používat při místním vývoji.

Diagram znázorňující, jak aplikace spuštěná v místním vývojáři získá instanční objekt aplikace ze souboru .env a pak použije danou identitu pro připojení k prostředkům Azure.

Vyhrazené instanční objekty aplikací pro místní vývoj umožňují dodržovat princip nejnižších oprávnění během vývoje aplikací. Vzhledem k tomu, že oprávnění jsou vymezená přesně na to, co je potřeba pro aplikaci během vývoje, brání kód aplikace v náhodném přístupu k prostředku Azure určenému pro použití jinou aplikací. Tím také zabráníte tomu, aby při přesunu aplikace do produkčního prostředí došlo k chybám, protože aplikace byla v vývojovém prostředí přeprivilegovaná.

Instanční objekt aplikace se nastaví pro aplikaci, když je aplikace zaregistrovaná v Azure. Při registraci aplikací pro místní vývoj se doporučuje:

  • Vytvořte samostatné registrace aplikací pro každého vývojáře, který na aplikaci pracuje. Tím se vytvoří samostatné instanční objekty aplikací pro každého vývojáře, které budou používat při místním vývoji, a zabrání vývojářům sdílet přihlašovací údaje pro jeden instanční objekt aplikace.
  • Vytvořte samostatné registrace aplikací pro každou aplikaci. Tím se vymenou oprávnění aplikace jenom na to, co aplikace potřebuje.

Během místního vývoje se proměnné prostředí nastaví s identitou instančního objektu aplikace. Sada Azure SDK pro Python načte tyto proměnné prostředí a používá tyto informace k ověření aplikace v prostředcích Azure, které potřebuje.

1. Registrace aplikace v Azure

Objekty instančního objektu aplikace se vytvářejí s registrací aplikace v Azure. Můžete to provést pomocí webu Azure Portal nebo Azure CLI.

Příkazy Azure CLI je možné spouštět v Azure Cloud Shellu nebo na pracovní stanici s nainstalovaným Azure CLI.

Nejprve pomocí příkazu az ad sp create-for-rbac vytvořte pro aplikaci nový instanční objekt. Příkaz také vytvoří registraci aplikace pro aplikaci ve stejnou dobu.

az ad sp create-for-rbac --name {service-principal-name}

Výstup tohoto příkazu bude vypadat následovně. 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). Nové heslo ale můžete později přidat bez zneplatnění instančního objektu nebo stávajících hesel v případě potřeby.

{
  "appId": "00000000-0000-0000-0000-000000000000",
  "displayName": "{service-principal-name}",
  "password": "abcdefghijklmnopqrstuvwxyz",
  "tenant": "33333333-3333-3333-3333-333333333333"
}

2. Vytvoření skupiny zabezpečení Microsoft Entra pro místní vývoj

Vzhledem k tomu, že aplikace pracuje obvykle více vývojářů, doporučuje se vytvořit skupinu zabezpečení Microsoft Entra, která zapouzdří role (oprávnění) potřeb aplikace v místním vývoji, a ne přiřazovat role jednotlivým objektům instančního objektu. Nabízí následující výhody:

  • Každý vývojář má jistotu, že má přiřazené stejné role, protože role jsou přiřazené na úrovni skupiny.
  • Pokud je pro aplikaci potřeba nová role, stačí ji přidat jenom do skupiny Microsoft Entra pro aplikaci.
  • Pokud se nový vývojář připojí k týmu, vytvoří se nový instanční objekt aplikace pro vývojáře a přidá se do skupiny, aby vývojář získal správná oprávnění pro práci s aplikací.

Příkaz az ad group create slouží k vytvoření skupin zabezpečení v Microsoft Entra ID. Parametry --display-name a --main-nickname jsou povinné. Název dané skupiny by měl vycházet z názvu aplikace. Je také užitečné zahrnout do názvu skupiny frázi jako local-dev, která označuje účel skupiny.

az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"

Zkopírujte hodnotu id vlastnosti ve výstupu příkazu. Toto je ID objektu pro skupinu. Budete ho potřebovat v dalších krocích. K načtení této vlastnosti můžete použít také příkaz az ad group show .

Pokud chcete do skupiny přidat členy, potřebujete ID objektu instančního objektu aplikace, který se liší od ID aplikace. Pomocí příkazu az ad sp list vypíšete dostupné instanční objekty. Příkaz --filter parametru přijímá filtry stylu OData a lze ho použít k filtrování seznamu, jak je znázorněno. Parametr --query je omezen pouze na sloupce, které mají zájem.

az ad sp list \
    --filter "startswith(displayName, 'msdocs')" \
    --query "[].{objectId:id, displayName:displayName}" \
    --output table

Příkaz az ad group member add se pak dá použít k přidání členů do skupin.

az ad group member add \
    --group <group-name> \
    --member-id <object-id>

Poznámka:

Ve výchozím nastavení je vytváření skupin zabezpečení Microsoft Entra omezené na určité privilegované role v adresáři. Pokud nemůžete vytvořit skupinu, obraťte se na správce vašeho adresáře. Pokud nemůžete přidat členy do existující skupiny, obraťte se na vlastníka skupiny nebo správce adresáře. Další informace najdete v tématu Správa skupin a členství ve skupinách Microsoft Entra.

3. Přiřazení rolí k aplikaci

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. V tomto příkladu jsou role přiřazeny ke skupině Microsoft Entra vytvořené v kroku 2. Role je možné přiřadit v oboru prostředku, skupiny prostředků nebo předplatného. Tento příklad ukazuje, jak přiřadit role v oboru skupiny prostředků, protože většina aplikací seskupuje všechny prostředky Azure do jedné skupiny prostředků.

Uživateli, skupině nebo instančnímu objektu aplikace je přiřazena role v Azure pomocí příkazu az role assignment create . Můžete zadat skupinu s ID objektu. Instanční objekt aplikace můžete zadat pomocí id aplikace.

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

Pokud chcete získat názvy rolí, které je možné 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 chcete například povolit instančnímu objektu aplikace s ID 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.

4. Nastavení proměnných místního vývojového prostředí

Objekt DefaultAzureCredential vyhledá informace instančního objektu v sadě proměnných prostředí za běhu. Vzhledem k tomu, že většina vývojářů pracuje na více aplikacích, doporučuje se použít balíček, jako je python-dotenv , pro přístup k prostředí ze .env souboru uloženého v adresáři aplikace během vývoje. Tím se vymenou proměnné prostředí používané k ověření aplikace v Azure tak, aby je mohly používat pouze tato aplikace.

Soubor .env se nikdy nezaškrtá do správy zdrojového kódu, protože obsahuje tajný klíč aplikace pro Azure. Standardní soubor .gitignore pro Python automaticky vyloučí .env soubor z vrácení se změnami.

Pokud chcete použít balíček python-dotenv, nejprve nainstalujte balíček do aplikace.

pip install python-dotenv

Potom vytvořte soubor v kořenovém .env adresáři aplikace. Nastavte hodnoty proměnných prostředí s hodnotami získanými z procesu registrace aplikace následujícím způsobem:

  • AZURE_CLIENT_ID → hodnota ID aplikace.
  • AZURE_TENANT_ID → hodnota ID tenanta.
  • AZURE_CLIENT_SECRET → heslo nebo přihlašovací údaje vygenerované pro aplikaci.
AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz

Nakonec v spouštěcím kódu pro vaši aplikaci použijte knihovnu python-dotenv ke čtení proměnných prostředí ze .env souboru při spuštění.

from dotenv import load_dotenv

if ( os.environ['ENVIRONMENT'] == 'development'):
    print("Loading environment variables from .env file")
    load_dotenv(".env")

5. Implementace defaultAzureCredential ve vaší 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. V tomto scénáři DefaultAzureCredential rozpozná proměnné AZURE_CLIENT_IDAZURE_TENANT_IDprostředí a nastaví a AZURE_CLIENT_SECRET přečte tyto proměnné, aby získaly informace o instančním objektu aplikace pro připojení k Azure.

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)