在 Azure Functions 中使用存取金鑰

Azure Functions 存取金鑰作為共享秘密,授權存取函式端點。 本文說明 Functions 支援的存取金鑰類型,以及如何使用存取金鑰。

雖然存取金鑰能提供一定程度的防護以防止不受歡迎的存取,但請考慮其他選項來保護生產環境中的 HTTP 端點安全。 例如,不要在公開應用程式中分發共享秘密。 如果公開用戶端呼叫你的函式,請考慮實作以下或其他安全機制:

存取金鑰為 HTTP 觸發函式中的 HTTP 授權提供基礎。 如需詳細資訊,請參閱授權層級

存取金鑰類型

存取金鑰的範圍及其支援的動作取決於存取金鑰的類型。

金鑰類型 機碼名稱 HTTP 驗證層級 描述
功能 default 或使用者定義 function 只允許存取特定函式端點。
主控件 default 或使用者定義 function 允許存取函式應用程式中的所有函式端點。
主要 _master admin 在函式應用程式中,特殊主機金鑰還可以提供執行階段 REST API 的系統管理存取權。 因為主金鑰會在你的函式應用程式中授予提升權限,請不要將此金鑰分享給第三方,也不要在原生客戶端應用程式中分發。
系統 視延伸模組而定 不適用 特定的延伸模組可能需要系統管理的金鑰,才能存取 Webhook 端點。 系統金鑰是為內部元件呼叫的擴充專屬函式端點設計的。 例如,事件方格觸發程序要求訂用帳戶在呼叫觸發程序端點時使用系統金鑰。 Durable Functions 也會使用系統金鑰來呼叫長期工作延伸模組 API
只有特定的擴充功能才能建立系統金鑰。 您無法明確設定其值。 如同其他金鑰,您可以從入口網站或使用金鑰 API 來產生新的金鑰值。

每個鑰匙都有一個名稱供參考。 function app 和 function 層級各自有一個預設的鍵,名為 default。 函式金鑰的優先順序高於主機金鑰。 當兩個鍵名稱相同時,總是使用功能鍵。

下表將比較各種存取金鑰的用途:

動作 Scope 金鑰類型
執行函式 特定函式 函式
執行函式 任何函式 函式或主機
呼叫 admin 端點 函式應用程式 大師
呼叫長期工作延伸模組 API 函式應用程式* 系統
呼叫專屬擴充功能的 webhook(內部) 函式應用程式* 系統

*由延伸模組決定的範圍。

存取金鑰需求

在 Functions 中,存取金鑰是隨機產生的 32 位元組陣列,其編碼為 URL 安全的 Base 64 字串。 雖然你可以自行產生存取金鑰並搭配 Functions 使用,但請使用預設的存取金鑰產生流程。

函式產生的存取金鑰包含特殊簽章和總和檢查碼值,指出存取金鑰的類型,以及 Azure Functions 所產生的存取金鑰。 這些額外的金鑰元件,使得在安全掃描及其他自動化流程中更容易確定這類秘密的來源。

要讓函式產生你的鍵,請不要提供任何可用於產生鍵的 API 鍵 value

存取金鑰儲存

你在 Azure 中的函式應用程式會儲存金鑰並在靜態時加密它們。 預設情況下,該 AzureWebJobsStorage 設定會將金鑰儲存在所提供帳號的 Blob 儲存容器中。 使用設定 AzureWebJobsSecretStorageType 來覆寫這個預設行為,並將金鑰存放在以下替代位置之一:

地點 描述
次要儲存體帳戶 blob 將鍵存放在 Blob 儲存空間,儲存帳號與 Functions 執行時使用的帳號不同。 使用的特定帳戶和容器是由設定中 AzureWebJobsSecretStorageSas 設定的共用存取簽章 (SAS) URL 所定義。 當 SAS URL 變更時,您必須維護 AzureWebJobsSecretStorageSas 設定。
Azure 金鑰保存庫 keyvault 將鑰匙存放在 Setn 中的 AzureWebJobsSecretStorageKeyVaultUrikey vault 中。
檔案系統 files 金鑰會保存在本機檔案系統上,這是 Functions v1.x 中的預設值。 不建議使用檔案系統儲存體。
Kubernetes 秘密 kubernetes 將金鑰儲存在資源集中。AzureWebJobsKubernetesSecretName 僅在函式應用程式部署至 Kube 時支援。 當您使用 Azure Functions Core Tools 將應用程式部署至 Kube 叢集時,其會自動產生值。 不支援不可變密碼
Azure 容器應用程式秘密 containerapps 金鑰儲存在 Azure 容器應用程式 的秘密儲存庫中,這是容器應用程式的內部秘密管理系統。 只有在您的函式應用程式部署至 Azure 容器應用程式 時才支援。 相關資訊請參見 「配置容器應用程式秘密儲存庫」。

