在 Azure 容器應用程式 上配置 Functions 主機金鑰儲存

函式 存取金鑰 是函數執行時用來保護 HTTP 觸發端點的認證憑證。 當呼叫者呼叫 HTTP 函式時,會包含一個金鑰作為 ?code= 查詢參數或 x-functions-key 標頭。 執行時會驗證金鑰並授權或拒絕請求。

存取金鑰和 應用程式層級的秘密不一樣。 存取金鑰保護 誰可以呼叫你的函式,而應用程式層級的祕密則保護 你函式所連接的對象

何時使用存取鍵

劇本 為什麼存取金鑰合適
第三方 webhook 像 GitHub、Stripe 或 Twilio 這類服務提供者會透過 URL 和 secret 呼叫你的函式。 存取金鑰會直接插入呼叫者預期的 ?code= 模式。
服務對服務通話 後端服務 A 透過 HTTP 呼叫函式 B。 使用共用金鑰比起為僅限內部使用的呼叫設定 Microsoft Entra 應用程式註冊更簡單。
事件網格訂閱 Event Grid 會用平台自動管理的 系統金鑰 驗證並呼叫你的函式端點。
開發/測試認證 開發過程中你需要基本的認證,但不需要設定完整的 OAuth/OIDC。 存取金鑰提供低摩擦的認證閘門,無需身份設定。
遷移相容性 現有的 Azure Functions 應用程式已經使用存取金鑰。 移轉至 Container Apps 時,您需要相同的金鑰型驗證,以避免造成呼叫者中斷。

Note

對於面向使用者的 API、零信任工作負載或每使用者授權情境,請使用 Microsoft Entra ID / OAuth 2.0 取代存取金鑰。 存取金鑰是共享的秘密,沒有身份層級的稽核紀錄。

先決條件

存取金鑰類型

Functions 執行時管理四種類型的鍵:

