Azure 中的授權決定了經過認證的使用者或服務能對資源執行哪些動作。 本文將探討如何使用 Python 版 Azure SDK 實作授權,涵蓋模型、實作、故障排除及最佳實務。 關於詳細的認證設定,請參考 「Authenticate Python apps to Azure」。
簡介
認證(AuthN) 驗證使用者或服務的身份,而 授權(AuthZ) 則定義他們能做什麼。 在 Azure 中,授權確保對資源的安全存取,這對保護應用程式與資料至關重要。 開發者可透過 Python 的 Azure SDK 實作強健授權,控制各種工作流程的存取,從資源管理到服務特定資料存取皆有。
Azure 授權模型
Azure 提供多種授權機制來管理存取權限。 了解這些模型對於有效的存取控制至關重要。
Azure 角色型存取控制
Azure 角色型存取控制(RBAC)會在訂閱或資源群組等範圍內,為識別分配角色。 內建角色包括擁有者、貢獻者與讀者,而自訂角色則允許客製化權限。 當你在特定作用域指派角色時,該身份(例如使用者或服務)會獲得該範圍內所有資源及其子範圍的權限。 例如,在訂閱層級指派貢獻者角色,可以管理該訂閱中的所有資源。 請參閱 「了解 Azure RBAC 的範圍」。
服務專用機制
部分 Azure 服務提供獨特的授權方法:
- Azure 儲存:使用共享存取簽章(SAS)和存取控制清單(ACL)來存取資料。 請參見 Azure 儲存Service-Specific 授權說明。
- Azure Key Vault:建議使用 RBAC 而非舊有存取政策。 請參見 Azure Key Vault 的 服務特定授權說明。
- Microsoft Graph:採用 OAuth 2.0 的範圍與應用程式權限。 請參閱 Microsoft Graph 的 特定服務授權說明。
在 Azure SDK for Python 中使用授權
Python 版 Azure SDK 內建支援,透過套件 azure-identity 處理認證與授權。 此 DefaultAzureCredential 類別支援多種認證機制,如受管理身份與服務主體,並能適應不同環境。
範例:列出資源群組
此範例展示了 Azure SDK for Python 如何使用憑證(透過 DefaultAzureCredential)來認證,以及授權如何決定身份是否能成功列出資源群組。 若身份在訂閱或資源群組範圍內缺少 Reader 或更高角色,此呼叫會回傳 403 禁止錯誤。
from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient
credential = DefaultAzureCredential()
client = ResourceManagementClient(credential, "<subscription-id>")
resource_groups = client.resource_groups.list()
for rg in resource_groups:
print(rg.name)
用你的 Azure 訂閱 ID 替換 <subscription-id> ,通常 00000000-0000-0000-0000-000000000000以 .
Microsoft Graph 與權限範圍
要存取 Microsoft Graph,請使用官方的 Microsoft Graph SDK for Python,該 SDK 支援委派權限與應用程式權限。
此範例展示了 SDK 如何利用憑證請求具有所需授權範圍 https://graph.microsoft.com/.default 的存取權杖,並存取 Microsoft Graph 資源。 該身份必須在 Microsoft Entra ID 中取得授權,並取得適當的應用程式權限(例如 User.Read.All),才能取得使用者資料;否則,請求將以 403 禁止條款失敗。
這很重要
請確保您的應用程式或身份擁有 User.Read.All Microsoft Entra ID 中授予的其他必要權限。
from azure.identity import DefaultAzureCredential
from msgraph.core import GraphClient
credential = DefaultAzureCredential()
client = GraphClient(credential=credential, scopes=["https://graph.microsoft.com/.default"])
response = client.get("/users")
users = response.json().get("value", [])
for user in users:
print(user["displayName"])
想了解更多關於這個 SDK 的資訊,請參考官方的 Build Python 應用程式 with Microsoft Graph 教學。
診斷授權錯誤
授權問題常常會引發 HTTP 403 禁止錯誤,表示權限不足。 診斷這些問題的方法:
檢查錯誤訊息:請查看回應以了解缺少權限的細節。
啟用日誌記錄:使用 Python 日誌來檢查請求與回應。
import logging logging.basicConfig(level=logging.DEBUG)驗證存取權限:使用 Azure CLI 或 Azure portal 來檢查角色分配。
az role assignment list --assignee <principal-id> --scope <scope>將
<principal-id>替換為您使用者、服務主體或受管理身份的物件 ID。 用 Azure 資源範圍取代<scope>,例如訂閱 ID、資源群組名稱或資源。 請參見使用內窺鏡。
與示波器的工作
通常,你需要提供一個範圍,例如以下範例:
az role assignment list \
--assignee <principal-id> \
--scope <scope>
以下是一些常見的範圍格式:
| 範圍層級 | 範例值 |
|---|---|
| Subscription | /subscriptions/<subscription-id> |
| 資源群組 | /subscriptions/<subscription-id>/resourceGroups/<resource-group-name> |
| 資源名稱 | /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/<provider-namespace>/<resource-type>/<resource-name> |
例如,列出資源群組層級管理身份的所有角色分配:
az role assignment list \
--assignee 12345678-90ab-cdef-1234-567890abcdef \
--scope /subscriptions/<subscription-id>/resourceGroups/my-resource-group
或者在訂閱方案層級:
az role assignment list \
--assignee 12345678-90ab-cdef-1234-567890abcdef \
--scope /subscriptions/<subscription-id>
要取得使用者或受管理身份的物件 ID<principal-id>(),請使用:
az ad user show --id <user-email> --query id
az identity show --name <identity-name> --resource-group <rg-name> --query principalId
管理存取權
透過角色分配管理存取權限,方法如下:
Azure 入口網站:透過存取控制(IAM)服務選單新增角色。
Azure CLI:
az role assignment create --assignee <principal-id> --role <role-name> --scope <scope>將
<principal-id>替換為您使用者、服務主體或受管理身份的物件 ID。 以 Azure 資源範圍取代<scope>,例如訂閱 ID、資源群組名稱或資源名稱。 請參見使用內窺鏡。ARM 範本:用於宣告式管理。
對於受管理的身分,將角色指派給與資源相關聯的身分,例如虛擬機器。 使用 Azure 入口網站的「檢查存取」功能或 Azure CLI 來驗證有效權限。
服務專屬授權備註
在服務專屬機制章節中,你了解到有些 Azure 服務提供獨特的授權方法。 本節提供上述三項 Azure 服務的詳細說明。
Azure 儲存體
- RBAC:管理控制平面作業。
- SAS 與 ACL:支援控制資料平面存取,並支援 Microsoft Entra 認證。
範例:使用 Microsoft Entra ID 存取 blob
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
credential = DefaultAzureCredential()
client = BlobServiceClient(account_url="https://<account-name>.blob.core.windows.net", credential=credential)
containers = client.list_containers()
for container in containers:
print(container.name)
請用你的 Azure 儲存體 帳號名稱替換 <account-name> 。
Azure Key Vault
為了保持一致性,請使用 RBAC 取代舊有存取政策。 存取政策仍被支持,但並非首選。
範例:取回一個秘密
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
credential = DefaultAzureCredential()
client = SecretClient(vault_url="https://<vault-name>.vault.azure.net", credential=credential)
secret = client.get_secret("my-secret")
print(secret.value)
請用你的 金鑰保存庫 資源名稱替換 <vault-name> 。
Microsoft Graph
使用 OAuth 2.0 的範圍來進行委派的權限,以及為守護程序應用程式提供應用程式權限。 如前述範例所示,指定作用範圍。
最佳做法
- 最低權限:只分配必要的權限,例如「讀者」而非「貢獻者」。
- 偏好 RBAC:特別是 金鑰保存庫,因為它能做統一存取控制。
- 使用受管理身份:避免在程式碼中管理憑證。
- 限制圖權限:請求特定範圍以降低風險。