逐步解說:使用 Azure 服務進行 Python 應用程式的整合式驗證

Microsoft Entra 標識符搭配 Azure Key Vault 使用時,提供強固且安全的方法來向需要存取密鑰或認證的 Azure 服務和第三方平臺驗證應用程式。 此組合不需要在應用程式程式代碼中硬式編碼秘密,而是依賴受控識別、角色型訪問控制 (RBAC),以及透過 Key Vault 進行集中式秘密管理。 這種方法可簡化身分識別管理,並增強雲端環境中的安全性狀態。

本逐步解說會透過 GitHub 存放庫中提供的實用範例探索這些驗證機制: github.com/Azure-Samples/python-integrated-authentication

此範例示範 Python 應用程式如何:

  • 使用 DefaultAzureCredential 向 Azure 進行驗證

  • 存取 Azure Key Vault 秘密而不儲存認證

  • 與 Azure 記憶體、Cosmos DB 等其他 Azure 服務安全地通訊

本文是系列文章的一部分,提供使用 Azure Python SDK azure-identity 函式庫,透過 Microsoft Entra ID、Azure Key Vault 和 Azure 佇列儲存體,對 Python 應用程式進行身份驗證的詳細逐步解說。

第 1 部分:背景

雖然許多 Azure 服務完全依賴角色型存取控制 (RBAC),而其他服務則需要透過秘密或密鑰進行存取。 此類服務包括 Azure 儲存、資料庫、Foundry Tools、Key Vault 及事件中心

建置與這些服務互動的雲端應用程式時,開發人員可以使用 Azure 入口網站、CLI 或 PowerShell 來產生和設定服務特定的存取密鑰。 這些金鑰會系結至特定的存取原則,以防止未經授權的存取。 不過,此模型需要您的應用程式明確地管理密鑰,並分別向每個服務進行驗證,這是一個既乏味又容易出錯的程式。

將秘密直接內嵌在程式碼中,或將它們儲存在開發人員機器上,可能會暴露在:

  • 源碼管理
  • 不安全的本地環境
  • 意外生成的紀錄或配置匯出

Azure 提供兩項金鑰服務來改善安全性和簡化驗證:

  • Azure Key Vault Azure Key Vault 為秘密提供安全的雲端式存放區,包括存取密鑰、連接字串和憑證。 應用程式只會在運行時間從 Key Vault 擷取秘密,以避免在原始程式碼或組態檔中公開敏感數據。
  • 透過 Microsoft Entra 受控識別,您的應用程式可以使用Microsoft Entra標識符進行一次驗證。 您可以從該處存取其他 Azure 服務,包括 Key Vault,而不需要直接管理認證。

此方法提供:

  • 沒有認證程式代碼 (原始檔控制中沒有秘密)
  • 與 Azure 服務無縫整合
  • 環境一致性:相同的程序代碼會在本機和雲端中執行,且設定最少

本操作指南示範如何在相同的應用程式中使用 Microsoft Entra 受管理的身分和 Key Vault。 藉由同時使用Microsoft Entra ID 和 Key Vault,您的應用程式永遠不需要向個別 Azure 服務驗證自己,而且可以輕鬆地安全地存取第三方服務所需的任何密鑰。

這很重要

本文使用通用的泛型詞彙「金鑰」來參考 Azure Key Vault 中儲存為「秘密」的內容,例如 REST API 的存取密鑰。 此使用方式不應與 Key Vault 的密碼 編譯密鑰管理 混淆,這是與 Key Vault 秘密不同的功能。

範例雲端應用程式案例

若要更深入地瞭解 Azure 的驗證程式,請考慮下列案例:Flask Web 應用程式會部署到 Azure App Service。 它會公開公用、未經驗證的 API 端點,以傳回 JSON 數據以回應 HTTP 要求。

  • 為了產生其回應,API 會叫用需要存取密鑰的第三方 API。 應用程式會使用 Microsoft Entra 受控識別,從 Azure Key Vault 安全地從運行時間擷取密鑰,而不是將此金鑰儲存在程式代碼或組態檔中。

  • 在將回應傳回給用戶端之前,應用程式會將訊息寫入至 Azure 記憶體佇列以進行異步處理。 雖然下游處理不是此案例的焦點,但訊息可能代表工作、記錄或訊號。

應用程式案例的圖表

備註

雖然公用 API 端點通常受到自己的存取金鑰或驗證機制保護,但本逐步解說假設端點已開啟且未經驗證。

此簡化有助於將應用程式的內部驗證需求,如存取 Azure Key Vault 和 Azure 儲存體,與外部客戶端相關的任何驗證問題隔離開來。

此案例僅著重於應用程式的行為,且不會示範或牽涉到向端點進行驗證的外部呼叫端。