Sdílet prostřednictvím


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í potřebují vývojáři často spouštět a testovat své aplikace místně. I během místního vývoje se aplikace musí ověřit ve všech službách Azure, se kterými komunikuje. Tento článek vysvětluje, jak nakonfigurovat vyhrazené identity služby určené pro použití během místního vývoje.

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.

Instanční objekty vyhrazených aplikací pro místní vývoj podporují princip nejnižších oprávnění omezením přístupu pouze k prostředkům Azure vyžadovaným aplikací během vývoje. Použití vyhrazeného instančního objektu aplikace snižuje riziko nezamýšleného přístupu k jiným prostředkům a pomáhá zabránit chybám souvisejícím s oprávněními při přechodu do produkčního prostředí, kdy širší oprávnění můžou vést k problémům.

Při registraci aplikací pro místní vývoj v Azure se doporučuje:

  • Vytvořte pro každého vývojáře samostatné registrace aplikací: Toto poskytuje každému vývojáři jeho vlastní služební hlavní komponentu, což eliminuje potřebu sdílet přihlašovací údaje a umožňuje podrobnější řízení přístupu.
  • Vytvořte pro každou aplikaci samostatnou registraci aplikací: Tím se zajistí, že každá aplikace bude mít jenom potřebná oprávnění, což snižuje potenciální prostor pro útok.

Pokud chcete povolit ověřování během místního vývoje, nastavte proměnné prostředí pomocí přihlašovacích údajů instančního objektu aplikace. Sada Azure SDK pro Python tyto proměnné detekuje a používá je k ověřování požadavků na služby Azure.

1. Registrace aplikace v Azure

Objekty hlavní služby aplikace se vytvoří, když zaregistrujete aplikaci v Azure. Tuto registraci je možné provést pomocí webu Azure Portal nebo Azure CLI. Proces registrace vytvoří registraci aplikace v Microsoft Entra ID (dříve Azure Active Directory) a vygeneruje objekt hlavního poskytovatele služeb pro aplikaci. Objekt služebního principalu se používá k autentizaci aplikace ve službách Azure. Proces registrace aplikace také vygeneruje tajný klíč klienta (heslo) pro aplikaci. Tento tajný klíč slouží k ověření aplikace ve službách Azure. Tajný klíč klienta není nikdy uložen ve správě zdrojového kódu, ale spíše v .env souboru v adresáři aplikace. Soubor .env přečte aplikace za běhu a nastaví proměnné prostředí, které sada Azure SDK pro Python používá k ověření aplikace. Následující kroky ukazují, jak zaregistrovat aplikaci v Azure a vytvořit instanční objekt pro aplikaci. Postup se zobrazí jak pro Azure CLI, tak pro Azure Portal.

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.

SERVICE_PRINCIPAL_NAME=<service-principal-name>
az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME

Výstup tohoto příkazu je 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). 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": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "displayName": "<service-principal-name>",
  "password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
  "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}

Dále potřebujete získat appID hodnotu a uložit ji do proměnné. Tato hodnota slouží k nastavení proměnných prostředí ve vašem místním vývojovém prostředí, aby se Azure SDK pro Python mohlo ověřit v Azure pomocí služebního účtu.

APP_ID=$(az ad sp list \
  --all \
  --query "[?displayName=='$SERVICE_PRINCIPAL_NAME'].appId | [0]" \
  --output tsv)

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.

GROUP_DISPLAY_NAME="<group-name>"
GROUP_MAIL_NICKNAME="<group-mail-nickname>"
GROUP_DESCRIPTION="<group-description>"
az ad group create \
  --display-name $GROUP_DISPLAY_NAME \
  --mail-nickname $GROUP_MAIL_NICKNAME \
  --description $GROUP_DESCRIPTION

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.

SP_OBJECT_ID=$(az ad sp list \
  --filter "startswith(displayName,'$GROUP_DISPLAY_NAME')" \
  --query "[0].id" \
  --output tsv)

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_DISPLAY_NAME \
    --member-id $SP_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.

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"

![!POZNÁMKA] Pokud nechcete, aby Git Bash nezacházel s /subscriptions/... jako s cestou k souboru, přidejte před řetězec parametru scope "./" a použijte dvojité uvozovky kolem celého řetězce.

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 00001111-aaaa-2222-bbbb-3333cccc4444 č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 aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, 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 00001111-aaaa-2222-bbbb-3333cccc4444 \
    --scope "./subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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=00001111-aaaa-2222-bbbb-3333cccc4444
AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
AZURE_CLIENT_SECRET=Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6

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)