Share via


Skapa Azure RBAC-resurser med hjälp av Bicep

Azure har ett kraftfullt rbac-system (rollbaserad åtkomstkontroll). Mer information om Azure RBAC finns i Vad är rollbaserad åtkomstkontroll i Azure (Azure RBAC)? Med Bicep kan du programmatiskt definiera dina RBAC-rolltilldelningar och rolldefinitioner.

Rolltilldelningar

Med rolltilldelningar kan du bevilja ett huvudnamn (till exempel en användare, en grupp eller ett huvudnamn för tjänsten) åtkomst till en specifik Azure-resurs.

Om du vill definiera en rolltilldelning skapar du en resurs med typen Microsoft.Authorization/roleAssignments. En rolldefinition har flera egenskaper, inklusive ett omfång, ett namn, ett rolldefinitions-ID, ett huvudnamns-ID och en huvudnamnstyp.

Omfång

Rolltilldelningar gäller i ett specifikt omfång som definierar resursen eller uppsättningen resurser som du beviljar åtkomst till. Mer information finns i Förstå omfånget för Azure RBAC.

Rolltilldelningar är tilläggsresurser, vilket innebär att de gäller för en annan resurs. I följande exempel visas hur du skapar ett lagringskonto och en rolltilldelning som är begränsad till lagringskontot:

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

Om du inte uttryckligen anger omfånget använder Bicep filens targetScope. I följande exempel anges ingen scope egenskap, så rolltilldelningen är begränsad till prenumerationen:

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

Dricks

Använd det minsta omfång som du behöver för att uppfylla dina krav.

Om du till exempel behöver bevilja en hanterad identitet åtkomst till ett enda lagringskonto är det bra säkerhetspraxis att skapa rolltilldelningen i lagringskontots omfång, inte i resursgruppen eller prenumerationsomfånget.

Name

Resursnamnet för en rolltilldelning måste vara en globalt unik identifierare (GUID).

Resursnamn för rolltilldelning måste vara unika i Microsoft Entra-klientorganisationen, även om omfånget är smalare.

För att Bicep-distributionen ska kunna upprepas är det viktigt att namnet är deterministiskt – med andra ord att använda samma namn varje gång du distribuerar. Det är en bra idé att skapa ett GUID som använder omfång, huvudnamns-ID och roll-ID tillsammans. Det är en bra idé att använda guid() funktionen för att hjälpa dig att skapa ett deterministiskt GUID för dina rolltilldelningsnamn, som i det här exemplet:

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

Rolldefinitions-ID

Rollen du tilldelar kan vara en inbyggd rolldefinition eller en anpassad rolldefinition. Om du vill använda en inbyggd rolldefinition hittar du lämpligt rolldefinitions-ID. Rollen Deltagare har till exempel ett rolldefinitions-ID för b24988ac-6180-42a0-ab88-20f7382dd24c.

När du skapar rolltilldelningsresursen måste du ange ett fullständigt kvalificerat resurs-ID. Inbyggda rolldefinitions-ID:er är resurser med prenumerationsomfång. Det är en bra idé att använda en existing resurs för att referera till den inbyggda rollen och få åtkomst till dess fullständigt kvalificerade resurs-ID med hjälp .id av egenskapen:

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

Huvudkonto

Egenskapen principalId måste anges till ett GUID som representerar Microsoft Entra-identifieraren för huvudkontot. I Microsoft Entra-ID kallas detta ibland objekt-ID.

Egenskapen principalType anger om huvudnamnet är en användare, en grupp eller ett huvudnamn för tjänsten. Hanterade identiteter är en form av tjänstens huvudnamn.

Dricks

Det är viktigt att ange principalType egenskapen när du skapar en rolltilldelning i Bicep. Annars kan du få tillfälliga distributionsfel, särskilt när du arbetar med tjänstens huvudnamn och hanterade identiteter.

I följande exempel visas hur du skapar en användartilldelad hanterad identitet och en rolltilldelning:

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

Beteende för resursborttagning

När du tar bort en användare, grupp, tjänstens huvudnamn eller hanterade identitet från Microsoft Entra-ID är det bra att ta bort eventuella rolltilldelningar. De tas inte bort automatiskt.

Alla rolltilldelningar som refererar till ett borttaget huvudnamns-ID blir ogiltiga. Om du försöker återanvända en rolltilldelnings namn för en annan rolltilldelning misslyckas distributionen. Om du vill kringgå det här beteendet bör du antingen ta bort den gamla rolltilldelningen innan du återskapar den eller se till att du använder ett unikt namn när du distribuerar en ny rolltilldelning. Den här snabbstartsmallen visar hur du kan definiera en rolltilldelning i en Bicep-modul och använda ett huvudnamns-ID som startvärde för rolltilldelningsnamnet.

Anpassade rolldefinitioner

Med anpassade rolldefinitioner kan du definiera en uppsättning behörigheter som sedan kan tilldelas till ett huvudnamn med hjälp av en rolltilldelning. Mer information om rolldefinitioner finns i Förstå Rolldefinitioner för Azure.

Om du vill skapa en anpassad rolldefinition definierar du en resurs av typen Microsoft.Authorization/roleDefinitions. I snabbstarten Skapa en ny roll def via en distribution på prenumerationsnivå finns ett exempel.

Resursnamn för rolldefinition måste vara unika i Microsoft Entra-klientorganisationen, även om de tilldelningsbara omfången är smalare.

Kommentar

Vissa tjänster hanterar sina egna rolldefinitioner och tilldelningar. Azure Cosmos DB har till exempel egna Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments resurser och Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions resurser. Mer information finns i den specifika tjänstens dokumentation.