Verifiëren bij Azure-resources vanuit Python-apps die on-premises worden gehost
Apps die buiten Azure worden gehost (bijvoorbeeld on-premises of in een datacenter van derden), moeten een service-principal voor toepassingen gebruiken voor verificatie bij Azure bij het openen van Azure-resources. Toepassingsservice-principalobjecten worden gemaakt met behulp van het app-registratieproces in Azure. Wanneer een toepassingsservice-principal wordt gemaakt, worden er een client-id en clientgeheim gegenereerd voor uw app. De client-id, het clientgeheim en uw tenant-id worden vervolgens opgeslagen in omgevingsvariabelen, zodat ze kunnen worden gebruikt door de Azure SDK voor Python om uw app tijdens runtime bij Azure te verifiëren.
Er moet een andere app-registratie worden gemaakt voor elke omgeving waarin de app wordt gehost. Hierdoor kunnen omgevingsspecifieke resourcemachtigingen worden geconfigureerd voor elke service-principal en zorgt u ervoor dat een app die in één omgeving is geïmplementeerd, niet praat met Azure-resources die deel uitmaken van een andere omgeving.
1 - De toepassing registreren in Azure
Een app kan worden geregistreerd bij Azure met behulp van Azure Portal of de Azure CLI.
az ad sp create-for-rbac --name <app-name>
De uitvoer van de opdracht ziet er ongeveer als volgt uit. Noteer deze waarden of houd dit venster open, omdat u deze waarden nodig hebt in de volgende stappen en de waarde voor het wachtwoord (clientgeheim) niet meer kunt weergeven.
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
2 - Rollen toewijzen aan de service-principal van de toepassing
Vervolgens moet u bepalen welke rollen (machtigingen) uw app nodig heeft voor welke resources en welke rollen aan uw app worden toegewezen. Rollen kunnen aan een resource, resourcegroep of abonnementsbereik worden toegewezen. In dit voorbeeld ziet u hoe u rollen toewijst voor de service-principal binnen het bereik van de resourcegroep, omdat de meeste toepassingen al hun Azure-resources groeperen in één resourcegroep.
Aan een service-principal wordt een rol toegewezen in Azure met behulp van de opdracht az role assignment create .
az role assignment create --assignee {appId} \
--scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
--role "{roleName}"
Gebruik de opdracht az role definition list om de rolnamen op te halen waaraan een service-principal kan worden toegewezen.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Als u bijvoorbeeld de service-principal wilt toestaan met de appId van 00001111-aaaa-2222-bbbb-3333cccc4444
lees-, schrijf- en verwijdertoegang tot Azure Storage-blobcontainers en -gegevens in alle opslagaccounts in de resourcegroep msdocs-python-sdk-auth-auth-auth in het abonnement met id aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, wijst u de service-principal van de toepassing toe aan de rol Inzender voor opslagblobgegevens met behulp van de volgende opdracht.
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"
3 - Omgevingsvariabelen configureren voor toepassing
U moet de AZURE_CLIENT_ID
, AZURE_TENANT_ID
en AZURE_CLIENT_SECRET
omgevingsvariabelen instellen voor het proces waarmee uw Python-app wordt uitgevoerd om de referenties van de toepassingsservice-principal tijdens runtime beschikbaar te maken voor uw app. Het DefaultAzureCredential
object zoekt naar de informatie van de service-principal in deze omgevingsvariabelen.
Wanneer u Gunicorn gebruikt om Python-web-apps uit te voeren in een UNIX-serveromgeving, kunnen omgevingsvariabelen voor een app worden opgegeven met behulp van de EnvironmentFile
instructie in het gunicorn.server
bestand, zoals hieronder wordt weergegeven.
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
[Install]
WantedBy=multi-user.target
Het bestand dat in de EnvironmentFile
richtlijn is opgegeven, moet een lijst met omgevingsvariabelen met hun waarden bevatten, zoals hieronder wordt weergegeven.
AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>
4 - DefaultAzureCredential implementeren in de toepassing
Als u Azure SDK-clientobjecten wilt verifiëren bij Azure, moet uw toepassing de DefaultAzureCredential
klasse van het azure.identity
pakket gebruiken.
Begin met het toevoegen van het pakket azure.identity aan uw toepassing.
pip install azure-identity
Vervolgens wilt u voor elke Python-code die een Azure SDK-clientobject maakt in uw app het volgende doen:
- Importeer de
DefaultAzureCredential
klasse uit deazure.identity
module. - Maak een
DefaultAzureCredential
object. - Geef het
DefaultAzureCredential
object door aan de objectconstructor van de Azure SDK-client.
Een voorbeeld hiervan wordt weergegeven in het volgende codesegment.
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)
Wanneer de bovenstaande code het DefaultAzureCredential
object instantieert, DefaultAzureCredential
leest u de omgevingsvariabelen AZURE_TENANT_ID
AZURE_CLIENT_ID
en AZURE_CLIENT_SECRET
leest u de informatie van de service-principal van de toepassing waarmee u verbinding maakt met Azure.