你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Bicep 创建 Azure RBAC 资源

Azure 具有强大的基于角色的访问控制 (RBAC) 系统。 有关 Azure RBAC 的详细信息,请参阅什么是 Azure 基于角色的访问控制 (Azure RBAC)?通过使用 Bicep,可以以编程方式定义 RBAC 角色分配和角色定义。

角色分配

使用角色分配,你可以授予主体(例如用户、组或服务主体)对特定 Azure 资源的访问权限。

若要定义角色分配,请创建类型为 Microsoft.Authorization/roleAssignments 的资源。 角色定义具有多个属性,包括范围、名称、角色定义 ID、主体 ID 和主体类型。

范围

角色分配在特定 scope 应用,该 scope 定义你要向其授予访问权限的资源或资源集。 有关详细信息,请参阅了解 Azure RBAC 的范围

角色分配是扩展资源这意味着它们适用于其他资源。 以下示例显示了如何创建存储帐户和作用范围为该存储帐户的角色分配:

param location string = resourceGroup().location
param storageAccountName string = 'stor${uniqueString(resourceGroup().id)}'
param storageSkuName string = 'Standard_LRS'
param roleDefinitionResourceId string
param principalId string

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: {
   name: storageSkuName
  }
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: storageAccount
  name: guid(storageAccount.id, principalId, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

如果未显式指定范围,Bicep 将使用文件的 targetScope。 在下面的示例中,未指定 scope 属性,因此角色分配的范围为订阅:

param roleDefinitionResourceId string
param principalId string

targetScope = 'subscription'

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(subscription().id, principalId, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

提示

使用满足要求所需的最小范围。

例如,如果需要向单个存储帐户授予托管标识访问权限,好的安全的做法是在存储帐户范围内创建角色分配,而不是在资源组或订阅范围内创建角色分配。

名称

角色分配的资源名称必须是全局唯一标识符 (GUID)。

角色分配资源名称在 Microsoft Entra 租户中必须是唯一的,即使范围更窄也是如此。

若要使 Bicep 部署可重复,请务必确定名称,换句话说,每次部署时都要使用相同的名称。 创建一个使用相同作用域、主体 ID 和角色 ID 的 GUID 是一种很好的做法。 可以使用 guid() 函数来帮助你为角色分配名称创建确定性的 GUID,如以下示例所示:

name: guid(subscription().id, principalId, roleDefinitionResourceId)

角色定义 ID

分配的角色可以是内置角色定义或自定义角色定义。 若要使用内置角色定义,查找相应的角色定义 ID。 例如,参与者角色的角色定义 ID 为 b24988ac-6180-42a0-ab88-20f7382dd24c

创建角色分配资源时,需要指定完全限定的资源 ID。 内置角色定义 ID 是订阅范围的资源。 一个好的做法是使用 existing 资源来引用内置角色,并使用 .id 属性访问其完全限定的资源 ID:

param principalId string

@description('This is the built-in Contributor role. See https://docs.microsoft.com/azure/role-based-access-control/built-in-roles#contributor')
resource contributorRoleDefinition 'Microsoft.Authorization/roleDefinitions@2018-01-01-preview' existing = {
  scope: subscription()
  name: 'b24988ac-6180-42a0-ab88-20f7382dd24c'
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, principalId, contributorRoleDefinition.id)
  properties: {
    roleDefinitionId: contributorRoleDefinition.id
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

主体

principalId 属性必须设置为表示主体的 Microsoft Entra 标识符的 GUID。 在 Microsoft Entra ID 中,它有时称作对象 ID。

principalType 属性指定主体是用户、组还是服务主体。 托管标识是服务主体的一种形式。

提示

在 Bicep 中创建角色分配时,必须设置 principalType 属性。 否则,可能会遇到间歇性部署错误,尤其是在使用服务主体和托管标识时。

以下示例显示如何创建用户分配的托管标识和角色分配:

param location string = resourceGroup().location
param roleDefinitionResourceId string

var managedIdentityName = 'MyManagedIdentity'

resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: managedIdentityName
  location: location
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, managedIdentity.id, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: managedIdentity.properties.principalId
    principalType: 'ServicePrincipal'
  }
}

资源删除行为

从 Microsoft Entra ID 中删除用户、组、服务主体或托管标识时,最好删除所有角色分配。 不会自动删除它们。

引用已删除主体 ID 的任何角色分配都会变得无效。 如果尝试对另一个角色分配重复使用角色分配的名称,则部署会失败。 若要解决此问题,应在重新创建旧角色分配之前删除旧角色分配,或者确保在部署新角色分配时使用唯一名称。 本快速启动模板演示了如何在 Bicep 模块中定义角色分配,并将主体 ID 用作角色分配名称的种子值。

自定义角色定义

使用自定义角色定义,你可以定义一组权限,然后就可以使用角色分配将这组权限分配给主体。 有关角色定义的详细信息,请参阅了解 Azure 角色定义

若要创建自定义角色定义,请定义 Microsoft.Authorization/roleDefinitions 类型的资源。 有关示例,请参阅通过订阅级别部署新建角色定义快速入门。

角色定义资源名称在 Microsoft Entra 租户中必须是唯一的,即使可分配范围较窄也是如此。

注意

一些服务管理自己的角色定义和分配。 例如,Azure Cosmos DB 维护其自己的 Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignmentsMicrosoft.DocumentDB/databaseAccounts/sqlRoleDefinitions 资源。 有关详细信息,请参阅特定服务的文档。