Erstellen von Azure RBAC-Ressourcen mit Bicep

Azure verfügt über ein leistungsfähiges rollenbasiertes Zugriffssteuerungssystem (Role-Based Access Control, RBAC). Weitere Informationen zu Azure RBAC finden Sie unter Was ist die rollenbasierte Zugriffssteuerung in Azure (Azure Role-Based Access Control, Azure RBAC)? Mithilfe von Bicep können Sie RBAC-Rollenzuweisungen und -definitionen programmgesteuert bestimmen.

Rollenzuweisungen

Rollenzuweisungen ermöglichen es Ihnen, einem Prinzipal (z. B. Benutzer, Gruppe oder Dienstprinzipal) Zugriff auf eine bestimmte Azure-Ressource zu gewähren.

Um eine Rollenzuweisung zu definieren, erstellen Sie eine Ressource mit dem Typ Microsoft.Authorization/roleAssignments. Eine Rollendefinition verfügt über mehrere Eigenschaften, darunter einen Bereich, einen Namen, eine Rollendefinitions-ID, eine Prinzipal-ID und einen Prinzipaltyp.

`Scope`

Rollenzuweisungen gelten für einen bestimmten Bereich, der die Ressource oder Gruppe von Ressourcen definiert, der Sie Zugriff gewähren. Weitere Informationen finden Sie in der Grundlegendes zum Bereich von Azure RBAC.

Rollenzuweisungen sind Erweiterungsressourcen, d. h., sie gelten für eine andere Ressource. Im folgenden Beispiel wird gezeigt, wie ein Speicherkonto und eine Rollenzuweisung erstellt wird, die nur für dieses Speicherkonto gilt:

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

Wenn Sie den Bereich nicht explizit angeben, verwendet Bicep die Angabe für targetScope in der Datei. Im folgenden Beispiel wird keine scope-Eigenschaft angegeben, sodass die Rollenzuweisung auf das Abonnement beschränkt ist:

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

Tipp

Verwenden Sie den kleinsten Bereich, den Sie benötigen, um Ihre Anforderungen zu erfüllen.

Wenn Sie beispielsweise einer verwalteten Identität Zugriff auf ein einzelnes Speicherkonto gewähren müssen, empfiehlt es sich aus Sicherheitsgründen, die Rollenzuweisung im Bereich des Speicherkontos und nicht im Bereich der Ressourcengruppe oder des Abonnements zu erstellen.

Name

Der Ressourcenname einer Rollenzuweisung muss eine GUID (Globally Unique Identifier) sein.

Die Ressourcennamen von Rollenzuweisungen müssen innerhalb des Microsoft Entra-Mandanten eindeutig sein, auch wenn der Gültigkeitsbereich kleiner ist.

Damit Ihre Bicep-Bereitstellung wiederholt werden kann, ist es wichtig, dass der Name deterministisch ist, d. h. bei jeder Bereitstellung muss derselbe Namen verwendet werden. Es ist sinnvoll, eine GUID mit einer Kombination aus Bereich, Prinzipal-ID und Rollen-ID zu erstellen. Es wird empfohlen, die Funktion guid() zu verwenden, um eine deterministische GUID für Ihre Rollenzuweisungsnamen zu erstellen, wie in diesem Beispiel:

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

Rollendefinitions-ID

Die zugewiesene Rolle kann eine integrierte Rollendefinition oder eine benutzerdefinierte Rollendefinition sein. Um eine integrierte Rollendefinition zu verwenden, suchen Sie die entsprechende Rollendefinitions-ID. Beispielsweise hat die Rolle Mitwirkender die Rollendefinitions-ID b24988ac-6180-42a0-ab88-20f7382dd24c.

Wenn Sie die Rollenzuweisungsressource erstellen, müssen Sie eine vollqualifizierte Ressourcen-ID angeben. Integrierte Rollendefinitions-IDs sind Ressourcen mit Abonnementbereich. Es empfiehlt sich, mithilfe einer existing-Ressource auf die integrierte Rolle zu verweisen und mit der .id-Eigenschaft auf die voll qualifizierte Ressourcen-ID zuzugreifen:

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

Prinzipal

Die Eigenschaft principalId muss auf eine GUID festgelegt werden, die den Microsoft Entra-Bezeichner für den Prinzipal repräsentiert. In Microsoft Entra ID wird dies mitunter als Objekt-ID bezeichnet.

Die Eigenschaft principalType gibt an, ob es sich bei dem Prinzipal um einen Benutzer, eine Gruppe oder einen Dienstprinzipal handelt. Verwaltete Identitäten sind eine Form von Dienstprinzipal.

Tipp

Es ist wichtig, die Eigenschaft principalType festzulegen, wenn Sie in Bicep eine Rollenzuweisung erstellen. Andernfalls kann es zu zeitweiligen Bereitstellungsfehlern kommen, insbesondere wenn Sie mit Dienstprinzipalen und verwalteten Identitäten arbeiten.

Das folgende Beispiel zeigt, wie Sie eine benutzerseitig zugewiesene verwaltete Identität und Rollenzuweisung erstellen:

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

Verhalten der Ressourcenlöschung

Wenn Sie Benutzer*innen, Gruppen, Dienstprinzipale oder verwaltete Identitäten aus Microsoft Entra ID löschen, empfiehlt es sich, alle entsprechenden Rollenzuweisungen zu löschen. Sie werden nicht automatisch gelöscht.

Alle Rollenzuweisungen, die auf eine gelöschte Prinzipal-ID verweisen, werden ungültig. Wenn Sie versuchen, den Namen einer Rollenzuweisung für eine andere Rollenzuweisung wiederzuverwenden, schlägt die Bereitstellung fehl. Um dieses Verhalten zu umgehen, sollten Sie entweder die alte Rollenzuweisung entfernen, bevor Sie es neu erstellen oder sicherstellen, dass Sie einen eindeutigen Namen verwenden, wenn Sie eine neue Rollenzuweisung bereitstellen. Diese Schnellstartvorlage veranschaulicht, wie Sie eine Rollenzuweisung in einem Bicep-Modul definieren und eine Prinzipal-ID als Startwert für den Rollenzuweisungsnamen verwenden können.

Benutzerdefinierte Rollendefinitionen

Benutzerdefinierte Rollendefinitionen ermöglichen es Ihnen, einen Satz von Berechtigungen zu definieren, der dann anhand einer Rollenzuweisung einem Prinzipal zugewiesen werden kann. Weitere Informationen zu Rollendefinitionen finden Sie unter Grundlegendes zu Rollendefinitionen für Azure-Ressourcen.

Um eine benutzerdefinierte Rollendefinition zu erstellen, definieren Sie eine Ressource des Typs Microsoft.Authorization/roleDefinitions. Im Schnellstart Erstellen einer neuen Rolle über eine Bereitstellung auf Abonnementebene finden Sie ein Beispiel.

Die Ressourcennamen von Rollendefinitionen müssen innerhalb des Microsoft Entra-Mandanten eindeutig sein, auch wenn die zuweisbaren Bereiche kleiner sind.

Hinweis

Einige Dienste verwalten eigene Rollendefinitionen und -zuweisungen. Azure Cosmos DB verwaltet z. B. die eigenen Ressourcen Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments und Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions. Weitere Informationen finden Sie in der Dokumentation des jeweiligen Diensts.