管理 Azure 容器應用程式 中的機密

Azure 容器應用程式 允許你的應用程式安全地儲存敏感的設定值。 一旦祕密在應用程式層級定義,安全值即可供容器應用程式中的修訂版本使用。 此外,您還可以在級別規則內參考受保護的值。 如需有關將秘密用於 Dapr 的資訊,請參閱 Dapr 整合。

  • 秘密的範圍定義在一個應用程式,排除應用程式的任何特定修訂。
  • 新的修訂不會透過新增、移除或變更秘密來產生。
  • 每個應用程式修訂版本都可以參考一或多個秘密。
  • 多個修訂可以參考相同的機密。

更新或刪除的秘密不會自動影響您應用程式中現有的修訂。 當秘密更新或刪除時,您可以使用下列兩種方式之一回應變更:

  1. 新增修訂版本。
  2. 重新啟動現有的修訂版本。

在刪除秘密之前,請先部署不再參考舊密碼的新修訂版本。 然後停用參考秘密的所有修訂。

管理祕密的權限

Azure 容器應用程式 會為容器應用程式、作業和 Dapr 元件分別提供 listSecrets 作業。 這些操作會以純文字回傳秘密值。 這些權限只授予需要讀取秘密值的身份。

適用於 Container Apps 的數個 Azure 內建角色,會為求便利而使用萬用字元模式來定義權限。 以下範例賦予使用者透過通配符或明確 listSecrets 權限讀取秘密值的能力,即使角色名稱或描述暗示存取範圍較窄。 這份清單並非完整;在指派角色前,請先檢視目前 Azure 內建容器的角色。

以下角色可存取容器應用程式或工作秘密值:

內建角色 角色定義中的相關權限 比對密鑰作業
容器應用程式參與者 Microsoft.App/containerApps/*/action Microsoft.App/containerApps/listSecrets/action
容器應用程式操作員 Microsoft.App/containerApps/*/action Microsoft.App/containerApps/listSecrets/action
容器應用程式作業參與者 Microsoft.App/jobs/*/action Microsoft.App/jobs/listSecrets/action
容器應用程式工作操作員 Microsoft.App/jobs/*/action Microsoft.App/jobs/listSecrets/action

以下角色可存取為 DAPR 元件設定的秘密值:

內建角色 角色定義中的相關權限 機密比對作業
容器應用管理環境貢獻者 Microsoft.App/managedEnvironments/*/action Microsoft.App/managedEnvironments/daprComponents/listSecrets/action
容器應用程式 ConnectedEnvironments 參與者 Microsoft.App/connectedEnvironments/*、Microsoft.App/connectedEnvironments/daprComponents/listSecrets/action Microsoft.App/connectedEnvironments/daprComponents/listSecrets/action

實際存取權取決於角色分配的範圍。 例如,資源群組範圍內的指派會授予該資源群組中每個適用資源的匹配權限。

Important

容器 應用程式操作員 與 容器應用程式工作管理員 的職務描述強調營運任務。 然而,其萬用字元動作也會授予列出機密資訊的權限。 在指派角色之前,務必先查看完整的權限清單。

建立一個權限較窄的自訂角色

內建角色是一種便利,而非限制。 如果沒有任何內建角色符合你想要授權的權限等級,請定義一個 Azure 自訂角色,只列出你需要的操作,且省略該listSecrets動作。

例如,以下自訂角色允許使用者查看工作與執行並停止執行,但不授予該動作:listSecrets

{
  "Name": "Container Apps Jobs Execution Stopper",
  "IsCustom": true,
  "Description": "View Container Apps jobs and stop running executions.",
  "Actions": [
    "Microsoft.App/jobs/read",
    "Microsoft.App/jobs/executions/read",
    "Microsoft.App/jobs/execution/read",
    "Microsoft.App/jobs/stop/action",
    "Microsoft.App/jobs/stop/execution/action",
    "Microsoft.App/managedEnvironments/read"
  ],
  "NotActions": [],
  "AssignableScopes": [
    "/subscriptions/<SUBSCRIPTION_ID>"
  ]
}

避免在自訂角色定義中使用如 Microsoft.App/jobs/*/action 這類萬用字元模式。 此通配符賦予所有符合該模式的當前及未來操作,包括 listSecrets。

