Megosztás a következőn keresztül:


Python-alkalmazások hitelesítése az Azure-szolgáltatásokba a helyi fejlesztés során szolgáltatásnevek használatával

A fejlesztőknek gyakran helyileg kell futtatniuk és tesztelniük alkalmazásaikat a felhőalkalmazások létrehozásakor. Az alkalmazásnak még a helyi fejlesztés során is hitelesítenie kell magát minden olyan Azure-szolgáltatásban, amellyel kommunikál. Ez a cikk bemutatja, hogyan konfigurálhat dedikált szolgáltatásnév-identitásokat kifejezetten a helyi fejlesztés során való használatra.

Egy diagram, amely bemutatja, hogy egy helyi fejlesztőben futó alkalmazás hogyan szerzi be az alkalmazásszolgáltatásnevet egy .env fájlból, majd hogyan használja ezt az identitást az Azure-erőforrásokhoz való csatlakozáshoz.

A helyi fejlesztéshez dedikált alkalmazásszolgáltatás-tagok a minimális jogosultság elvét követik. Csak azokhoz az Azure-erőforrásokhoz biztosítanak hozzáférést, amelyekre az alkalmazásnak szüksége van a fejlesztés során. Ez a korlátozott hozzáférés csökkenti annak a kockázatát, hogy véletlenül más erőforrásokhoz jusson el. Emellett segít megelőzni az engedélyekkel kapcsolatos hibákat az éles környezetbe való áttéréskor, ahol a szélesebb körű engedélyek problémákat okozhatnak.

Helyi fejlesztési alkalmazások regisztrálása az Azure-ban:

  • Külön alkalmazásregisztrációk létrehozása minden fejlesztő számára: Ez a módszer minden fejlesztő számára saját szolgáltatásnevet biztosít, elkerülve a hitelesítő adatok megosztásának szükségességét, és lehetővé teszi a részletesebb hozzáférés-vezérlést.
  • Külön alkalmazásregisztrációk létrehozása minden alkalmazáshoz: Ez a módszer biztosítja, hogy minden alkalmazás csak a szükséges engedélyekkel rendelkezik, csökkentve a potenciális támadási felületet.

Ha engedélyezni szeretné a hitelesítést a helyi fejlesztés során, állítsa be a környezeti változókat az application service principal hitelesítő adataival. Az Azure SDK for Python észleli ezeket a változókat, és az azure-szolgáltatásokhoz érkező kérések hitelesítéséhez használja őket.

Az alkalmazás regisztrálása az Azure-ban

Az alkalmazás szolgáltatási főobjektumai akkor jönnek létre, amikor regisztrál egy alkalmazást az Azure-ben. Ez a regisztráció az Azure Portalon vagy az Azure CLI-vel végezhető el. A regisztrációs folyamat létrehoz egy alkalmazásregisztrációt a Microsoft Entra ID-ben, és létrehoz egy szolgáltatás főobjektumot az alkalmazáshoz. A szolgáltatásnév objektum az alkalmazás Azure-szolgáltatásokban való hitelesítésére szolgál. Az alkalmazásregisztrációs folyamat emellett létrehoz egy titkos ügyfélkulcsot (jelszót) az alkalmazáshoz. Ezzel a titkos kóddal hitelesítheti az alkalmazást az Azure-szolgáltatásokban. Az ügyfél titkos kódja soha nem a forrásvezérlőben, hanem az .env alkalmazáskönyvtárban lévő fájlban van tárolva. Futásidőben az alkalmazás felolvassa a .env fájlt, és beállítja azokat a környezeti változókat, amelyeket a Pythonhoz készült Azure SDK használ az alkalmazás hitelesítéséhez.

Az alábbi lépések bemutatják, hogyan regisztrálhat egy alkalmazást az Azure-ban, és hogyan hozhat létre szolgáltatásnevet az alkalmazáshoz. A lépések az Azure CLI és az Azure Portal esetében is megjelennek.

Az Azure CLI-parancsok futtathatók az Azure Cloud Shellben vagy egy munkaállomáson, amelyen telepítve van az Azure CLI.

Először az az ad sp create-for-rbac paranccsal hozzon létre egy új szolgáltatásbeli szerepkört az alkalmazáshoz. A parancs ugyanakkor létrehozza az alkalmazás regisztrációját is az alkalmazáshoz.

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

