Python-alkalmazások hitelesítése az Azure-szolgáltatásokba a helyi fejlesztés során szolgáltatásnevek használatával
Felhőalkalmazások létrehozásakor a fejlesztőknek hibakeresést és tesztelést kell végezniük az alkalmazások helyi munkaállomásán. Ha egy alkalmazás egy fejlesztői munkaállomáson fut a helyi fejlesztés során, akkor is hitelesítenie kell az alkalmazás által használt Azure-szolgáltatásokban. Ez a cikk bemutatja, hogyan állíthat be dedikált alkalmazásszolgáltatás-egyszerű objektumokat a helyi fejlesztés során.
A helyi fejlesztéshez szükséges dedikált alkalmazásszolgáltatás-tagok lehetővé teszik a minimális jogosultság elvét az alkalmazásfejlesztés során. Mivel az engedélyek hatóköre pontosan az alkalmazáshoz szükséges a fejlesztés során, az alkalmazáskód nem fér hozzá véletlenül egy másik alkalmazás által használni kívánt Azure-erőforráshoz. Ez azt is megakadályozza, hogy hibák lépjenek fel az alkalmazás éles környezetbe való áthelyezésekor, mert az alkalmazás túlterjedt a fejlesztői környezetben.
Amikor az alkalmazás regisztrálva van az Azure-ban, az alkalmazáshoz egy alkalmazás-szolgáltatásnév van beállítva. A helyi fejlesztésre szánt alkalmazások regisztrálásakor a következőket javasoljuk:
- Hozzon létre külön alkalmazásregisztrációkat az alkalmazáson dolgozó minden fejlesztő számára. Ez külön alkalmazásszolgáltatás-tagokat hoz létre az egyes fejlesztők számára, hogy a helyi fejlesztés során használják, és ne kelljen a fejlesztőknek megosztanak hitelesítő adatokat egyetlen alkalmazás-szolgáltatásnévhez.
- Alkalmazásonként külön alkalmazásregisztrációkat hozhat létre. Ez csak az alkalmazás által igényelt engedélyekre terjed ki.
A helyi fejlesztés során a környezeti változók az application service principal identitásával vannak beállítva. A Pythonhoz készült Azure SDK beolvassa ezeket a környezeti változókat, és ezeket az információkat felhasználva hitelesíti az alkalmazást a szükséges Azure-erőforrásokon.
1 – Az alkalmazás regisztrálása az Azure-ban
Az alkalmazásszolgáltatás egyszerű objektumai alkalmazásregisztrációval jönnek létre az Azure-ban. Ez az Azure Portal vagy az Azure CLI használatával végezhető el.
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ásnevet az alkalmazáshoz. A parancs ugyanakkor létrehozza az alkalmazás regisztrációját is az alkalmazáshoz.
az ad sp create-for-rbac --name {service-principal-name}
A parancs kimenete a következőhöz hasonlóan fog kinézni. 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": "00000000-0000-0000-0000-000000000000",
"displayName": "{service-principal-name}",
"password": "abcdefghijklmnopqrstuvwxyz",
"tenant": "33333333-3333-3333-3333-333333333333"
}
2 – Microsoft Entra biztonsági csoport létrehozása helyi fejlesztéshez
Mivel általában több fejlesztő dolgozik egy alkalmazáson, javasoljuk, hogy hozzon létre egy Microsoft Entra biztonsági csoportot, amely beágyazza az alkalmazáshoz szükséges szerepköröket (engedélyeket) a helyi fejlesztés során, ahelyett, hogy az egyes szolgáltatásnév-objektumokhoz rendelné a szerepköröket. Ez 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.
az ad group create \
--display-name MyDisplay \
--mail-nickname MyDisplay \
--description "<group-description>"
Másolja ki a id
tulajdonság értékét a parancs kimenetében. Ez a csoport objektumazonosítója. A későbbi lépésekben szüksége lesz rá. A tulajdonság lekéréséhez használhatja az az ad group show parancsot is.
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 az ad sp listával listázhatja az elérhető szolgáltatásnevek listáját. 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 a fontos oszlopokra korlátozza az oszlopokat.
az ad sp list \
--filter "startswith(displayName, 'msdocs')" \
--query "[].{objectId:id, displayName:displayName}" \
--output table
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-name> \
--member-id <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.
3 – 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.
Egy felhasználó, csoport vagy alkalmazásszolgáltatás-tag szerepkörhöz van rendelve az Azure-ban az az role assignment create paranccsal. Megadhat egy csoportot az objektumazonosítójával. Megadhat egy alkalmazásszolgáltatásnevet az appId azonosítójával.
az role assignment create --assignee {appId or objectId} \
--scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
--role "{roleName}"
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 lehetővé szeretné tenni, hogy az alkalmazásszolgáltatás-tag az előfizetés 00000000-0000-0000-0000-000000000000
msdocs-python-sdk-auth-auth típusú erőforráscsoportjának összes tárfiókjában lévő Azure Storage-blobtárolókhoz és -adatokhoz való olvasási, írási és törlési hozzáféréssel rendelkezik az azonosítóval11111111-1111-1111-1111-111111111111
, az alkalmazásszolgáltatásnevet a Következő paranccsal rendelje hozzá a Storage Blob-adatszolgáltató szerepkörhöz.
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"
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.
4 – Helyi fejlesztési környezeti változók beállítása
Az DefaultAzureCredential
objektum futásidőben a környezeti változók egy halmazában fogja keresni a szolgáltatásnév adatait. Mivel a legtöbb fejlesztő több alkalmazáson is dolgozik, javasoljuk, hogy a fejlesztés során egy python-dotenv csomaghoz hasonló csomagot használjon a környezet eléréséhez az alkalmazás könyvtárában tárolt fájlból.env
. Ez az alkalmazás Azure-beli hitelesítéséhez használt környezeti változókra terjed ki, így csak az alkalmazás használhatja őket.
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ékét.AZURE_CLIENT_SECRET
→ Az alkalmazáshoz létrehozott jelszó/hitelesítő adatok.
AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
Végül az alkalmazás indítási kódjában a python-dotenv
kódtár használatával olvassa be a környezeti változókat a fájlból az .env
indításkor.
from dotenv import load_dotenv
if ( os.environ['ENVIRONMENT'] == 'development'):
print("Loading environment variables from .env file")
load_dotenv(".env")
5 – 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 fő információit az Azure-hoz való csatlakozáshoz.
Először adja hozzá az azure.identity csomagot az alkalmazáshoz.
pip install azure-identity
Ezután az azure SDK-ügyfélobjektumot létrehozó Python-kódok esetében a következőket kell elvégeznie:
- Importálja az osztályt
DefaultAzureCredential
aazure.identity
modulból. - Hozzon létre egy objektumot
DefaultAzureCredential
. - 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)