Warning

對於容器應用程式作業,如果該角色也授與 listSecrets,僅從自訂角色中省略 Microsoft.App/jobs/start/action 動作,仍不足以保護祕密值。 Jobs - Start REST API 接受一個可選的執行範本,可覆蓋主容器與初始化容器映像檔、指令及環境變數。 能夠啟動工作且知道秘密名稱的使用者,可以從他們選擇的容器中引用該秘密,並在容器中讀取其數值。 容器也可以使用任何已設定為可供其使用的受控身分識別。 將啟動工作權限視為使用該工作秘密和可用管理身份的許可。

如需詳細資訊,請參閱 Azure 自訂角色。

定義秘密

祕密定義為一組名稱/值組。 每個秘密的值會直接指定,或作為 Azure Key Vault 中儲存的秘密的參考。

注意

避免直接在生產環境中指定秘密的值。 請改為使用儲存在 Azure Key Vault 中之祕密的參考,如 在 Container Apps 區段中儲存祕密值 所述。

在容器應用程式中儲存祕密值

以下內容用於透過入口網站或不同命令列選項定義秘密。

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

  2. 在 安全性 區塊中,選擇 秘密。

  3. 選取新增。

  4. 在「新增祕密」窗格上,輸入下列資訊:

    • 名稱:祕密名稱。
    • 類型:選取「容器應用程式祕密」。
    • 值:祕密的值。
  5. 選取新增。

從 金鑰保存庫 參考秘密

當您設定一個秘密時,會建立一個連結至儲存在 Azure Key Vault 中的秘密。 容器應用程式會自動從 金鑰保存庫 取得秘密值,並將其作為秘密存在於你的容器應用程式中。

要參考 金鑰保存庫 的秘密,您必須先在您的容器應用程式中啟用管理身份,並授權該身份存取 金鑰保存庫 的秘密。

若在容器應用程式中啟用受控識別,請參閱受控識別。

若要授與 金鑰保存庫 秘密的存取權,請將 Azure RBAC 角色 金鑰保存庫 祕密使用者授與受控識別。

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

  2. 在安全性區塊中,選擇「身份」。

  3. 在 系統指派 標籤頁中,將 狀態 設定為 開啟。

注意

您也可以使用使用者指派的受控識別,此身分識別可以跨多個資源重複使用,且與應用程式生命周期無關。 若要使用它,請選取 [使用者指派] 索引 標籤,然後選擇現有的身分識別。

  1. 選取 [ 儲存 ] 以啟用系統指派的受控識別。

  2. 彈出視窗確認您想啟用系統指派的管理身份,並以 Microsoft Entra ID 註冊您的容器應用程式。 選取 [是]。

  3. 在 安全性 區塊中,選擇 秘密。

  4. 選取新增。

  5. 在「新增祕密」窗格上,輸入下列資訊:

    • 名稱:祕密名稱。
    • 類型:選擇 金鑰保存庫 參考。
    • 金鑰保存庫 秘密網址:你的秘密在 金鑰保存庫 中的 URI。 此 URI 格式如下: https://<YOUR_KEY_VAULT_NAME>.vault.azure.net/secrets/<YOUR_SECRET_NAME>/<32_DIGIT_HEX_ID>
    • 身份:選取系統指派。
  6. 選取新增。

注意

如果你使用 UDR 與 Azure 防火牆 搭配使用,你需要將 AzureKeyVault 和 login.microsoft.com FQDN 加入防火牆的允許清單。 請參考 配置 UDR,Azure 防火牆 來決定你需要哪些額外的服務標籤。

金鑰保存庫 祕密 URI 和祕密輪替

金鑰保存庫 的秘密 URI 必須採用以下格式之一:

  • https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931:參考密鑰的特定版本。
  • https://myvault.vault.azure.net/secrets/mysecret:參考祕密的最新版本。

若未在 URI 中指定版本,則應用程式會使用金鑰保存庫中的現有最新版本。 當較新版本可用時,應用程式會在 30 分鐘內自動擷取最新版本。 任何在環境變數中參考該祕密的作用中修訂版本,都會自動重新啟動以擷取新值。

若要完整控制使用哪一個祕密版本,請在 URI 中指定版本。

