使用 Azure SDK for Python 向 Azure 資源驗證 Azure 裝載的應用程式

當您使用 Azure App 服務、Azure 虛擬機器 或 Azure 容器執行個體 等服務在 Azure 中裝載應用程式時,向 Azure 資源驗證應用程式的建議方法是使用受控識別

受控識別會為您的應用程式提供身分識別,使其能夠連線至其他 Azure 資源,而無須使用秘密金鑰或其他應用程式秘密。 在內部,Azure 知道您應用程式的身分識別,及其能夠連線至哪些資源。 Azure 會使用這項資訊自動取得應用程式的 Microsoft Entra 權杖,使其能夠連線至其他 Azure 資源,且讓您完全無須管理任何應用程式秘密。

受控識別類型

受控身分識別有兩種:

  • 系統指派的受控識別 - 此類型的受控識別由 Azure 資源提供,且兩者直接繫結。 當您在 Azure 資源上啟用受控識別時,您會取得系統為該資源指派的受控識別。 系統指派的受控識別會繫結至與其相關聯之 Azure 資源的生命週期。 因此,當刪除資源時,Azure 會自動為您刪除身分識別。 由於您只需要為裝載程式代碼的 Azure 資源啟用受控識別,因此這種方法是最簡單的受控識別類型。
  • 使用者指派的受控識別 - 您也可以建立受控識別作為獨立 Azure 資源。 當您的解決方案有多個工作負載在多個 Azure 資源上執行,而這些工作負載全都需要共用相同的身分識別和相同的許可權時,最常使用此方法。 例如,如果您的解決方案具有在多個 App Service 上執行的元件,以及所有需要存取相同 Azure 資源的虛擬機實例,則跨這些資源使用的使用者指派受控識別是合理的。

本文涵蓋為應用程式啟用和使用系統指派受控識別的步驟。 如果您需要使用由使用者指派的受控識別,請參閱管理使用者指派的受控識別一文,以了解如何建立使用者指派的受控識別。

1 - 在裝載應用程式的 Azure 資源中啟用受控識別

第一個步驟是在裝載應用程式的 Azure 資源上啟用受控識別。 例如,如果您使用 Azure App 服務 裝載 Django 應用程式,您必須為裝載您應用程式的 App Service Web 應用程式啟用受控識別。 如果您使用虛擬機來裝載應用程式,則可讓您的 VM 使用受控識別。

您可以使用 Azure 入口網站或 Azure CLI,讓受控識別用於 Azure 資源。

Azure CLI 命令可以在 Azure Cloud Shell已安裝 Azure CLI 的工作站上執行。

用來為 Azure 資源啟用受控識別的 Azure CLI 命令採用 az <command-group> identity --resource-group <resource-group-name> --name <resource-name> 格式。 常用 Azure 服務的特定命令顯示如下。

az webapp identity assign --resource-group <resource-group-name> -name <web-app-name>

輸出顯示如下。

{
  "principalId": "99999999-9999-9999-9999-999999999999",
  "tenantId": "33333333-3333-3333-3333-333333333333",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

principalId 值是受控識別的唯一識別碼。 請保留此輸出的複本,因為您在下一個步驟將會用到這些值。

2 - 將角色指派給受控識別

接下來,您必須判斷應用程式需要哪些角色 (權限),並將受控識別指派給 Azure 中的這些角色。 受控識別可以在資源、資源群組或訂閱範圍獲派角色。 此範例示範如何在資源群組範圍中指派角色,因為大部分的應用程式都會將其所有 Azure 資源群組組成單一資源群組。

系統會使用 [az role assignment create] 命令在 Azure 中將角色指派給受控識別。 針對被指派者,請使用 principalId 您在步驟 1 中複製的 。

az role assignment create --assignee {managedIdentityprincipalId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

請使用 az role definition list 命令取得可指派給服務主體的角色名稱。

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

例如,若要允許標識符為99999999-9999-9999-9999-999999999999讀取、寫入和刪除受控識別的受控識別,以 Azure 儲存體 存取 msdocs-python-sdk-auth-example 資源群組中 11111111-1111-1111-1111-111111111111msdocs-python-sdk-auth-example 資源群組中的所有記憶體帳戶中,使用下列命令,將應用程式服務主體指派給 儲存體 Blob 數據參與者角色。

az role assignment create --assignee 99999999-9999-9999-9999-999999999999 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"

如需在資源或訂閱等級使用 Azure CLI 指派權限的更多資訊,請參閱使用 Azure CLI 指派 Azure 角色 (英文) 一文。

3 - 在應用程式中實作 DefaultAzureCredential

當您的程式代碼在 Azure 中執行且受控識別已在裝載應用程式的 Azure 資源上啟用時,會 DefaultAzureCredential 決定要依下列順序使用的認證:

  1. 檢查環境是否有環境變數、 AZURE_TENANT_IDAZURE_CLIENT_SECRETAZURE_CLIENT_CERTIFICATE_PATH (選擇性) AZURE_CLIENT_CERTIFICATE_PASSWORDAZURE_CLIENT_ID定義的服務主體。
  2. 檢查使用者指派受控識別的關鍵詞參數。 您可以在 參數中指定其用戶端識別碼,以傳入使用者指派的 managed_identity_client_id 受控識別。
  3. AZURE_CLIENT_ID檢查環境變數,以取得使用者指派受控識別的用戶端標識符。
  4. 如果已啟用 Azure 資源,請使用系統指派的受控識別。

您可以藉由設定 exclude_managed_identity_credential 關鍵詞參數 True,從認證中排除受控識別。

在本文中,我們會針對 Azure App 服務 Web 應用程式使用系統指派的受控識別,因此我們不需要在環境中設定受控識別,或將它當做參數傳入。 下列步驟示範如何使用 DefaultAzureCredential

首先,將 azure.identity 套件新增至您的應用程式。

pip install azure-identity

接下來,針對在應用程式中建立 Azure SDK 用戶端物件的任何 Python 程式代碼,您會想要:

  1. 從模組匯入 DefaultAzureCredentialazure.identity 類別。
  2. 建立 DefaultAzureCredential 物件。
  3. DefaultAzureCredential 對象傳遞至 Azure SDK 用戶端物件建構函式。

下列步驟的範例會顯示在下列程式代碼區段中。

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)

如適用於 Python 驗證的 Azure SDK 概觀 一文所述, DefaultAzureCredential 支援多個驗證方法,並判斷運行時間所使用的驗證方法。 這種方法的優點是,您的應用程式可以在不同的環境中使用不同的驗證方法,而不需要實作環境特定的程序代碼。 在本機開發期間,當您的工作站上執行上述程式代碼時, DefaultAzureCredential 將會使用應用程式服務主體,如環境設定所決定,或開發人員工具認證來向其他 Azure 資源進行驗證。 因此,相同的程式代碼可用來在本機開發期間和部署至 Azure 時,向 Azure 資源驗證您的應用程式。