從裝載於內部部署的 Python 應用程式向 Azure 資源進行驗證
裝載於 Azure 外部的應用程式 (例如內部部署或第三方資料中心) 應該使用應用程式服務主體,在存取 Azure 資源時向 Azure 進行驗證。 系統會在 Azure 中使用應用程式註冊程序來建立應用程式服務主體物件。 建立應用程式服務主體時,將會為您的應用程式產生用戶端識別碼和用戶端密碼。 接著,用戶端識別碼、用戶端密碼和租使用者標識符會儲存在環境變數中,讓適用於 Python 的 Azure SDK 用來在運行時間向 Azure 驗證您的應用程式。
應該為裝載應用程式所在的每個環境建立不同的應用程式註冊。 這可讓每個服務主體設定環境特定的資源許可權,並確保部署到某個環境的應用程式不會與屬於另一個環境一部分的 Azure 資源交談。
1:在 Azure 中註冊應用程式
您可以使用 Azure 入口網站或 Azure CLI 向 Azure 註冊應用程式。
az ad sp create-for-rbac --name <app-name>
命令的輸出會類似下列內容。 請記下這些值,或讓此視窗保持開啟,因為您在後續步驟中需要這些值,而且無法再次檢視密碼 (客戶端密碼) 值。
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
2:將角色指派給應用程式服務主體
接著,您必須決定應用程式針對哪些資源需要哪些角色 (權限),並將這些角色指派給應用程式。 角色可在資源、資源群組或訂閱範圍內獲派其他角色。 此範例示範如何在資源群組範圍指派服務主體的角色,因為大部分的應用程式都會將其所有 Azure 資源分組到單一資源群組中。
系統使用 az role assignment create 命令在 Azure 中將角色指派給服務主體。
az role assignment create --assignee {appId} \
--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
例如,若要允許具有 appId 00001111-aaaa-2222-bbbb-3333cccc4444
的服務主體具有讀取、寫入和刪除存取權,以 Azure 儲存體 存取 msdocs-python-sdk-sdk-auth-example 資源群組中 msdocs-python-sdk-auth-example 資源群組中的所有aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
記憶體帳戶,並使用下列命令將應用程式服務主體指派給儲存體 Blob 數據參與者角色。
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"
如需在資源或訂閱等級使用 Azure CLI 指派權限的更多資訊,請參閱使用 Azure CLI 指派 Azure 角色一文。
3:設定應用程式的環境變數
您必須為執行 Python 應用程式的程式設定 AZURE_CLIENT_ID
、 AZURE_TENANT_ID
和 AZURE_CLIENT_SECRET
環境變數,讓應用程式服務主體認證可在運行時間使用。 對象 DefaultAzureCredential
會尋找這些環境變數中的服務主體資訊。
使用 Gunicorn 在 UNIX 伺服器環境中執行 Python Web 應用程式時,可以使用 檔案中的 gunicorn.server
指示詞來指定EnvironmentFile
應用程式的環境變數,如下所示。
[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
指示詞中指定的 EnvironmentFile
檔案應該包含具有其值的環境變數清單,如下所示。
AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>
4:在應用程式中實作 DefaultAzureCredential
若要向 Azure 驗證 Azure SDK 用戶端物件,您的應用程式應該使用 DefaultAzureCredential
套件中的 azure.identity
類別。
首先,將 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)
當上述程式代碼具現化 DefaultAzureCredential
物件時, DefaultAzureCredential
讀取要連線到 Azure 的應用程式服務主體資訊環境變數 AZURE_TENANT_ID
、 AZURE_CLIENT_ID
和 AZURE_CLIENT_SECRET
。