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 使用,但請使用預設的存取金鑰產生流程。
函式產生的存取金鑰包含特殊簽章和總和檢查碼值,指出存取金鑰的類型,以及 Azure Functions 所產生的存取金鑰。 這些額外的金鑰元件,使得在安全掃描及其他自動化流程中更容易確定這類秘密的來源。
要讓函式產生你的鍵,請不要提供任何可用於產生鍵的 API 鍵 value 。
存取金鑰的儲存
你在 Azure 中的函式應用程式會儲存金鑰並在靜態時加密它們。 預設情況下,該 AzureWebJobsStorage 設定會將金鑰儲存在所提供帳號的 Blob 儲存容器中。 使用 AzureWebJobsSecretStorageType 設定來覆寫此預設行為,並將金鑰儲存在下列其中一個替代位置:
這很重要
存取金鑰是你應用程式秘密儲存庫的一部分,有自己的生命週期,與它所保護的功能無關。 刪除函式不會刪除或輪替祕密儲存區中儲存的金鑰。 由於金鑰的儲存位置是從應用程式名稱推導而來,因此用同名重建函式會重複使用先前儲存的金鑰,而不是產生新的金鑰。 此行為適用於所有秘密儲存提供者,包括 Blob 儲存與 金鑰保存庫。 刪除並重建函式並不能取代金鑰輪換:當憑證被揭露或移除他人存取權時,若要撤銷金鑰,必須明確地輪換或刪除該金鑰,詳見「 續期或建立存取金鑰」。
| 地點 | 值 | 描述 |
|---|---|---|
| 次要儲存體帳戶 | blob |
將鍵存放在 Blob 儲存空間,儲存帳號與 Functions 執行時使用的帳號不同。 使用的特定帳戶和容器是由設定中 AzureWebJobsSecretStorageSas 設定的共用存取簽章 (SAS) URL 所定義。 當 SAS URL 變更時,您必須維護 AzureWebJobsSecretStorageSas 設定。 |
| Azure 金鑰保存庫 | keyvault |
將金鑰儲存在 AzureWebJobsSecretStorageKeyVaultUri 中設定的金鑰保存庫內。 |
| 檔案系統 | files |
金鑰會持久化在本地檔案系統中。 不建議使用檔案系統儲存體。 |
| 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。
登入 Azure 入口網站,然後搜尋並選擇功能應用程式。
選取您想要使用的函式應用程式。
在左側功能表中,展開 [函式],然後選取 [應用程式金鑰]。
[應用程式金鑰] 頁面隨即出現。 在這個頁面上,會顯示主機金鑰,你可以用它來存取應用程式中的任何功能。 系統金鑰也會顯示,讓任何系統管理員等級的人員能夠存取所有函式應用程式 API。
您也可以透過僅為特定函式使用的金鑰來實作最小權限。 您可以從特定 HTTP 觸發函式的 [函式金鑰] 索引標籤取得函式特定金鑰。
小提示
你也可以使用 Azure Functions Core Tools 命令 func azure functionapp list-functions 搭配 --show-keys 選項,取得函式的存取金鑰。 如需詳細資訊,請參閱 Azure Functions 核心工具參考。
更新或建立存取金鑰
當更新或建立存取金鑰值時,您必須手動將更新的金鑰值重新散發給所有呼叫您函式的用戶端。
這很重要
將主金鑰_master()視為管理憑證。 它賦予你的應用程式管理層資料面存取權——包括在具備可寫檔案系統的應用程式中,能部署並透過執行時的 REST API 執行程式碼——因此請只與受信任的管理員分享,而非一般呼叫者。 主機金鑰不是管理性的,但每個金鑰都授權呼叫應用程式中的任何函式,所以也要小心分配。
當憑證被揭露,或需要撤銷某方存取權時,請明確輪換受影響的金鑰。 旋轉單一鑰匙即可撤銷該鑰匙。 如同存取 金鑰儲存中所述,刪除或重建函式不會旋轉儲存的金鑰。
您可以使用這些 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 參考。