Azure 容器應用程式中的受控身分識別
在此文章
Microsoft Entra ID 的受控識別可讓您的容器應用程式輕鬆存取其他受 Microsoft Entra 保護的資源。 如需有關 Microsoft Entra ID 受控身分識別的詳細資訊,請參閱適用於 Azure 資源的受控識別 (部分機器翻譯)。
您的容器應用程式可以被授與兩種類型的識別:
系統指派的身分識別 會繫結至您的容器應用程式,如果您的應用程式已刪除,則將隨之刪除。 應用程式只能有一個系統指派的身分識別。
使用者指派的身 分識別是獨立的 Azure 資源,您可以指派給容器應用程式和其他資源。 容器應用程式可以具有多個使用者指派的識別。 使用者指派的身分識別存在,直到您刪除它們為止。
為什麼要使用受控識別?
您可以使用執行中容器應用程式中的受控身分識別,向任何支援 Microsoft Entra 驗證的服務 進行驗證。
使用受控識別:
常見使用案例
系統指派的識別最適合下列類型的工作負載:
使用者指派的識別非常適合下列類型的工作負載:
在多個資源上執行且可共用單一識別
需要對安全資源進行預先授權
限制
不支援調整規則中的受控識別。 您必須在調整規則的 中包含 secretRef
連接字串 或索引鍵。
Init 容器 無法存取受控識別。
您可以透過下列方式來設定您的受控識別:
Azure 入口網站
Azure CLI
Azure Resource Manager (ARM) 範本
在執行中的容器應用程式上新增、刪除或修改受控識別時,應用程式不會自動重新啟動,也不會建立新的修訂版本。
注意
當將受控身分識別新增至 2022 年 4 月 11 日之前部署的容器應用程式時,您必須建立新的修訂版本。
新增系統指派的身分識別
前往 Azure 入口網站的容器應用程式。
從 [ 設定] 群組中,選取 [ 身分 識別]。
在 [系統指派] 索引標籤內,將 [狀態] 切換為 [開啟] 。
選取 [儲存]。
執行 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 來建立使用者指派的身分識別。 如需建立和管理使用者指派的身分識別相關資訊,請參閱管理使用者指派的受控身分識別 。
首先,您必須建立使用者指派的身分識別資源。
根據管理使用者指派的受控身分識別 中找到的步驟,建立使用者指派的受控身分識別資源。
前往 Azure 入口網站的容器應用程式。
從 [ 設定] 群組中,選取 [ 身分 識別]。
在 [使用者指派 ] 索引標籤內,選取 [新增 ]。
搜尋並選取您稍早建立的身分識別。
選取 [新增]。
建立使用者指派的身分識別。
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 範本。 將 <IDENTITY1_RESOURCE_ID>
和 <IDENTITY2_RESOURCE_ID>
取代為所要新增身分識別的資源識別碼。
藉由將項目新增至具有身分識別資源識別碼的 userAssignedIdentities
物件作為金鑰,以指定每個使用者指派的身分識別。 使用空白物件作為值。
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<IDENTITY1_RESOURCE_ID>": {},
"<IDENTITY2_RESOURCE_ID>": {}
}
}
如需完整的 ARM 範本範例,請參閱 ARM API 規格 。
注意
應用程式可以同時具有系統指派的身分識別和使用者指派的身分識別。 在這裡情況下,屬性的值 type
會是 SystemAssigned,UserAssigned
。
若要新增一或多個使用者指派的身分識別,請將 identity
區段新增至 YAML 組態檔案。 將 <IDENTITY1_RESOURCE_ID>
和 <IDENTITY2_RESOURCE_ID>
取代為所要新增身分識別的資源識別碼。
藉由將項目新增至具有身分識別資源識別碼的 userAssignedIdentities
物件作為金鑰,以指定每個使用者指派的身分識別。 使用空白物件作為值。
identity:
type: UserAssigned
userAssignedIdentities:
<IDENTITY1_RESOURCE_ID>: {}
<IDENTITY2_RESOURCE_ID>: {}
如需完整的 YAML 範本範例,請參閱 ARM API 規格 。
注意
應用程式可以同時具有系統指派的身分識別和使用者指派的身分識別。 在此情況下,type
屬性將會是 SystemAssigned,UserAssigned
。
若要新增一或多個使用者指派的身分識別,請將區 identity
段新增至 Bicep 範本。 將 <IDENTITY1_RESOURCE_ID>
和 <IDENTITY2_RESOURCE_ID>
取代為所要新增身分識別的資源識別碼。
藉由將項目新增至具有身分識別資源識別碼的 userAssignedIdentities
物件作為金鑰,以指定每個使用者指派的身分識別。 使用空白物件作為值。
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
<IDENTITY1_RESOURCE_ID>: {}
<IDENTITY2_RESOURCE_ID>: {}
}
}
如需完整的 Bicep 範例,請參閱 Microsoft.App containerApps Bicep、ARM 樣本和 Terraform AzAPI 參考 。
注意
應用程式可以同時具有系統指派的身分識別和使用者指派的身分識別。 在此情況下,type
屬性將會是 SystemAssigned,UserAssigned
。
針對某些資源,您必須為應用程式的受控識別設定角色指派,以授與存取權。 否則,即使您針對該身分識別使用有效的令牌,仍會拒絕從您的應用程式呼叫服務,例如 Azure 金鑰保存庫 和 Azure SQL 資料庫。 若要深入了解 Azure 角色型存取控制 (Azure RBAC),請參閱什麼是 RBAC? 。 若要深入瞭解哪些資源支援 Microsoft Entra 權杖,請參閱支援 Microsoft Entra 驗證的 Azure 服務 。
重要
受控身分識別的後端服務會將每個資源的 URI 快取保留大約 24 小時。 如果您更新特定目標資源的存取原則,並立即擷取該資源的權杖,則可以繼續取得具有過期權限的快取權杖,直到該權杖到期為止。 不支持強制令牌重新整理。
以應用程式程式碼連線至 Azure 服務
透過受控身分識別,應用程式可以取得權杖來存取使用 Microsoft Entra ID 的 Azure 資源,例如 Azure SQL Database、Azure Key Vault 和 Azure 儲存體。 這些權杖代表存取資源的應用程式,而不是任何特定的應用程式使用者。
容器應用程式提供可內部存取的 REST 端點 來擷取權杖。 REST 端點可從具有標準 HTTP 要求的應用程式內取得,您可以使用慣用語言以一般 HTTP GET
用戶端傳送。 針對 .NET、JavaScript、JAVA 和 Python,Azure 身分識別用戶端程式庫會在此 REST 端點上提供抽象概念。 您可以將認證物件新增至服務特定的用戶端,以連線到其他 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 驗證的 Azure 服務 ,或任何其他資源 URI。
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 ID 中移除。
在應用程式頁面的左側瀏覽中,向下捲動至 [設定] 群組。
選取 [身分識別]。 接著依據身分識別類型,遵循步驟:
系統指派的身分識別 :在 [系統指派] 索引標籤內,將 [狀態] 切換為 [關閉] 。 選取 [儲存]。
使用者指派的身分識別 :選取 [使用者指派 ] 索引標籤,選取身分識別的核取方塊,然後選取 [移除 ]。 選取是 以確認。
若要移除系統指派的身分識別:
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
設定為 ARM 範本中的 None
:
"identity": {
"type": "None"
}
若要移除所有身分識別,請將容器應用程式的身分識別的 type
設定為 YAML 組態檔案中的 None
:
identity:
type: None
若要移除所有身分識別,請將容器應用程式的身分識別設定 type
為 None
Bicep 範本中的 :
identity: {
type: 'None'
}
下一步