Azure 容器應用程式中的受控身分識別
Microsoft Entra ID 的受控識別可讓您的容器應用程式輕鬆存取其他受 Microsoft Entra 保護的資源。 如需有關 Microsoft Entra ID 受控身分識別的詳細資訊,請參閱適用於 Azure 資源的受控識別 (部分機器翻譯)。
您的容器應用程式可以被授與兩種類型的識別:
- 系統指派的身分識別會繫結至您的容器應用程式,如果您的應用程式已刪除,則將隨之刪除。 應用程式只能有一個系統指派的身分識別。
- 使用者指派的身分識別是獨立的 Azure 資源,您可以指派給容器應用程式和其他資源。 容器應用程式可以具有多個使用者指派的識別。 使用者指派的身分識別存在,直到您刪除它們為止。
為什麼要使用受控識別?
您可以使用執行中容器應用程式中的受控身分識別,向任何支援 Microsoft Entra 驗證的服務進行驗證。
使用受控識別:
- 您的應用程式會使用受控識別來連線到資源。 您不需要在您的容器應用程式中管理認證。
- 您可以使用角色型存取控制,將特定的許可權授與給受控識別。
- 系統指派的識別會自動建立和管理。 當您的容器應用程式被刪除時,它們也會被刪除。
- 您可以新增和刪除使用者指派的識別,以及將其指派給多個資源。 它們與您容器應用程式的生命周期無關。
- 您可以使用受控識別向 私人 Azure Container Registry 進行驗證,而不需要使用者名稱和密碼,即可提取容器應用程式的容器。
- 您可以使用 受控識別,透過 Dapr 元件建立已啟用 Dapr 的應用程式連線
常見使用案例
系統指派的識別最適合下列類型的工作負載:
- 包含在單一資源內
- 需要獨立的識別
使用者指派的識別非常適合下列類型的工作負載:
- 在多個資源上執行且可共用單一識別
- 需要對安全資源進行預先授權
限制
Init 容器無法在僅限耗用量環境和專用工作負載配置文件環境中存取受控識別
設定受控識別
您可以透過下列方式來設定您的受控識別:
- Azure 入口網站
- Azure CLI
- Azure Resource Manager (ARM) 範本
在執行中的容器應用程式上新增、刪除或修改受控識別時,應用程式不會自動重新啟動,也不會建立新的修訂版本。
注意
當將受控身分識別新增至 2022 年 4 月 11 日之前部署的容器應用程式時,您必須建立新的修訂版本。
新增系統指派的身分識別
前往 Azure 入口網站的容器應用程式。
從 [ 設定] 群組中,選取 [ 身分識別]。
在 [系統指派] 索引標籤內,將 [狀態] 切換為 [開啟]。
選取儲存。
新增使用者指派的身分識別
透過使用者指派的識別來設定容器應用程式時會要求您先建立識別,然後再將其資源識別碼新增至您的容器應用程式的組態。 您可透過 Azure 入口網站或 Azure CLI 來建立使用者指派的身分識別。 如需建立和管理使用者指派的身分識別相關資訊,請參閱管理使用者指派的受控身分識別。
首先,您必須建立使用者指派的身分識別資源。
根據管理使用者指派的受控身分識別中找到的步驟,建立使用者指派的受控身分識別資源。
前往 Azure 入口網站的容器應用程式。
從 [ 設定] 群組中,選取 [ 身分識別]。
在 [使用者指派] 索引標籤內,選取 [新增]。
搜尋並選取您稍早建立的身分識別。
選取 [新增]。
設定目標資源
針對某些資源,您必須為應用程式的受控識別設定角色指派,以授與存取權。 否則,即使您針對該身分識別使用有效的令牌,仍會拒絕從您的應用程式呼叫服務,例如 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 SQL 資料來源與 Entity Framework Core 連線時,請考慮使用 Microsoft.Data.SqlClient,以提供受控身分識別連線的特殊連接字串。
針對 .NET 應用程式,使用受控身分識別的最簡單方式是透過適用於 .NET 的 Azure 身分識別用戶端程式庫。 請參閱下列資源以了解詳細資訊:
連結的範例會使用 DefaultAzureCredential
。 此物件在大部分案例中都有效,因為相同模式適用於 Azure(使用受控識別)和本機電腦上(不含受控識別)。
使用受控識別進行調整規則
您可以在調整規則中使用受控識別,向支援受控識別的 Azure 服務進行驗證。 若要在調整規則中使用受控識別,請使用 identity
屬性,而不是 auth
調整規則中的屬性。 屬性可接受的 identity
值為使用者指派身分識別的 Azure 資源識別碼,或使用 system
系統指派的身分識別。
注意
調整規則中的受控識別驗證處於公開預覽狀態。 其可在 API 版本 2024-02-02-preview
中使用。
下列 ARM 範例示範如何搭配 Azure 佇列記憶體調整規則使用受控識別:
佇列記憶體帳戶會使用 accountName
屬性來識別記憶體帳戶,而 identity
屬性則指定要使用的受控識別。 您不需要使用 auth
屬性。
"scale": {
"minReplicas": 1,
"maxReplicas": 10,
"rules": [{
"name": "myQueueRule",
"azureQueue": {
"accountName": "mystorageaccount",
"queueName": "myqueue",
"queueLength": 2,
"identity": "<IDENTITY1_RESOURCE_ID>"
}
}]
}
若要深入瞭解如何搭配調整規則使用受控識別,請參閱 在 Azure Container Apps 中設定調整規則。
控制受控識別可用性
Container Apps 可讓您指定 init 容器 和主要容器。 根據預設,取用工作負載配置文件環境中的 main 和 init 容器都可以使用受控識別來存取其他 Azure 服務。 在僅限耗用量環境和專用工作負載配置文件環境中,只有主要容器可以使用受控識別。 受控識別存取令牌適用於容器應用程式上設定的每個受控識別。 不過,在某些情況下,只有 init 容器或主要容器需要受控識別的存取令牌。 其他時候,您只能使用受控識別來存取您的 Azure Container Registry 來提取容器映射,而您的應用程式本身不需要存取您的 Azure Container Registry。
從 API 版本 2024-02-02-preview
開始,您可以在 init 和主要階段控制容器應用程式可用的受控識別,以遵循最低許可權的安全性原則。 下列是可用的選項:
Init
:僅適用於 init 容器。 當您想要執行一些需要受控識別的初始化工作,但不再需要主要容器中的受控識別時,請使用此功能。 此選項目前僅支援在 工作負載配置檔取用環境中Main
:僅適用於主要容器。 如果您的init容器不需要受控識別,請使用此選項。All
:適用於所有容器。 此值是預設設定。None
:不適用於任何容器。 當您有只用於 ACR 映像提取、調整規則或 金鑰保存庫 秘密的受控識別,而且不需要可供容器中執行的程式代碼使用時,請使用此身分識別。
下列 ARM 範例示範如何在工作負載設定檔取用環境上設定容器應用程式:
- 僅將容器應用程式的系統指派身分識別限制為主要容器。
- 僅將特定使用者指派的身分識別限制為 init 容器。
- 使用 Azure Container Registry 映射提取的特定使用者指派身分識別,而不允許容器中的程式代碼使用該受控識別來存取登錄。 在此範例中,容器本身不需要存取登錄。
這種方法會限制惡意執行者取得容器未經授權存取權時可存取的資源。
{
"location": "eastus2",
"identity":{
"type": "SystemAssigned, UserAssigned",
"userAssignedIdentities": {
"<IDENTITY1_RESOURCE_ID>":{},
"<ACR_IMAGEPULL_IDENTITY_RESOURCE_ID>":{}
}
},
"properties": {
"workloadProfileName":"Consumption",
"environmentId": "<CONTAINER_APPS_ENVIRONMENT_ID>",
"configuration": {
"registries": [
{
"server": "myregistry.azurecr.io",
"identity": "ACR_IMAGEPULL_IDENTITY_RESOURCE_ID"
}],
"identitySettings":[
{
"identity": "ACR_IMAGEPULL_IDENTITY_RESOURCE_ID",
"lifecycle": "None"
},
{
"identity": "<IDENTITY1_RESOURCE_ID>",
"lifecycle": "Init"
},
{
"identity": "system",
"lifecycle": "Main"
}]
},
"template": {
"containers":[
{
"image":"myregistry.azurecr.io/main:1.0",
"name":"app-main"
}
],
"initContainers":[
{
"image":"myregistry.azurecr.io/init:1.0",
"name":"app-init",
}
]
}
}
}
檢視受控身分識別
您可以使用下列 Azure CLI 命令來顯示系統指派和使用者指派的受控身分識別。 輸出會針對指派給容器應用程式的所有受控識別,顯示受控識別的類型、租用戶識別碼和主體識別碼。
az containerapp identity show --name <APP_NAME> --resource-group <GROUP_NAME>
移除受控識別
當您移除系統指派的身分識別時,便會從 Microsoft Entra ID 中刪除。 刪除容器應用程式資源本身時,系統指派的身分識別也會從 Microsoft Entra ID 自動移除。 從容器應用程式移除使用者指派的受控識別並不會從 Microsoft Entra ID 中移除。
在應用程式頁面的左側瀏覽中,向下捲動至 [設定] 群組。
選取 [身分識別]。 接著依據身分識別類型,遵循步驟:
- 系統指派的身分識別:在 [系統指派] 索引標籤內,將 [狀態] 切換為 [關閉]。 選取 [儲存]。
- 使用者指派的身分識別:選取 [使用者指派] 索引標籤,選取身分識別的核取方塊,然後選取 [移除]。 選取是以確認。