Azure Container Apps 中的受控識別
本文內容
來自 Microsoft Entra 識別碼的受控識別可讓您的容器應用程式存取其他受 Microsoft Entra 保護的資源。 如需 Microsoft Entra ID 中受控識別的詳細資訊,請參閱 Azure 資源的 受控識別。
您的容器應用程式可以被授與兩種類型的識別:
系統指派的身 分識別會系結至您的容器應用程式,並在刪除容器應用程式時刪除。 應用程式只能有一個系統指派的身分識別。
使用者指派的身 分識別是獨立的 Azure 資源,可指派給您的容器應用程式和其他資源。 容器應用程式可以具有多個使用者指派的識別。 該識別會持續存在直到您將其刪除為止。
為什麼要使用受控識別?
您可以在執行中的容器應用程式中使用受控識別,向任何 支援 Microsoft Entra 驗證的服務進行驗證 。
使用受控識別:
常見使用案例
系統指派的識別最適合下列類型的工作負載:
使用者指派的識別非常適合下列類型的工作負載:
在多個資源上執行且可共用單一識別
需要對安全資源進行預先授權
限制
不支援在調整規則中使用受控識別。 您仍然需要在調整規則的 中包含 secretRef
連接字串 或索引鍵。
Init 容器 無法存取受控識別。
您可以透過下列方式來設定您的受控識別:
Azure 入口網站
Azure CLI
您的 Azure Resource Manager (ARM) 樣本
在執行中的容器應用程式上新增、刪除或修改受控識別時,應用程式不會自動重新啟動,也不會建立新的修訂版本。
注意
將受控識別新增至 2022 年 4 月 11 日之前部署的容器應用程式時,您必須建立新的修訂。
新增系統指派的身分識別
在容器應用程式頁面的左側導覽中,向下捲動至 設定 群組。
選取 [身分識別]。
在 [系統指派] 索引 標籤內,將 [狀態] 切換 為 [開啟 ]。 選取 [儲存]。
az containerapp identity assign
執行 命令以建立系統指派的身分識別:
az containerapp identity assign --name myApp --resource-group myResourceGroup --system-assigned
ARM 樣本可用來自動部署容器應用程式和資源。 若要新增系統指派的身分識別,請將區 identity
段新增至ARM範本。
"identity": {
"type": "SystemAssigned"
}
新增系統指派的類型會告知 Azure 建立和管理應用程式的身分識別。 如需完整的 ARM 範例,請參閱 ARM API 規格 。
某些 Azure CLI 命令,包括 az containerapp create
和 az containerapp job create
,支援 YAML 檔案以供輸入。 若要新增系統指派的身分識別,請將 區 identity
段新增至您的 YAML 檔案。
identity:
type: SystemAssigned
新增系統指派的類型會告知 Azure 建立和管理應用程式的身分識別。 如需完整的 YAML 範例,請參閱 ARM API 規格 。
新增使用者指派的身分識別
透過使用者指派的識別來設定容器應用程式時會要求您先建立識別,然後再將其資源識別碼新增至您的容器應用程式的組態。 您可以透過 Azure 入口網站 或 Azure CLI 建立使用者指派的身分識別。 如需建立和管理使用者指派身分識別的資訊,請參閱 管理使用者指派的受控識別 。
首先,您必須建立使用者指派的身分識別資源。
根據管理使用者指派的受控識別中的 步驟,建立使用者指派的受控識別 資源。
在容器應用程式頁面的左側導覽中,向下捲動至 設定 群組。
選取 [身分識別]。
在 [ 使用者指派] 索引 標籤內,選取 [ 新增 ]。
搜尋您稍早建立的身分識別,然後加以選取。 選取新增 。
建立使用者指派的身分識別。
az identity create --resource-group <GROUP_NAME> --name <IDENTITY_NAME> --output json
id
請注意新身分識別的屬性。
az containerapp identity assign
執行 命令,將身分識別指派給應用程式。 身分識別參數是空格分隔清單。
az containerapp identity assign --resource-group <GROUP_NAME> --name <APP_NAME> \
--user-assigned <IDENTITY_RESOURCE_ID>
將取代 <IDENTITY_RESOURCE_ID>
為 id
身分識別的屬性。 若要指派多個使用者指派的身分識別,請將以空格分隔的身分識別標識符清單提供給 --user-assigned
參數。
若要新增一或多個使用者指派的身分識別,請將區 identity
段新增至您的ARM範本。 將和 <IDENTITY2_RESOURCE_ID>
取代<IDENTITY1_RESOURCE_ID>
為您想要新增之身分識別的資源識別碼。
將專案新增至具有身分識別的資源標識碼做為索引鍵的物件, userAssignedIdentities
以指定每個使用者指派的身分識別。 使用空白物件做為值。
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<IDENTITY1_RESOURCE_ID>": {},
"<IDENTITY2_RESOURCE_ID>": {}
}
}
如需完整的 ARM 範例,請參閱 ARM API 規格 。
注意
應用程式可以同時擁有系統指派和使用者指派的身分識別。 在這裡情況下,type 屬性會是 SystemAssigned,UserAssigned
。
若要新增一或多個使用者指派的身分識別,請將區 identity
段新增至您的 YAML 組態檔。 將和 <IDENTITY2_RESOURCE_ID>
取代<IDENTITY1_RESOURCE_ID>
為您想要新增之身分識別的資源識別碼。
將專案新增至具有身分識別的資源標識碼做為索引鍵的物件, userAssignedIdentities
以指定每個使用者指派的身分識別。 使用空白物件做為值。
identity:
type: UserAssigned
userAssignedIdentities:
<IDENTITY1_RESOURCE_ID>: {}
<IDENTITY2_RESOURCE_ID>: {}
如需完整的 YAML 範例,請參閱 ARM API 規格 。
注意
應用程式可以同時擁有系統指派和使用者指派的身分識別。 在這裡情況下,type 屬性會是 SystemAssigned,UserAssigned
。
針對某些資源,您必須為應用程式的受控識別設定角色指派,以授與存取權。 否則,即使您針對該身分識別使用有效的令牌,仍會拒絕從您的應用程式呼叫服務,例如 Azure 金鑰保存庫 和 Azure SQL 資料庫。 若要深入瞭解 Azure 角色型訪問控制(Azure RBAC),請參閱 什麼是 RBAC? 。 若要深入瞭解哪些資源支援 Microsoft Entra 令牌,請參閱 支援 Microsoft Entra 驗證 的 Azure 服務。
重要
受控識別的後端服務大約 24 小時會維護每個資源 URI 的快取。 如果您更新特定目標資源的存取原則,並立即擷取該資源的令牌,您可以繼續取得具有過期許可權的快取令牌,直到該令牌到期為止。 目前無法強制重新整理令牌。
在應用程式程式代碼中 連線 至 Azure 服務
透過受控識別,應用程式可以取得令牌來存取使用 Microsoft Entra 識別碼的 Azure 資源,例如 Azure SQL 資料庫、Azure 金鑰保存庫 和 Azure 儲存體。 這些令牌代表存取資源的應用程式,而不是應用程式的任何特定使用者。
Container Apps 提供可內部存取 的 REST 端點 來擷取令牌。 您可以使用標準 HTTP GET 從應用程式記憶體取 REST 端點,此端點可以使用每種語言的一般 HTTP 用戶端來實作。 針對 .NET、JavaScript、Java 和 Python,Azure 身分識別客戶端連結庫會針對此 REST 端點提供抽象概念。 連線 至其他 Azure 服務,就像將認證物件新增至服務特定客戶端一樣簡單。
注意
使用 Azure 身分識別用戶端連結庫時,必須指定使用者指派的受控識別用戶端識別碼。
針對 .NET 應用程式,使用受控識別最簡單的方式是透過適用於 .NET 的 Azure 身分識別客戶端連結庫。 如需詳細資訊,請參閱客戶端連結庫的個別文件標題:
連結的範例會使用 DefaultAzureCredential
。 這適用於大部分案例,因為相同的模式適用於 Azure(使用受控識別)和本機計算機上(不含受控識別)。
對於 Node.js 應用程式,使用受控識別最簡單的方式是透過適用於 JavaScript 的 Azure 身分識別用戶端連結庫。 如需詳細資訊,請參閱客戶端連結庫的個別文件標題:
連結的範例會使用 DefaultAzureCredential
。 這適用於大部分案例,因為相同的模式適用於 Azure(使用受控識別)和本機計算機上(不含受控識別)。
如需適用於 JavaScript 的 Azure 身分識別客戶端連結庫更多程式碼範例,請參閱 Azure 身分識別範例 。
對於 Python 應用程式,使用受控識別最簡單的方式是透過適用於 Python 的 Azure 身分識別客戶端連結庫。 如需詳細資訊,請參閱客戶端連結庫的個別文件標題:
連結的範例會使用 DefaultAzureCredential
。 這適用於大部分案例,因為相同的模式適用於 Azure(使用受控識別)和本機計算機上(不含受控識別)。
針對 Java 應用程式和函式,使用受控識別最簡單的方式是透過適用於 Java 的 Azure 身分識別用戶端連結庫。 如需詳細資訊,請參閱客戶端連結庫的個別文件標題:
連結的範例會使用 DefaultAzureCredential
。 這適用於大部分案例,因為相同的模式適用於 Azure(使用受控識別)和本機計算機上(不含受控識別)。
如需適用於 Java 的 Azure 身分識別用戶端連結庫更多程式碼範例,請參閱 Azure 身分識別範例 。
使用下列腳本,藉由指定 Azure 服務的資源 URI,從本機端點擷取令牌。 將佔位元取代為資源 URI 以取得令牌。
$resourceURI = "https://<AAD-resource-URI>"
$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&api-version=2019-08-01"
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI
$accessToken = $tokenResponse.access_token
原始 HTTP GET 要求看起來像下列範例。
從 IDENTITY_ENDPOINT
環境變數取得令牌端點 URL。 x-identity-header
包含儲存在環境變數中的 IDENTITY_HEADER
GUID。
GET http://localhost:42356/msi/token?resource=https://vault.azure.net&api-version=2019-08-01 HTTP/1.1
x-identity-header: 853b9a84-5bfa-4b22-a3f3-0b9a43d9ad8a
回應看起來可能像下列範例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJ0eXAi…",
"expires_on": "1586984735",
"resource": "https://vault.azure.net",
"token_type": "Bearer",
"client_id": "5E29463D-71DA-4FE0-8E69-999B57DB23B0"
}
此回應與 Microsoft Entra 服務對服務存取令牌要求的 回應相同。 若要存取 金鑰保存庫,您接著會將 的值access_token
新增至與保存庫的用戶端連線。
REST 端點參考
具有受控識別的容器應用程式會藉由定義兩個環境變數來公開身分識別端點:
IDENTITY_ENDPOINT
- 容器應用程式可從中要求令牌的本機 URL。
IDENTITY_HEADER
- 用來協助減輕伺服器端偽造要求 (SSRF) 攻擊的標頭。 值會由平台旋轉。
若要取得資源的令牌,請對端點提出 HTTP GET 要求,包括下列參數:
參數名稱
In
描述
resource
查詢
應取得令牌之資源的 Microsoft Entra 資源 URI。 資源可以是支援 Microsoft Entra 驗證或任何其他資源 URI 的 Azure 服務之一。
api-version
查詢
要使用的令牌 API 版本。 使用 “2019-08-01” 或更新版本。
X-IDENTITY-HEADER
頁首
環境變數的值 IDENTITY_HEADER
。 此標頭可降低伺服器端偽造要求 (SSRF) 攻擊的風險。
client_id
查詢
(選擇性)要使用的使用者指派身分識別的用戶端標識碼。 無法在包含 principal_id
、 mi_res_id
或 object_id
的要求上使用。 如果省略所有標識子參數 (client_id
、 principal_id
object_id
和 mi_res_id
) ,則會使用系統指派的身分識別。
principal_id
查詢
(選擇性)要使用的使用者指派身分識別主體標識碼。 object_id
是可以改用的別名。 無法在包含client_id、mi_res_id或object_id的要求上使用。 如果省略所有標識子參數 (client_id
、 principal_id
object_id
和 mi_res_id
) ,則會使用系統指派的身分識別。
mi_res_id
查詢
(選擇性)要使用的使用者指派身分識別的 Azure 資源識別碼。 無法在包含 principal_id
、 client_id
或 object_id
的要求上使用。 如果省略所有標識子參數 (client_id
、 principal_id
object_id
和 mi_res_id
) ,則會使用系統指派的身分識別。
重要
如果您嘗試取得使用者指派身分識別的令牌,您必須包含其中一個選擇性屬性。 否則,令牌服務會嘗試取得系統指派身分識別的令牌,這可能或可能不存在。
檢視受控識別
您可以使用下列 Azure CLI 命令來顯示系統指派和使用者指派的受控識別。 輸出會顯示指派給容器應用程式之所有受控識別的受控識別類型、租用戶標識碼和主體標識碼。
az containerapp identity show --name <APP_NAME> --resource-group <GROUP_NAME>
拿掉受控識別
當您移除系統指派的身分識別時,會從 Microsoft Entra ID 中刪除。 當您刪除容器應用程式資源本身時,系統指派的身分識別也會從 Microsoft Entra ID 自動移除。 從容器應用程式移除使用者指派的受控識別並不會從 Microsoft Entra 識別碼中移除它們。
在應用程式的頁面左側導覽中,向下捲動至 設定 群組。
選取 [身分識別]。 然後根據身分識別類型遵循步驟:
系統指派的身 分識別:在 [系統指派 ] 索引標籤內,將 [狀態] 切換 為 [關閉 ]。 選取 [儲存]。
使用者指派的身 分識別:選取 [ 使用者指派 ] 索引卷標,選取身分識別的複選框,然後選取 [ 移除 ]。 選取是 以確認。
若要移除系統指派的身分識別:
az containerapp identity remove --name <APP_NAME> --resource-group <GROUP_NAME> --system-assigned
若要移除一或多個使用者指派的身分識別:
az containerapp identity remove --name <APP_NAME> --resource-group <GROUP_NAME> \
--user-assigned <IDENTITY1_RESOURCE_ID> <IDENTITY2_RESOURCE_ID>
若要移除所有使用者指派的身分識別:
az containerapp identity remove --name <APP_NAME> --resource-group <GROUP_NAME> \
--user-assigned <IDENTITY1_RESOURCE_ID> <IDENTITY2_RESOURCE_ID>
若要移除所有身分識別,請將容器應用程式的身分識別設定 type
為 None
ARM 範本中的 :
"identity": {
"type": "None"
}
若要移除所有身分識別,請將容器應用程式的身分識別設定 type
為 None
YAML 組態檔中的 :
identity:
type: None
下一步