Share via


Azure RBAC-resources maken met Bicep

Azure heeft een krachtig RBAC-systeem (op rollen gebaseerd toegangsbeheer). Voor meer informatie over Azure RBAC raadpleegt u Wat is op rollen gebaseerd toegangsbeheer van Azure (Azure RBAC)? Met Bicep kunt u programmatisch uw RBAC-roltoewijzingen en roldefinities definiëren.

Roltoewijzingen

Met roltoewijzingen kunt u een principal (zoals een gebruiker, een groep of een service-principal) toegang verlenen tot een specifieke Azure-resource.

Als u een roltoewijzing wilt definiëren, maakt u een resource met het type Microsoft.Authorization/roleAssignments. Een roldefinitie heeft meerdere eigenschappen, waaronder een bereik, een naam, een roldefinitie-id, een principal-id en een principal-type.

Bereik

Roltoewijzingen zijn van toepassing op een specifiek bereik, waarmee de resource of set resources wordt gedefinieerd waartoe u toegang verleent. Zie Inzicht in het bereik voor Azure RBAC voor meer informatie.

Roltoewijzingen zijn extensieresources, wat betekent dat ze van toepassing zijn op een andere resource. In het volgende voorbeeld ziet u hoe u een opslagaccount en een roltoewijzing maakt die is afgestemd op dat opslagaccount:

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'
  }
}

Als u het bereik niet expliciet opgeeft, gebruikt Bicep de bestanden targetScope. In het volgende voorbeeld wordt geen scope eigenschap opgegeven, zodat de roltoewijzing is afgestemd op het abonnement:

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'
  }
}

Fooi

Gebruik het kleinste bereik dat u nodig hebt om te voldoen aan uw vereisten.

Als u bijvoorbeeld een beheerde identiteit toegang moet verlenen tot één opslagaccount, is het een goede beveiligingspraktijk om de roltoewijzing te maken binnen het bereik van het opslagaccount, niet in het bereik van de resourcegroep of het abonnementsbereik.

Naam

De resourcenaam van een roltoewijzing moet een GUID (Globally Unique Identifier) zijn.

Resourcenamen voor roltoewijzing moeten uniek zijn binnen de Microsoft Entra-tenant, zelfs als het bereik smaller is.

Om uw Bicep-implementatie herhaalbaar te maken, is het belangrijk dat de naam deterministisch is, met andere woorden, om steeds dezelfde naam te gebruiken wanneer u implementeert. Het is een goed idee om een GUID te maken die het bereik, de principal-id en de rol-id samen gebruikt. Het is een goed idee om de functie te gebruiken om u te helpen bij het guid() maken van een deterministische GUID voor uw roltoewijzingsnamen, zoals in dit voorbeeld:

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

Roldefinitie-id

De rol die u toewijst, kan een ingebouwde roldefinitie of een aangepaste roldefinitie zijn. Als u een ingebouwde roldefinitie wilt gebruiken, zoekt u de juiste roldefinitie-id. De rol Inzender heeft bijvoorbeeld een roldefinitie-id van b24988ac-6180-42a0-ab88-20f7382dd24c.

Wanneer u de roltoewijzingsresource maakt, moet u een volledig gekwalificeerde resource-id opgeven. Ingebouwde roldefinitie-id's zijn resources met abonnementsbereik. Het is een goede gewoonte om een existing resource te gebruiken om te verwijzen naar de ingebouwde rol en om toegang te krijgen tot de volledig gekwalificeerde resource-id met behulp van de .id eigenschap:

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'
  }
}

Principal

De principalId eigenschap moet worden ingesteld op een GUID die de Microsoft Entra-id voor de principal vertegenwoordigt. In Microsoft Entra-id wordt dit soms ook wel de object-id genoemd.

De principalType eigenschap geeft aan of de principal een gebruiker, een groep of een service-principal is. Beheerde identiteiten zijn een vorm van service-principal.

Fooi

Het is belangrijk om de principalType eigenschap in te stellen wanneer u een roltoewijzing maakt in Bicep. Anders kunnen er onregelmatige implementatiefouten optreden, met name wanneer u met service-principals en beheerde identiteiten werkt.

In het volgende voorbeeld ziet u hoe u een door de gebruiker toegewezen beheerde identiteit en een roltoewijzing maakt:

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'
  }
}

Gedrag bij verwijderen van resources

Wanneer u een gebruiker, groep, service-principal of beheerde identiteit verwijdert uit Microsoft Entra ID, is het een goed idee om roltoewijzingen te verwijderen. Ze worden niet automatisch verwijderd.

Roltoewijzingen die naar een verwijderde principal-id verwijzen, worden ongeldig. Als u de naam van een roltoewijzing opnieuw probeert te gebruiken voor een andere roltoewijzing, mislukt de implementatie. Als u dit gedrag wilt omzeilen, moet u de oude roltoewijzing verwijderen voordat u deze opnieuw maakt of ervoor zorgen dat u een unieke naam gebruikt wanneer u een nieuwe roltoewijzing implementeert. Deze snelstartsjabloon illustreert hoe u een roltoewijzing in een Bicep-module kunt definiëren en een principal-id kunt gebruiken als seed-waarde voor de naam van de roltoewijzing.

Aangepaste roldefinities

Met aangepaste roldefinities kunt u een set machtigingen definiëren die vervolgens aan een principal kunnen worden toegewezen met behulp van een roltoewijzing. Zie Inzicht in Azure-roldefinities voor meer informatie over roldefinities.

Als u een aangepaste roldefinitie wilt maken, definieert u een resource van het type Microsoft.Authorization/roleDefinitions. Zie de quickstart voor het maken van een nieuwe rol via een implementatie op abonnementsniveau voor een voorbeeld.

Resourcenamen voor roldefinities moeten uniek zijn binnen de Microsoft Entra-tenant, zelfs als de toewijsbare bereiken smaller zijn.

Notitie

Sommige services beheren hun eigen roldefinities en -toewijzingen. Azure Cosmos DB onderhoudt bijvoorbeeld zijn eigen Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments resources en Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions eigen resources. Zie de documentatie van de specifieke service voor meer informatie.