Azure Functions 可讓您使用秘密金鑰,來增加存取函式端點的困難度。 本文說明 Functions 支援的存取金鑰類型,以及如何使用存取金鑰。
雖然存取金鑰會針對不想要的存取緩解一定程度的風險,但是在生產環境中,您應該考慮其他選項來保護 HTTP 端點的安全。 例如,在公用應用程式中散發共用密碼並不是很好的做法。 如果您的函式是從公用用戶端呼叫,您應該考慮實作這些或其他安全性機制:
存取金鑰為 HTTP 觸發函式提供 HTTP 授權的基礎。 如需詳細資訊,請參閱授權層級。
了解金鑰
存取金鑰的範圍及其支援的動作取決於存取金鑰的類型。
| 金鑰類型 | 機碼名稱 | HTTP 驗證層級 | 描述 |
|---|---|---|---|
| 功能 |
default 或使用者定義 |
function |
只允許存取特定函式端點。 |
| 主控件 |
default 或使用者定義 |
function |
允許存取函式應用程式中的所有函式端點。 |
| 主要 | _master |
admin |
在函式應用程式中,特殊主機金鑰還可以提供執行階段 REST API 的系統管理存取權。 由於主要金鑰會在您的函式應用程式中授與提高的權限,因此不應該與第三方共用此金鑰,或是在原生用戶端應用程式中散發它。 |
| 系統 | 視延伸模組而定 | 不適用 | 特定的延伸模組可能需要系統管理的金鑰,才能存取 Webhook 端點。 系統金鑰是專為內部元件所呼叫的延伸模組特有函式端點而設計。 例如,事件方格觸發程序要求訂用帳戶在呼叫觸發程序端點時使用系統金鑰。 Durable Functions 也會使用系統金鑰來呼叫長期工作延伸模組 API。 只有特定的擴充功能才能建立系統金鑰。 您無法明確設定其值。 如同其他金鑰,您可以從入口網站或使用金鑰 API 來產生新的金鑰值。 |
每個鍵都命名以供參考。 主機和函式層級有一個名為 default 的預設索引鍵。 函式金鑰的優先順序高於主機金鑰。 當您使用相同的名稱來定義兩個金鑰時,一律會使用函式金鑰。
下表將比較各種存取金鑰的用途:
| 動作 | Scope | 金鑰類型 |
|---|---|---|
| 執行函式 | 特定函式 | 函式 |
| 執行函式 | 任何函式 | 函式或主機 |
呼叫 admin 端點 |
函式應用程式 | 僅限主機 |
| 呼叫長期工作延伸模組 API | 函式應用程式* | 系統 |
| 呼叫延伸模組特定的 Webhook (內部) | 函式應用程式* | 系統 |
*由延伸模組決定的範圍。
重要需求
在 Functions 中,存取金鑰是隨機產生的 32 位元組陣列,其編碼為 URL 安全的 Base 64 字串。 雖然您可以產生本身的存取金鑰並搭配使用 Functions,但強烈建議您改為允許 Functions 為您產生所有存取金鑰。
函式產生的存取金鑰包含特殊簽章和總和檢查碼值,指出存取金鑰的類型,以及 Azure Functions 所產生的存取金鑰。 在金鑰本身中擁有這些額外的元件,可讓您更輕鬆地判斷在安全性掃描和其他自動化程序中找到的這類密碼的來源。
若要允許 Functions 為您產生金鑰,請勿將金鑰 value 提供給任何可用來產生金鑰的 API。
管理金鑰儲存體
金鑰會當作您函數應用程式的一部分儲存於 Azure 中,並在加密後靜置。 依預設,金鑰會儲存在帳戶的 Blob 儲存體容器中,而此帳戶是由 AzureWebJobsStorage 設定所提供的。 您可以使用 AzureWebJobsSecretStorageType 設定來覆寫此預設行為,並改為將金鑰儲存在下列其中一個替代位置:
| 地點 | 值 | 描述 |
|---|---|---|
| 次要儲存體帳戶 | blob |
將金鑰儲存在 Blob 儲存體中,其儲存體帳戶與 Functions 執行階段所使用的儲存體帳戶不同。 使用的特定帳戶和容器是由設定中 AzureWebJobsSecretStorageSas 設定的共用存取簽章 (SAS) URL 所定義。 當 SAS URL 變更時,您必須維護 AzureWebJobsSecretStorageSas 設定。 |
| Azure 金鑰保存庫 | keyvault |
AzureWebJobsSecretStorageKeyVaultUri 中設定的金鑰保存庫會用於儲存金鑰。 |
| 檔案系統 | files |
金鑰會保存在本機檔案系統上,這是 Functions v1.x 中的預設值。 不建議使用檔案系統儲存體。 |
| Kubernetes 秘密 | kubernetes |
AzureWebJobsKusbnetesSecretName 中的資源集可用來儲存金鑰。 僅在函式應用程式部署至 Kube 時支援。 當您使用 Azure Functions Core Tools 將應用程式部署至 Kube 叢集時,其會自動產生值。 不支援不可變密碼。 |
| Azure 容器應用程式秘密 | ContainerApps |
金鑰會儲存在 Azure Container Apps 秘密存放區中。 只有在您的函式應用程式部署至 Azure Container Apps 時才支援。 |
當您使用 Key Vault 進行金鑰儲存時,所需的應用程式設定取決於受控識別的類型,可能是系統指派或使用者指派。
| 設定名稱 | 系統指派 | 使用者指派 | 應用程式註冊 |
|---|---|---|---|
| AzureWebJobsSecretStorageKeyVaultUri | ✓ | ✓ | ✓ |
| AzureWebJobsSecretStorageKeyVaultClientId | X | ✓ | ✓ |
| AzureWebJobsSecretStorageKeyVaultClientSecret | X | X | ✓ |
| AzureWebJobsSecretStorageKeyVaultTenantId | X | X | ✓ |
這很重要
透過 AzureWebJobsSecretStorageKeyVaultUri 設定,秘密不會限定於個別函式應用程式。 如果多個函式應用程式設定為使用相同的 Key Vault,它們會共用相同的秘密,可能會導致密鑰衝突或覆寫。 若要避免非預期的行為,建議您針對每個函式應用程式使用個別的 Key Vault 執行個體。
使用存取金鑰
HTTP 觸發函式通常可以使用包含函式名稱的 URL 來呼叫。 當給定函數的授權層級設為 以外的值 anonymous時,您也必須在要求中提供存取金鑰。 存取金鑰可從使用 ?code= 查詢字串中的 URL 或要求標頭 (x-functions-key) 中提供。 如需詳細資訊,請參閱存取金鑰授權。
若要存取執行階段 REST API (在 /admin/ 下),您必須在 _master 要求標頭中提供主要金鑰 (x-functions-key)。 您可以使用 網站屬性functionsRuntimeAdminIsolationEnabled。
取得函式存取金鑰
您可以使用這些 Azure Resource Manager API,以程式設計方式取得函式和主機金鑰:
若要了解如何呼叫 Azure Resource Manager API,請參閱 Azure REST API 參考。
您可以使用這些方法來取得存取金鑰,而不需要使用 REST API。
登入 Azure 入口網站,然後搜尋並選取 [函式應用程式]。
選取您想要使用的函式應用程式。
在左側功能表中,展開 [函式],然後選取 [應用程式金鑰]。
[應用程式金鑰] 頁面隨即出現。 在此頁面上會顯示主機金鑰,可用來存取應用程式中的任何函式。 系統金鑰也會顯示,讓任何系統管理員等級的人員能夠存取所有函式應用程式 API。
您也可以透過僅為特定函式使用的金鑰來實作最小權限。 您可以從特定 HTTP 觸發函式的 [函式金鑰] 索引標籤取得函式特定金鑰。
小提示
您也可以使用 Azure Functions 核心工具命令 func azure functionapp list-functions 搭配選項 --show-keys 來取得函式的存取金鑰。 如需詳細資訊,請參閱 Azure Functions 核心工具參考。
更新或建立存取金鑰
當更新或建立存取金鑰值時,您必須手動將更新的金鑰值重新散發給所有呼叫您函式的用戶端。
您可以使用這些 Azure Resource Manager API,以程序設計方式更新函式和主機金鑰,或建立新的金鑰:
若要了解如何呼叫 Azure Resource Manager API,請參閱 Azure REST API 參考。
您可以使用這些方法來取得存取金鑰,而不需要手動建立 REST API 的呼叫。
登入 Azure 入口網站,然後搜尋並選取 [函式應用程式]。
選取您想要使用的函式應用程式。
在左側功能表中,展開 [函式],然後選取 [應用程式金鑰]。
[應用程式金鑰] 頁面隨即出現。 在此頁面上會顯示主機金鑰,可用來存取應用程式中的任何函式。 系統金鑰也會顯示,讓任何系統管理員等級的人員能夠存取所有函式應用程式 API。
選取要更新之金鑰旁邊的 [更新金鑰值],然後選取 [更新並儲存]。
您可以從特定 HTTP 觸發函式的 [函式金鑰] 索引標籤續訂函式金鑰。
刪除存取金鑰
您可以使用這些 Azure Resource Manager API,以程式設計方式刪除函式和主機金鑰:
若要了解如何呼叫 Azure Resource Manager API,請參閱 Azure REST API 參考。