使用 Bicep 创建 Azure 基于角色的访问控制 (Azure RBAC) 资源

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

角色分配

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

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

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@2025-06-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.azure.cn/role-based-access-control/built-in-roles#contributor')
resource contributorRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' 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@2025-01-31-preview' = {
  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 的资源。 有关示例,请参阅通过订阅级别部署新建角色定义快速入门。

注释

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