Azure Active Directory 中的托管标识允许群集轻松访问其他受 Azure AD 保护的资源,例如 Azure Key Vault。 标识由 Azure 平台托管,无需预配或轮换任何机密。 目前托管标识配置仅支持为集群启用由客户管理的密钥。
有关托管标识的概述,请参阅 Azure 数据资源管理器群集中使用托管标识进行身份验证。
可以向 Azure 数据资源管理器群集授予两种类型的标识:
-
系统分配的标识:绑定到群集,如果资源被删除,则将其删除。 群集只能有一个系统分配的标识。
-
用户分配的标识:可分配给群集的独立 Azure 资源。 群集可以有多个用户分配的标识。
本文介绍如何为 Azure 数据资源管理器群集添加和删除系统分配的托管标识和用户分配的托管标识。
注释
如果你的 Azure 数据资源管理器群集在不同的订阅或租户之间迁移,那么 Azure 数据资源管理器的托管标识可能不会按预期方式工作。 应用需要获取新的标识,可以通过 禁用 和 重新启用 该功能来完成。 还需要更新下游资源的访问策略才能使用新标识。
添加系统分配的标识
为群集分配一个由系统分配且与之绑定的标识,并在删除群集时一并删除该标识。 群集只能有一个系统分配的标识。 使用系统分配的标识创建群集需要在群集上设置一个附加属性。 使用 Azure 门户、C# 或资源管理器模板添加系统分配的标识,如下所示。
使用 Azure 门户添加系统分配的标识
登录到 Azure 门户。
新建 Azure 数据资源管理器群集
创建 Azure 数据资源管理器群集
在“安全”选项卡中,选择“>”以启用“系统分配的标识”。 若要删除系统分配的标识,请选择 关闭。
选择 下一步:在 > 或 中标记,查看并创建,从而创建群集。
现有的 Azure 数据资源管理器群集
打开现有的 Azure 数据资源管理器群集。
在门户的左窗格中选择“设置”>身份。
在“身份”窗格中,>“系统分配”选项卡:
- 将 状态 滑块移动到 开。
- 选择“保存”
- 在弹出窗口中,选择“是”
几分钟后,屏幕会显示:
-
对象 ID - 用于客户管理的密钥
-
权限 - 选择相关的角色分配
使用 C# 添加系统分配的标识
先决条件
若要使用 Azure 数据资源管理器 C# 客户端设置托管标识,请执行以下作:
创建或更新群集
使用 Identity 属性创建或更新群集:
var tenantId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Directory (tenant) ID
var clientId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Application ID
var clientSecret = "PlaceholderClientSecret"; //Client Secret
var subscriptionId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";
var authClient = ConfidentialClientApplicationBuilder.Create(clientId)
.WithAuthority($"https://login.microsoftonline.com/{tenantId}")
.WithClientSecret(clientSecret)
.Build();
var result = authClient.AcquireTokenForClient(new[] { "https://management.core.windows.net/" }).ExecuteAsync().Result;
var credentials = new TokenCredentials(result.AccessToken, result.TokenType);
var kustoManagementClient = new KustoManagementClient(credentials) { SubscriptionId = subscriptionId };
var resourceGroupName = "testrg";
var clusterName = "mykustocluster";
var clusterData = new Cluster(
location: "Central US",
sku: new AzureSku("Standard_E8ads_v5", "Standard", 5),
identity: new Identity(IdentityType.SystemAssigned)
);
await kustoManagementClient.Clusters.CreateOrUpdateAsync(resourceGroupName, clusterName, clusterData);
运行以下命令,检查群集是否已使用标识成功创建或更新:
clusterData = await kustoManagementClient.Clusters.GetAsync(resourceGroupName, clusterName);
如果结果包含 ProvisioningState 且其值为 Succeeded,则集群已被创建或更新,并且应具有以下属性:
var principalGuid = clusterData.Identity.PrincipalId;
var tenantGuid = clusterData.Identity.TenantId;
PrincipalId 和 TenantId 被替换为 GUID。
TenantId 属性标识身份所属的 Azure AD 租户。
PrincipalId 是群集的新标识的唯一标识符。 在 Azure AD 中,服务主体的名称与向应用服务或 Azure Functions 实例提供的名称相同。
使用 Azure 资源管理器模板添加系统分配的标识
Azure 资源管理器模板可以用于自动化 Azure 资源部署。 若要详细了解如何部署到 Azure 数据资源管理器,请参阅 使用 Azure 资源管理器模板创建 Azure 数据资源管理器群集和数据库。
添加系统分配的类型会告知 Azure 创建和管理群集的标识。 可以通过在资源定义中包括以下属性,创建带有身份的 Microsoft.Kusto/clusters 类型的任何资源:
{
"identity": {
"type": "SystemAssigned"
}
}
例如:
{
"apiVersion": "2019-09-07",
"type": "Microsoft.Kusto/clusters",
"name": "[variables('clusterName')]",
"location": "[resourceGroup().location]",
"identity": {
"type": "SystemAssigned"
}
}
注释
群集可以同时具有系统分配的标识和用户分配的标识。
type 属性将会是 SystemAssigned,UserAssigned
创建群集时,它具有以下附加属性:
{
"identity": {
"type": "SystemAssigned",
"tenantId": "<TENANTID>",
"principalId": "<PRINCIPALID>"
}
}
<TENANTID> 和 <PRINCIPALID> 被替换为 GUID。
TenantId 属性标识身份所属的 Azure AD 租户。
PrincipalId 是群集的新标识的唯一标识符。 在 Azure AD 中,服务主体的名称与向应用服务或 Azure Functions 实例提供的名称相同。
删除系统分配的标识
删除系统分配的标识也会从 Azure AD 中删除它。 删除群集资源时,系统分配的标识也会自动从 Azure AD 中删除。 可以通过禁用该功能来删除系统分配的标识。 使用 Azure 门户、C# 或资源管理器模板删除系统分配的标识,如下所示。
使用 Azure 门户删除系统分配的标识
登录到 Azure 门户。
在门户的左窗格中选择“设置”>身份。
在“标识”窗格中,>“系统分配”选项卡:
- 将 “状态 ”滑块移动到 “关闭”。
- 选择“保存”
- 在弹出窗口中,选择 “是” 禁用系统分配的身份。 “ 标识 ”窗格还原为与添加系统分配的标识之前相同的条件。
使用 C# 移除系统分配的标识
运行以下命令以删除系统分配的标识:
var clusterPatch = new ClusterUpdate(identity: new Identity(IdentityType.None));
await kustoManagementClient.Clusters.UpdateAsync(resourceGroupName, clusterName, clusterPatch);
使用 Azure 资源管理器模板删除系统分配的标识
运行以下命令以删除系统分配的标识:
{
"identity": {
"type": "None"
}
}
注释
如果群集同时具有系统分配的标识和用户分配的标识,则删除系统分配的标识后,type 属性将 UserAssigned
添加用户分配的标识
为你的群集分配用户指定的托管标识。 群集可以有多个用户分配的标识。 使用用户分配的标识创建群集需要在群集上设置附加属性。 使用 Azure 门户、C# 或资源管理器模板添加用户分配的标识,如下所示。
使用 Azure 门户添加用户分配的标识
登录到 Azure 门户。
创建用户分配的托管标识资源。
打开现有的 Azure 数据资源管理器群集。
在门户的左窗格中选择“设置”>身份。
在“用户分配”选项卡中,选择“添加”。
搜索您之前创建的身份,并选择它。 选择 “添加”。
使用 C# 添加用户分配的标识
先决条件
若要使用 Azure 数据资源管理器 C# 客户端设置托管标识,请执行以下作:
创建或更新群集
使用 Identity 属性创建或更新群集:
var tenantId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Directory (tenant) ID
var clientId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Application ID
var clientSecret = "PlaceholderClientSecret"; //Client Secret
var subscriptionId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";
var authClient = ConfidentialClientApplicationBuilder.Create(clientId)
.WithAuthority($"https://login.microsoftonline.com/{tenantId}")
.WithClientSecret(clientSecret)
.Build();
var result = authClient.AcquireTokenForClient(new[] { "https://management.core.windows.net/" }).ExecuteAsync().Result;
var credentials = new TokenCredentials(result.AccessToken, result.TokenType);
var kustoManagementClient = new KustoManagementClient(credentials) { SubscriptionId = subscriptionId };
var resourceGroupName = "testrg";
var clusterName = "mykustocluster";
var userIdentityResourceId = $"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identityName>";
var clusterData = new Cluster(
location: "Central US",
sku: new AzureSku("Standard_E8ads_v5", "Standard", 5),
identity: new Identity(
IdentityType.UserAssigned,
userAssignedIdentities: new Dictionary<string, IdentityUserAssignedIdentitiesValue>(1)
{
{ userIdentityResourceId, new IdentityUserAssignedIdentitiesValue() }
}
)
);
await kustoManagementClient.Clusters.CreateOrUpdateAsync(resourceGroupName, clusterName, clusterData);
运行以下命令,检查群集是否已使用标识成功创建或更新:
clusterData = await kustoManagementClient.Clusters.GetAsync(resourceGroupName, clusterName);
如果结果包含 ProvisioningState 且其值为 Succeeded,则集群已被创建或更新,并且应具有以下属性:
var userIdentity = clusterData.Identity.UserAssignedIdentities[userIdentityResourceId];
var principalGuid = userIdentity.PrincipalId;
var clientGuid = userIdentity.ClientId;
PrincipalId 是用于 Azure AD 管理的身份的唯一标识符。
ClientId 是应用程序的新标识的唯一标识符,用于指定在运行时调用期间要使用的标识。
使用 Azure 资源管理器模板添加用户分配的标识
Azure 资源管理器模板可以用于自动化 Azure 资源部署。 若要详细了解如何部署到 Azure 数据资源管理器,请参阅 使用 Azure 资源管理器模板创建 Azure 数据资源管理器群集和数据库。
可以创建类型为 Microsoft.Kusto/clusters 的任何资源,只需在资源定义中包含以下属性,并用所需身份的资源 ID 替换 <RESOURCEID>,即可使用用户指定的身份。
{
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<RESOURCEID>": {}
}
}
}
例如:
{
"apiVersion": "2019-09-07",
"type": "Microsoft.Kusto/clusters",
"name": "[variables('clusterName')]",
"location": "[resourceGroup().location]",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]": {}
}
},
"dependsOn": [
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
]
}
创建群集时,它具有以下附加属性:
{
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<RESOURCEID>": {
"principalId": "<PRINCIPALID>",
"clientId": "<CLIENTID>"
}
}
}
}
PrincipalId 是用于 Azure AD 管理的身份的唯一标识符。
ClientId 是应用程序的新标识的唯一标识符,用于指定在运行时调用期间要使用的标识。
注释
群集可以同时具有系统分配的标识和用户分配的标识。 在这种情况下,type 属性将为 SystemAssigned,UserAssigned。
从群集中删除用户分配的托管标识
使用 Azure 门户、C# 或资源管理器模板删除用户分配的标识,如下所示。
使用 Azure 门户删除用户分配的托管标识
登录到 Azure 门户。
在门户的左窗格中选择“设置”>身份。
选择“用户分配”选项卡。
搜索您之前创建的身份,并选择它。 选择 “删除”。
在弹出窗口中,选择 是 以删除用户分配的身份。
标识 窗格还原为与添加用户分配标识之前, 相同的状态。
使用 C# 删除用户分配的身份
运行以下命令以删除用户分配的标识:
var clusterUpdate = new ClusterUpdate(
identity: new Identity(
IdentityType.UserAssigned,
userAssignedIdentities: new Dictionary<string, IdentityUserAssignedIdentitiesValue>(1)
{
{ userIdentityResourceId, null }
}
)
);
await kustoManagementClient.Clusters.UpdateAsync(resourceGroupName, clusterName, clusterUpdate);
使用 Azure 资源管理器模板删除用户分配的标识
运行以下命令以删除用户分配的标识:
{
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<RESOURCEID>": null
}
}
}
注释
- 若要删除标识,请将其值设置为 null。 所有其他现有标识都不会受到影响。
- 若要删除所有用户分配的标识,
type 属性将会是 None。
- 如果群集同时具有系统分配的标识和用户分配的标识,则
type 属性将显示要删除的标识。您可以选择设置为 SystemAssigned,UserAssigned,指定要删除的标识,或设置为 SystemAssigned,以删除所有用户分配的标识。
后续步骤