在環境變數中引用祕密

在應用程式層級宣告祕密之後 (如定義祕密一節中所述),您可以在容器應用程式中建立新的修訂時,於環境變數中參考這些祕密。 當環境變數參考秘密時,其值會以秘密中定義的值填入。

範例

以下範例展示了一個在應用程式層級宣告連接字串的應用程式。 此連線會在容器環境變數以及調整規則中被引用。

已在容器應用程式中定義祕密之後,便可在建立新的修訂時在環境變數中予以參考。

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

  2. 在 [ 應用程式] 區段下,選取 [修訂和複本]。

  3. 在 [ 修訂和複本] 頁面中,選取 [ 建立新修訂]。

  4. 在 [建立及部署新的修訂] 頁面的 [容器] 標籤中,在 容器映像檔 區段下,選取一個容器。

  5. 選取編輯。

  6. 在 [ 編輯容器 內容] 窗格中,選取 [ 環境變數 ] 索引標籤。

  7. 選取新增。

  8. 輸入下列資訊:

    • 名稱:環境變數的名稱。
    • 來源:選取參考機密。
    • 值:選取您先前定義的秘密。
  9. 選取儲存。

  10. 在 [ 建立及部署新的修訂 ] 頁面中,選取 [建立 ] 以建立新的修訂。

在磁碟區中掛接祕密

如 定義祕密一節所述,在應用程式層級宣告祕密之後,您可以在容器應用程式中建立新修訂版本時,於磁碟區掛接中參考這些祕密。 當您將敏感資訊掛接到一個卷中時,每個敏感資訊都會掛接為該卷中的一個檔案。 檔名是祕密的名稱,而檔案內容則是祕密值。 您可以在磁碟區掛接中載入所有祕密,也可以載入特定祕密。

範例

在容器應用程式中定義祕密後,可於建立新的修訂版本時在卷掛載中引用該祕密。

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

  2. 在 [ 應用程式] 區段下,選取 [修訂和複本]。

  3. 在 [ 修訂和複本] 頁面中,選取 [ 建立新修訂]。

  4. 在 [建立及部署新的修訂] 頁面的 [容器] 標籤中,在 容器映像檔 區段下,選取一個容器。

  5. 選取編輯。

  6. 在 [編輯容器] 內容窗格中,選取 [磁碟區掛接] 索引標籤。

  7. 選取「建立新磁碟區」。

  8. 在 新增磁碟區 環境面板中,輸入下列資訊:

    • 磁碟區類型:選取 Secret。
    • 名稱:mysecrets
    • 掛載所有秘密資訊:已啟用

    注意

    如果您想要載入特定祕密,請停用掛接所有祕密,然後選取您想要載入的祕密。

  9. 選取新增。

  10. 在 [編輯容器內容] 窗格中的 [磁碟區名稱] 下,選取 mysecrets。

  11. 在掛接路徑底下,輸入 /mnt/secrets。

  12. 選取儲存。

  13. 在建立及部署新的修訂頁面中,選取 建立以建立具有磁碟區掛接的新修訂。

疑難排解金鑰保管庫的引用

當你存取 Azure Key Vault 的機密資料時,可能會在擷取或同步過程中遇到問題。 以下是常見的錯誤與解決方法:

錯誤 原因 Resolution
未啟用管理身份 容器應用程式沒有指派受管理身份。 在您的容器應用程式中啟用系統指派或使用者指派的管理身份。 請參閱<受控識別>(機器翻譯)。
身份未找到 指定的管理身份不存在,或是沒有指派給容器應用程式。 在 身份 區塊中確認身份是否已建立並指派到容器應用程式。
金鑰保存庫 中的機密被停用 該秘密在 金鑰保存庫 資源中被停用。 到你的 Azure Portal 裡的 金鑰保存庫 並啟用這個密鑰。
認證失敗 受管理身份缺乏讀取秘密所需的權限。 將金鑰保存庫機密使用者角色授予您的金鑰保存庫上的受控身份。 請參見 金鑰保存庫 Secrets User。
RBAC 申請被拒 管理身份權限不足以存取 金鑰保存庫。 確認 金鑰保存庫 上的 RBAC 角色指派,並確保其中包含對機密的讀取權限。

下一步