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.
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": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "<service-principal-name>",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
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 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_ID
AZURE_TENANT_ID
prostř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:
- Naimportujte třídu
DefaultAzureCredential
zazure.identity
modulu. - Vytvoření objektu
DefaultAzureCredential
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)