使用 Azure SDK for Python 向 Azure 資源驗證 Azure 裝載的應用程式
當您使用 Azure App 服務、Azure 虛擬機器 或 Azure 容器執行個體 等服務在 Azure 中裝載應用程式時,向 Azure 資源驗證應用程式的建議方法是使用受控識別。
受控識別會為您的應用程式提供身分識別,使其能夠連線至其他 Azure 資源,而無須使用秘密金鑰或其他應用程式秘密。 在內部,Azure 知道您應用程式的身分識別,及其能夠連線至哪些資源。 Azure 會使用這項資訊自動取得應用程式的 Microsoft Entra 權杖,使其能夠連線至其他 Azure 資源,且讓您完全無須管理任何應用程式秘密。
注意
在 Azure Kubernetes Service (AKS) 上執行的應用程式可以使用工作負載身分識別向 Azure 資源進行驗證。 在 AKS 中,工作負載身分識別代表受控識別與 Kubernetes 服務帳戶之間的信任關係。 如果部署至 AKS 的應用程式是以這類關聯性的 Kubernetes 服務帳戶設定, DefaultAzureCredential
請使用受控識別向 Azure 驗證應用程式。 使用工作負載身分識別進行驗證會討論在搭配 Azure Kubernetes Service 使用 Microsoft Entra 工作負載 ID。 如需如何設定工作負載身分識別的步驟,請參閱 在 Azure Kubernetes Service (AKS) 叢集上部署和設定工作負載身分識別。
受控識別類型
受控身分識別有兩種:
- 系統指派的受控識別 - 此類型的受控識別由 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": "aaaaaaaa-bbbb-cccc-1111-222222222222",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"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
例如,若要允許標識符為aaaaaaaa-bbbb-cccc-1111-222222222222
讀取、寫入和刪除受控識別的受控識別,以 Azure 儲存體 存取 msdocs-python-sdk-auth-example 資源群組中 aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
msdocs-python-sdk-auth-example 資源群組中的所有記憶體帳戶中,使用下列命令將應用程式服務主體指派給記憶體 Blob 數據參與者角色。
az role assignment create --assignee aaaaaaaa-bbbb-cccc-1111-222222222222 \
--scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example \
--role "Storage Blob Data Contributor"
如需在資源或訂閱等級使用 Azure CLI 指派權限的更多資訊,請參閱使用 Azure CLI 指派 Azure 角色一文。
3 - 在應用程式中實作 DefaultAzureCredential
當您的程式代碼在 Azure 中執行且受控識別已在裝載應用程式的 Azure 資源上啟用時,會 DefaultAzureCredential
決定要依下列順序使用的認證:
- 檢查環境是否有環境變數、
AZURE_TENANT_ID
或AZURE_CLIENT_SECRET
或AZURE_CLIENT_CERTIFICATE_PATH
(選擇性)AZURE_CLIENT_CERTIFICATE_PASSWORD
所AZURE_CLIENT_ID
定義的服務主體。 - 檢查使用者指派受控識別的關鍵詞參數。 您可以在 參數中指定其用戶端識別碼,以傳入使用者指派的
managed_identity_client_id
受控識別。 AZURE_CLIENT_ID
檢查環境變數,以取得使用者指派受控識別的用戶端標識符。- 如果已啟用 Azure 資源,請使用系統指派的受控識別。
您可以藉由設定 exclude_managed_identity_credential
關鍵詞參數 True
,從認證中排除受控識別。
在本文中,我們會針對 Azure App 服務 Web 應用程式使用系統指派的受控識別,因此我們不需要在環境中設定受控識別,或將它當做參數傳入。 下列步驟示範如何使用 DefaultAzureCredential
。
首先,將 azure.identity
套件新增至您的應用程式。
pip install azure-identity
接下來,針對在應用程式中建立 Azure SDK 用戶端物件的任何 Python 程式代碼,您會想要:
- 從模組匯入
DefaultAzureCredential
azure.identity
類別。 - 建立
DefaultAzureCredential
物件。 - 將
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 資源驗證您的應用程式。