鍵類型 Scope Purpose
主鑰匙_master 整個函式應用程式 管理員層級存取所有功能與 /admin/* 管理端點。 不能被撤銷,只能輪替。
主機金鑰default +自訂) 整個函式應用程式 授權呼叫應用程式中任何 HTTP 觸發函式。
功能鍵default +自訂) 單一函數 授權對單一特定函式的呼叫。 提供比主機金鑰更細緻的控制。
系統金鑰 擴展端點 供事件方格 Webhook 訂用帳戶和 Durable Functions 等平台擴充功能使用。 自動管理。

選擇儲存後端

設定環境 AzureWebJobsSecretStorageType 變數控制執行時存取金鑰的持久位置。 Azure 容器應用程式 支援三個生產級後端。

後端 設定值 自動產生金鑰 外部依賴 最適合用於
Container Apps secret store containerapps 否 - 您將金鑰佈建為 Container Apps 祕密 None 大多數工作負載(建議)
Azure Key Vault keyvault 否 - 手動建立觸發器 金鑰保存庫 實例 集中治理與合規稽核
Azure Blob 儲存體 blob 是的 記憶體帳戶 舊有應用程式或現有 AzureWebJobsStorage 帳號

請牢記以下後端考量:

  • 執行時不會自動選擇容器應用程式的秘密儲存。 如果你沒有設定AzureWebJobsSecretStorageType或設定為無法辨識的值,Functions 主機會在可用時AzureWebJobsStorage使用 Blob 儲存體。
  • 保持 AzureWebJobsStorage 設定以進行儲存健康檢查及依賴儲存的功能。
  • 不要設定 AzureWebJobsSecretStorageTypefiles。 容器應用程式檔案系統是短暫的,因此當應用程式縮減到零、重啟或部署新版本時,後端儲存的金鑰會遺失。

秘密名稱模式

儲存金鑰的命名規則取決於儲存後端。

容器應用程式的秘密儲存庫則採用不同的慣例。 Functions 主機會從 /run/secrets/functions-keys/ 的磁碟區掛接檔案讀取金鑰。 每個檔案使用 虛點 名稱(例如 host.master),但容器應用程式的秘密名稱僅允許 使用小寫字母數字和破折號。 當你掛載秘密磁碟區時,必須將 path 欄位明確設為函式主機期望的點分檔案名稱(例如 secretRef: host-masterpath: host.master)。 平台不會自動進行姓名轉換。

鍵類型 容器應用程式機密名稱(破折號) 磁碟區掛接 path (點)
主鑰匙 host-master host.master
預設主機金鑰 host-function-default host.function.default
自訂主機金鑰 host-function-<name> host.function.<name>
特定函式的預設函式鍵 functions-<functionname>-default functions.<functionName>.default
特定函數的自訂函式鍵 functions-<functionname>-<keyname> functions.<functionName>.<keyName>
系統金鑰 host-systemkey-<extension> host.systemKey.<extension>

小提示

在排除故障時,請在後端儲存庫中搜尋這些模式,以確認金鑰是否正確設定。

設定容器應用程式秘密儲存庫

Container Apps 的秘密儲存庫是推薦的後端。 金鑰會保留在容器應用程式平台內,無需使用外部儲存空間或 金鑰保存庫。 Azure Resource Manager 的活動日誌會追蹤秘密和環境變數的變更。

使用此後端時,Functions 主機會從磁碟區掛接於 /run/secrets/functions-keys/ 的檔案讀取金鑰。 主機 不會自動產生金鑰。 你必須將每個金鑰建立為容器應用程式的秘密,平台會掛載它們作為檔案讓主機讀取。

Important

容器應用程式的秘密儲存庫 從主機的角度來看是唯讀的。 主機會讀取已掛載的金鑰檔案,但從不寫入。 如果缺少某個必需的金鑰,主機不會自動生成。

步驟 1:設定儲存類型

  1. 請進入 Azure 入口網站 的 Functions 容器應用程式。

  2. 設定中,選擇 環境變數

  3. 選擇 新增,並輸入以下數值:

    Property 價值
    Name AzureWebJobsSecretStorageType
    價值 containerapps
  4. 選擇 儲存,然後選擇 套用 以確認變更。

步驟 2:產生並儲存存取權密鑰

產生金鑰值並儲存為容器應用程式的機密資訊。 至少你需要主 金鑰預設主機金鑰

  1. 在你的 Functions 容器應用程式中,在 設定中選擇 秘密

  2. 選擇 新增 並輸入以下數值:

    Property 價值
    Name host-master
    Type 容器應用程序密鑰
    價值 一個隨機產生的鍵值。
  3. 選取 ,然後新增

  4. host-function-default 重複,並用另一個隨機產生的值。

  5. 若要新增每個函式金鑰,請新增名為 functions-<functionname>-default 的祕密 (全部小寫)。

Note

容器應用程式的秘密名稱僅允許使用小寫字母、數字和破折號。 你必須在磁碟區設定中明確將欄位設 path 為函式主機期望的虛線檔名(例如, secretRef: host-masterpath: host.master)。 如果沒有明確的 path,磁碟上的檔案會保留含破折號的名稱,且 Functions 主機將找不到金鑰。

步驟 3:設定磁碟區掛載

將祕密掛接為 /run/secrets/functions-keys/ 中的檔案。

  1. 在你的 Functions 容器應用程式中,在應用程式的 選項中,選擇 修訂版與複本

  2. 選取 [建立新修訂]

  3. 「縮放與體積」 標籤中,在 「體積」下,選擇 「新增」。

  4. 輸入下列值:

    Property 價值
    磁碟區類型 祕密
    Name functions-keys
  5. 對於每個機密,將 Path 欄位設為函式主機所預期的點分隔的檔案名稱(例如,將 host-master 設為路徑 host.master,將 host-function-default 設為路徑 host.function.default)。

  6. 選取 ,然後新增

  7. 容器 標籤中,選擇你的容器,然後選擇 編輯

  8. 選擇 「磁碟掛載 」標籤,然後選擇 「新增」。

  9. 輸入下列值:

    Property 價值
    磁碟區名稱 functions-keys
    裝載路徑 /run/secrets/functions-keys
  10. 選擇 儲存,然後選擇 建立 來部署新的版本。

步驟四:驗證

應用程式重新啟動後,請確認按鍵是否正常:

az containerapp function keys list \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-type hostKey

你也可以查看應用程式日誌中的訊息 Resolved secret storage provider ContainerAppsSecretsRepository,確認主機正在使用 Container Apps 的秘密儲存庫。

旋轉鍵

要旋轉金鑰,請更新容器應用程式的秘密並重新啟動應用程式:

NEW_KEY=$(openssl rand -hex 32)

az containerapp secret set \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --secrets "host-function-default=$NEW_KEY"

az containerapp revision restart \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --revision "<REVISION_NAME>"

Note

所有複製品共享相同的掛載秘密。 重新啟動後,每個副本都會擷取更新的鍵值。

將 金鑰保存庫 或 Blob 儲存體 設定為儲存

金鑰保存庫 後端將存取金鑰儲存為 金鑰保存庫 機密,提供企業級稽核與存取控制。

  1. 建立一個 金鑰保存庫(如果你還沒有):

    az keyvault create \
      --name "<KEYVAULT_NAME>" \
      --resource-group "<RESOURCE_GROUP>" \
      --location "<LOCATION>"
    
  2. 在您的容器應用程式中啟用管理身份(如果尚未啟用):

    az containerapp identity assign \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --system-assigned
    
  3. 金鑰保存庫 秘密員角色指派給受控識別。 執行時需要讀寫權限來建立和管理金鑰:

    PRINCIPAL_ID=$(az containerapp show \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --query identity.principalId \
      --output tsv)
    
    KEYVAULT_ID=$(az keyvault show \
      --name "<KEYVAULT_NAME>" \
      --query id \
      --output tsv)
    
    az role assignment create \
      --role "Key Vault Secrets Officer" \
      --assignee "$PRINCIPAL_ID" \
      --scope "$KEYVAULT_ID"
    
  4. 設定儲存類型與 金鑰保存庫 URI:

    針對系統指派的身分識別:

    az containerapp update \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --set-env-vars \
        "AzureWebJobsSecretStorageType=keyvault" \
        "AzureWebJobsSecretStorageKeyVaultUri=https://<KEYVAULT_NAME>.vault.azure.net"
    

    對於使用者指派的身份,也可以設定用戶端 ID:

    az containerapp update \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --set-env-vars \
        "AzureWebJobsSecretStorageType=keyvault" \
        "AzureWebJobsSecretStorageKeyVaultUri=https://<KEYVAULT_NAME>.vault.azure.net" \
        "AzureWebJobsSecretStorageKeyVaultClientId=<USER_ASSIGNED_IDENTITY_CLIENT_ID>"
    
  5. 透過列出金鑰來觸發金鑰的建立:

    az containerapp function keys list \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-type hostKey
    

管理存取金鑰

無論後端為何,請使用以下指令來列出、建立及刪除存取金鑰:

Note

至少要維持一個副本在運作,以執行這些金鑰管理操作。

  • 列出所有主機金鑰:

    az containerapp function keys list \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-type hostKey
    
  • 列出主鑰匙:

    az containerapp function keys list \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-type masterKey
    
  • 建立或覆寫自訂主機金鑰:

    az containerapp function keys set \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-name "MyCustomKey" \
      --key-value "<YOUR_KEY_VALUE>" \
      --key-type hostKey
    
  • 顯示一個特定的鍵:

    az containerapp function keys show \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-name "<KEY_NAME>" \
      --key-type hostKey
    
  • 刪除主機金鑰:

    az containerapp function keys delete \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-name "MyCustomKey" \
      --key-type hostKey
    

呼叫一個帶有存取金鑰的函式

將金鑰作為查詢參數或請求標頭傳遞。

# Query parameter
curl "https://<FUNCTIONS_APP_URL>/api/<FUNCTION_NAME>?code=<HOST_KEY>"

# Header
curl "https://<FUNCTIONS_APP_URL>/api/<FUNCTION_NAME>" \
  -H "x-functions-key: <HOST_KEY>"