當你使用 金鑰保存庫 作為金鑰儲存時,你需要的應用程式設定取決於該應用程式如何認證 金鑰保存庫:系統指派的管理身份、使用者指派的管理身份,或是應用程式註冊。

設定名稱 系統指派 使用者指派 應用程式註冊
AzureWebJobsSecretStorageKeyVaultUri Yes Yes Yes
AzureWebJobsSecretStorageKeyVaultClientId No Yes Yes
AzureWebJobsSecretStorageKeyVaultClientSecret No No Yes
AzureWebJobsSecretStorageKeyVaultTenantId No No Yes

這很重要

透過 AzureWebJobsSecretStorageKeyVaultUri 設定,秘密不會限定於個別函式應用程式。 如果多個函式應用程式設定為使用相同的 金鑰保存庫,它們會共用相同的秘密,可能會導致密鑰衝突或覆寫。 若要避免非預期的行為,建議您針對每個函式應用程式使用個別的 金鑰保存庫 執行個體。

擁有存取金鑰的呼叫端點

你可以透過包含函式名稱的 URL 呼叫 HTTP 觸發的函式。 當你將函式的授權等級設定為除 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 參考

備註

當你將函式應用程式部署到 Azure 容器應用程式 並使用 AzureWebJobsSecretStorageType=ContainerApps時,必須使用 Container Apps 專屬的方法來取得函式金鑰。 欲了解更多資訊,請參閱容器應用程式文件中的 「管理存取金鑰 」。

使用這些方法可以取得存取金鑰,而不必使用 REST API。

  1. 登入 Azure 入口網站,然後搜尋並選擇功能應用程式

  2. 選取您想要使用的函式應用程式。

  3. 在左側功能表中,展開 [函式],然後選取 [應用程式金鑰]。

    [應用程式金鑰] 頁面隨即出現。 在這個頁面上,會顯示主機金鑰,你可以用它來存取應用程式中的任何功能。 系統金鑰也會顯示,讓任何系統管理員等級的人員能夠存取所有函式應用程式 API。

您也可以透過僅為特定函式使用的金鑰來實作最小權限。 您可以從特定 HTTP 觸發函式的 [函式金鑰] 索引標籤取得函式特定金鑰。

小提示

你也可以透過 Azure Functions Core Tools 指令func azure functionapp list-functions取得功能存取金鑰,並有這個--show-keys選項。 如需詳細資訊,請參閱 Azure Functions 核心工具參考

更新或建立存取金鑰

當更新或建立存取金鑰值時,您必須手動將更新的金鑰值重新散發給所有呼叫您函式的用戶端。

您可以使用這些 Azure Resource Manager API,以程序設計方式更新函式和主機金鑰,或建立新的金鑰:

若要了解如何呼叫 Azure Resource Manager API,請參閱 Azure REST API 參考

您可以使用這些方法來取得存取金鑰,而不需要手動建立 REST API 的呼叫。

  1. 登入 Azure 入口網站,然後搜尋並選擇功能應用程式

  2. 選取您想要使用的函式應用程式。

  3. 在左側功能表中,展開 [函式],然後選取 [應用程式金鑰]。

    [應用程式金鑰] 頁面隨即出現。 在這個頁面上,會顯示主機金鑰,你可以用它來存取應用程式中的任何功能。 系統金鑰也會顯示,讓任何系統管理員等級的人員能夠存取所有函式應用程式 API。

  4. 在你想續約的金鑰旁邊選擇 「續約」金鑰值 ,然後選擇 「續約並儲存」。

您可以從特定 HTTP 觸發函式的 [函式金鑰] 索引標籤續訂函式金鑰。

刪除存取金鑰

您可以使用這些 Azure Resource Manager API,以程式設計方式刪除函式和主機金鑰:

若要了解如何呼叫 Azure Resource Manager API,請參閱 Azure REST API 參考