A parancs kimenete a következőhöz hasonló. Jegyezze fel ezeket az értékeket, vagy tartsa nyitva ezt az ablakot, mivel a következő lépésekben szüksége lesz ezekre az értékekre, és nem fogja tudni újra megtekinteni a jelszó (titkos ügyfélkód) értékét. Később azonban hozzáadhat új jelszót anélkül, hogy szükség esetén érvénytelenítenék a szolgáltatásnevet vagy a meglévő jelszavakat.

{
  "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "displayName": "<service-principal-name>",
  "password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
  "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}

Ezután le kell kérnie az appID értéket, és egy változóban kell tárolnia. Ez az érték környezeti változók beállítására szolgál a helyi fejlesztési környezetben, hogy a Pythonhoz készült Azure SDK hitelesítést végezzen az Azure-ban a szolgáltatásnév használatával.

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

Microsoft Entra biztonsági csoport létrehozása helyi fejlesztéshez

Mivel általában több fejlesztő dolgozik ugyanazon az alkalmazáson, jobb, ha egy Microsoft Entra biztonsági csoporton keresztül kezeli az engedélyeket. Hozzon létre egy biztonsági csoportot, amely tartalmazza az alkalmazásnak a helyi fejlesztéshez szükséges szerepköreit, ahelyett, hogy külön-külön rendeli hozzá a szerepköröket az egyes fejlesztők szolgáltatásnevéhez. A biztonsági csoport használata a következő előnyöket kínálja:

  • Minden fejlesztőnek ugyanazok a szerepkörök lesznek hozzárendelve, mivel a szerepkörök csoportszinten vannak hozzárendelve.
  • Ha új szerepkörre van szükség az alkalmazáshoz, azt csak az alkalmazás Microsoft Entra csoportjához kell hozzáadni.
  • Ha egy új fejlesztő csatlakozik a csapathoz, egy új alkalmazásszolgáltatás-tag jön létre a fejlesztő számára, és hozzáadódik a csoporthoz, biztosítva, hogy a fejlesztő megfelelő engedélyekkel rendelkezik az alkalmazás használatához.

Az az ad group create paranccsal biztonsági csoportokat hozhat létre a Microsoft Entra ID-ban. A --display-name és a --main-nickname paraméterek kötelezőek. A csoportnak adott névnek az alkalmazás nevén kell alapulnia. Hasznos lehet egy "local-dev" kifejezést is belefoglalni a csoport nevére, hogy jelezze a csoport célját.

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

Ha tagokat szeretne hozzáadni a csoporthoz, szüksége van az alkalmazás-szolgáltatásnév objektumazonosítójára, amely eltér az alkalmazásazonosítótól. Az ad sp list használatával listázhatja az elérhető szolgáltatási azonosítókat. A --filter paraméterparancs elfogadja az OData-stílusszűrőket, és a lista szűrésére használható az ábrán látható módon. A --query paraméter csak azokat az oszlopokat korlátozza, amelyek érdeklik.

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

Az az ad group member add parancs ezután a tagok csoportokhoz való hozzáadására használható.

az ad group member add \
    --group $GROUP_DISPLAY_NAME \
    --member-id $SP_OBJECT_ID

Feljegyzés

Alapértelmezés szerint a Microsoft Entra biztonsági csoportok létrehozása a címtárban lévő bizonyos kiemelt szerepkörökre korlátozódik. Ha nem tud csoportot létrehozni, forduljon a címtár rendszergazdájához. Ha nem tud tagokat felvenni egy meglévő csoportba, forduljon a csoport tulajdonosához vagy egy címtáradminisztrátorhoz. További információ: Microsoft Entra-csoportok és csoporttagság kezelése.

Szerepkörök hozzárendelése az alkalmazáshoz

Ezután meg kell határoznia, hogy az alkalmazásnak milyen szerepkörökre (engedélyekre) van szüksége az adott erőforrásokhoz, és ki kell osztania ezeket a szerepköröket az alkalmazáshoz. Ebben a példában a szerepkörök a 2. lépésben létrehozott Microsoft Entra-csoporthoz vannak rendelve. A szerepkörök erőforrás-, erőforráscsoport- vagy előfizetés-hatókörben rendelhetők hozzá. Ez a példa bemutatja, hogyan rendelhet hozzá szerepköröket az erőforráscsoport hatóköréhez, mivel a legtöbb alkalmazás egyetlen erőforráscsoportba csoportosítja az összes Azure-erőforrást.

az role assignment create A paranccsal szerepkört rendelhet egy felhasználóhoz, csoporthoz vagy alkalmazásszolgáltatás-taghoz. Megadhat egy csoportot az objektumazonosítójával. Megadhat egy alkalmazásszolgáltatásnevet az appId azonosítójával.

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"

![!MEGJEGYZÉS] Annak érdekében, hogy a Git Bash ne kezelje az /subscriptions/...-t fájlelőttútként, helyezze a "./" karaktereket a scope paraméter sztringje elé, és helyezze a teljes sztringet dupla idézőjelbe.

A hozzárendelhető szerepkörnevek lekéréséhez használja az az role definition list parancsot.

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

Ha például engedélyezni szeretné, hogy az alkalmazás szolgáltatási főkapcsolat, amelynek appId-ja 00001111-aaaa-2222-bbbb-3333cccc4444, olvasási, írási és törlési hozzáféréssel rendelkezzen az Azure Storage blob-tárolókhoz és adatokhoz az összes tárfiókban az msdocs-python-sdk-auth-example erőforráscsoportban az azonosítójú előfizetésénél aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, rendelje hozzá az alkalmazás szolgáltatási főkapcsolatot a következő paranccsal a Storage Blob Data Contributor szerepkörhöz.

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"

Az engedélyek erőforrás- vagy előfizetési szinten az Azure CLI-vel való hozzárendeléséről az Azure CLI-vel történő Azure-szerepkörök hozzárendelése című cikk nyújt tájékoztatást.

Helyi fejlesztési környezeti változók beállítása

Az DefaultAzureCredential objektum futásidőben a környezeti változók halmazában keresi a szolgáltatásnév adatait. Mivel a legtöbb fejlesztő több alkalmazáson dolgozik, használjon egy olyan csomagot, mint a python-dotenv, hogy a fejlesztés során az alkalmazás könyvtárában tárolt .env fájlból férjen hozzá a környezethez. Ez a beállítás hatóköre kiterjed a környezeti változókra, így csak ez az alkalmazás használhatja őket az Azure-beli hitelesítéshez.

A .env fájl soha nem kerül be a forrásvezérlőbe, mivel tartalmazza az Azure alkalmazás titkos kulcsát. A Python standard .gitignore fájlja automatikusan kizárja a fájlt a .env bejelentkezésből.

A python-dotenv csomag használatához először telepítse a csomagot az alkalmazásban.

pip install python-dotenv

Ezután hozzon létre egy .env fájlt az alkalmazás gyökérkönyvtárában. Állítsa be a környezeti változó értékeit az alkalmazásregisztrációs folyamatból kapott értékekkel az alábbiak szerint:

  • AZURE_CLIENT_ID → Az alkalmazásazonosító értéke.
  • AZURE_TENANT_ID → a bérlőazonosító értéke.
  • AZURE_CLIENT_SECRET → Az alkalmazáshoz létrehozott jelszó/hitelesítő adatok.
AZURE_CLIENT_ID=00001111-aaaa-2222-bbbb-3333cccc4444
AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
AZURE_CLIENT_SECRET=Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6

Végül az alkalmazás indítási kódjában a python-dotenv könyvtár használatával olvassa be a környezeti változókat az .env fájlból indításkor.

from dotenv import load_dotenv

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

DefaultAzureCredential implementálása az alkalmazásban

Az Azure SDK-ügyfélobjektumok Azure-beli hitelesítéséhez az alkalmazásnak a DefaultAzureCredential csomagból származó azure.identity osztályt kell használnia. Ebben a forgatókönyvben DefaultAzureCredential észleli a környezeti változókat AZURE_CLIENT_ID, AZURE_TENANT_IDés AZURE_CLIENT_SECRET be van állítva és beolvassa ezeket a változókat, hogy lekérje az Alkalmazásszolgáltatás egyszerű adatait az Azure-hoz való csatlakozáshoz.

Először adja hozzá az azure.identity csomagot az alkalmazáshoz.

pip install azure-identity

Ezután minden Olyan Python-kód esetében, amely létrehoz egy Azure SDK-ügyfélobjektumot az alkalmazásban:

  1. Importálja az osztályt DefaultAzureCredential a azure.identity modulból.
  2. Hozzon létre egy objektumot DefaultAzureCredential .
  3. Adja át az DefaultAzureCredential objektumot az Azure SDK ügyfélobjektum-konstruktorának.

Erre példa a következő kódszakaszban látható.

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)