使用 Bicep 建立 Azure RBAC 資源

Azure 有一個強大的角色型存取控制 (RBAC) 系統。 如需有關 Azure RBAC 的詳細資訊,請參閱什麼是 Azure 角色型存取控制 (Azure RBAC)?(部分機器翻譯)。藉由使用 Bicep,您可以利用程式設計方式定義您的 RBAC 角色指派和角色定義。

角色指派

角色指派可讓您授與主體 (例如使用者、群組或服務主體) 對於特定 Azure 資源的存取權。

若要定義角色指派,請建立具有類型Microsoft.Authorization/roleAssignments的資源。 角色定義具有多個屬性,包括範圍、名稱、角色定義識別碼、主體識別碼以及主體類型。

範圍

角色指派適用於特定範圍,其會定義您要授與存取權的資源或資源集。 如需詳細資訊,請參閱了解 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 部署可重複,請務必確定名稱是否具確定性,換句話說,每次您進行部署時都要使用相同的名稱。 最好建立一個使用範圍、主體識別碼和角色識別碼的 GUID。 使用 guid() 函數可協助您替角色指派名稱建立具確定性的 GUID 為適當的作法,如下列範例所示:

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

角色定義識別碼

您指派的角色可以是內建角色定義或自訂角色定義。 若要使用內建角色定義,請尋找適當的角色定義識別碼。 例如,參與者角色具有 b24988ac-6180-42a0-ab88-20f7382dd24c 的角色定義識別碼。

建立角色指派資源時,必須指定完整的資源識別碼。 內建角色定義識別碼為訂用帳戶範圍的資源。 使用 existing 資源來參考內建角色,以及使用 .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 中,這有時候稱為「物件識別碼」

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 刪除使用者、群組、服務主體或受控識別時,刪除任何角色指派是個良好的習慣做法。 角色指派不會自動刪除。

任何參考已刪除主體識別碼的角色指派都會失效。 如果您嘗試將角色指派的名稱重複用於另一個角色指派,部署將會失敗。 若要因應這個行為,您應該先移除舊的角色指派再重新建立,或確定您在部署新的角色指派時使用唯一名稱。 本快速入門範本說明如何在 Bicep 模組中定義角色指派,並使用主體識別碼作為角色指派名稱的種子值。

自訂角色定義

自訂角色定義可讓您定義一組存取權限,可以接著使用角色指派,指派給主體。 如需角色定義的詳細資訊,請參閱了解 Azure 角色定義

若要建立自訂角色定義,請定義類型 Microsoft.Authorization/roleDefinitions 的資源。 如需範例,請參閱透過訂用帳戶層級部署建立新的角色定義的快速入門。

Microsoft Entra 租用戶內的角色定義資源名稱必須是唯一的,即使可指派的範圍較窄也一樣。

注意

有些服務會管理自己的角色定義和指派。 例如,Azure Cosmos DB 會維護自有的 Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignmentsMicrosoft.DocumentDB/databaseAccounts/sqlRoleDefinitions 資源。 如需詳細資訊,請參閱特定服務的文件。