Zuweisen von Azure-Rollen mithilfe von Azure Resource Manager-Vorlagen

Azure RBAC (Role-Based Access Control, rollenbasierte Zugriffssteuerung) ist das Autorisierungssystem für die Verwaltung des Zugriffs auf Azure-Ressourcen. Sie weisen Benutzern, Gruppen, Dienstprinzipalen oder verwalteten Identitäten für einen bestimmten Bereich Rollen zu, um diesen Zugriff zu gewähren. Zusätzlich zur Verwendung von Azure PowerShell oder der Azure CLI können Sie Rollen mithilfe von Azure Resource Manager-Vorlagen zuweisen. Vorlagen können hilfreich sein, wenn Sie Ressourcen konsistent und wiederholt bereitstellen müssen. In diesem Artikel wird das Zuweisen von Rollen mithilfe von Vorlagen beschrieben.

Hinweis

Bicep ist eine neue Sprache für die Definition Ihrer Azure-Ressourcen. Mit dieser Sprache wird die Erstellung gegenüber JSON vereinfacht. Außerdem profitieren Sie von weiteren Features, mit denen Sie die Qualität Ihrer IaC-Bereitstellung (Infrastructure-as-Code) verbessern können. Wenn Sie noch nicht mit Infrastructure-as-Code in Azure vertraut sind, sollten Sie Bicep anstelle von JSON verwenden.

Informationen zum Definieren von Rollenzuweisungen mithilfe von Bicep finden Sie unter Erstellen von Azure RBAC-Ressourcen mithilfe von Bicep. Ein Schnellstartbeispiel finden Sie unter Schnellstart: Zuweisen einer Azure-Rolle mithilfe von Bicep.

Voraussetzungen

Zum Zuweisen von Azure-Rollen müssen Sie über Folgendes verfügen:

Sie müssen die folgenden Versionen verwenden:

  • 2018-09-01-preview oder höher, um eine Azure-Rolle einem neuen Dienstprinzipal zuzuweisen
  • 2020-04-01-preview oder höher, um eine Azure-Rolle im Ressourcenbereich zuzuweisen
  • 2022-04-01 ist die erste stabile Version.

Weitere Informationen finden Sie unter API-Versionen von Azure RBAC REST-APIs.

Abrufen von Objekt-IDs

Um eine Rolle zuzuweisen, müssen Sie die ID des Benutzers, der Gruppe oder der Anwendung angeben, dem bzw. der Sie die Rolle zuweisen möchten. Die ID weist dieses Format auf: 11111111-1111-1111-1111-111111111111. Sie können die ID über das Azure-Portal, Azure PowerShell oder die Azure-Befehlszeilenschnittstelle (Azure CLI) abrufen.

Benutzer

Zum Abrufen eines Benutzers können Sie die Befehle Get-AzADUser oder az ad user show verwenden.

$objectid = (Get-AzADUser -DisplayName "{name}").id
objectid=$(az ad user show --id "{email}" --query id --output tsv)

Group

Zum Abrufen einer Gruppe können Sie die Befehle Get-AzADGroup oder az ad group show verwenden.

$objectid = (Get-AzADGroup -DisplayName "{name}").id
objectid=$(az ad group show --group "{name}" --query id --output tsv)

Verwaltete Identitäten

Zum Abrufen der ID einer verwalteten Identität können Sie die Befehle Get-AzAdServiceprincipal oder az ad sp verwenden.

$objectid = (Get-AzADServicePrincipal -DisplayName <Azure resource name>).id
objectid=$(az ad sp list --display-name <Azure resource name> --query [].id --output tsv)

Application

Zum Abrufen eines Dienstprinzipals (eine von einer Anwendung verwendete Identität) können Sie die Befehle Get-AzADServicePrincipal oder az ad sp list verwenden. Verwenden Sie für einen Dienstprinzipal die Objekt-ID und nicht die Anwendungs-ID.

$objectid = (Get-AzADServicePrincipal -DisplayName "{name}").id
objectid=$(az ad sp list --display-name "{name}" --query [].id --output tsv)

Zuweisen einer Azure-Rolle

In Azure RBAC weisen Sie zum Gewähren des Zugriffs eine Rolle zu.

Ressourcengruppenbereich (ohne Parameter)

Die folgende Vorlage zeigt eine einfache Möglichkeit zum Zuweisen einer Rolle. Einige Werte werden in der Vorlage angegeben. Die folgende Vorlage veranschaulicht Folgendes:

  • Zuweisen der Rolle Leser zu einem Benutzer, einer Gruppe oder einer Anwendung in einem Ressourcengruppenbereich

Um die Vorlage zu verwenden, müssen Sie folgendermaßen vorgehen:

  • Erstellen Sie eine neue JSON-Datei, und kopieren Sie die Vorlage.
  • Ersetzen Sie <your-principal-id> durch die ID eines Benutzers, einer Gruppe, einer verwalteten Identität oder einer Anwendung, dem bzw. der die Rolle zugewiesen wird.
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[guid(resourceGroup().id)]",
            "properties": {
                "roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
                "principalId": "<your-principal-id>"
            }
        }
    ]
}

Im Folgenden finden Sie Beispiele für die Befehle New-AzResourceGroupDeployment und az deployment group create zum Starten der Bereitstellung in einer Ressourcengruppe mit dem Namen „ExampleGroup“.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json

Das folgende Beispiel veranschaulicht die Zuweisung der Rolle „Leser“ zu einem Benutzer für eine Ressourcengruppe nach der Bereitstellung der Vorlage.

Role assignment at resource group scope

Ressourcengruppe oder Abonnementbereich

Die vorherige Vorlage ist nicht sehr flexibel. Die folgende Vorlage enthält Parameter, die in unterschiedlichen Bereichen verwendet werden können. Die folgende Vorlage veranschaulicht Folgendes:

  • Zuweisen einer Rolle zu einem Benutzer, einer Gruppe oder einer Anwendung in einem Ressourcengruppen- oder Abonnementbereich
  • Angeben der Rollen „Besitzer“, „Mitwirkender“ und „Leser“ als Parameter

Um die Vorlage zu verwenden, müssen Sie Folgendes eingeben:

  • Die ID eines Benutzers, einer Gruppe, einer verwalteten Identität oder einer Anwendung, dem bzw. der die Rolle zugewiesen wird
  • Eine eindeutige ID, die für die Rollenzuweisung verwendet wird (oder alternativ die Standard-ID)
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "principalId": {
            "type": "string",
            "metadata": {
                "description": "The principal to assign the role to"
            }
        },
        "builtInRoleType": {
            "type": "string",
            "allowedValues": [
                "Owner",
                "Contributor",
                "Reader"
            ],
            "metadata": {
                "description": "Built-in role to assign"
            }
        },
        "roleNameGuid": {
            "type": "string",
            "defaultValue": "[newGuid()]",
            "metadata": {
                "description": "A new GUID used to identify the role assignment"
            }
        }
    },
    "variables": {
        "Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
        "Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    },
    "resources": [
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[parameters('roleNameGuid')]",
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

Hinweis

Diese Vorlage ist nicht idempotent, es sei denn, derselbe roleNameGuid-Wert wird als Parameter bei jeder Bereitstellung der Vorlage bereitgestellt. Wenn keine roleNameGuid angegeben wird, wird standardmäßig für jede Bereitstellung eine neue GUID generiert, und bei nachfolgenden Bereitstellungen tritt ein Conflict: RoleAssignmentExists-Fehler auf.

Der Bereich der Rollenzuweisung wird von der Bereitstellungsebene bestimmt. Im Folgenden finden Sie Beispiele für die Befehle New-AzResourceGroupDeployment und az deployment group create zum Starten der Bereitstellung in einem Ressourcengruppenbereich.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader

Im Folgenden finden Sie Beispiele für die Befehle New-AzDeployment und az deployment sub create zum Starten der Bereitstellung in einem Abonnementbereich und zum Angeben des Standorts.

New-AzDeployment -Location centralus -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment sub create --location centralus --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader

Ressourcenumfang

Wenn Sie auf der Ebene einer Ressource eine Rolle zuweisen möchten, legen Sie für die scope-Eigenschaft der Rollenzuweisung den Namen der Ressource fest.

Die folgende Vorlage veranschaulicht Folgendes:

  • Erstellen eines neuen Speicherkontos
  • Zuweisen einer Rolle zu einem Benutzer, einer Gruppe oder einer Anwendung im Speicherkontobereich
  • Angeben der Rollen „Besitzer“, „Mitwirkender“ und „Leser“ als Parameter

Um die Vorlage zu verwenden, müssen Sie Folgendes eingeben:

  • Die ID eines Benutzers, einer Gruppe, einer verwalteten Identität oder einer Anwendung, dem bzw. der die Rolle zugewiesen wird
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "principalId": {
            "type": "string",
            "metadata": {
                "description": "The principal to assign the role to"
            }
        },
        "builtInRoleType": {
            "type": "string",
            "allowedValues": [
                "Owner",
                "Contributor",
                "Reader"
            ],
            "metadata": {
                "description": "Built-in role to assign"
            }
        },
        "roleNameGuid": {
            "type": "string",
            "defaultValue": "[newGuid()]",
            "metadata": {
                "description": "A new GUID used to identify the role assignment"
            }
        },
        "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]"
        }
    },
    "variables": {
        "Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
        "Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
        "storageName": "[concat('storage', uniqueString(resourceGroup().id))]"
    },
    "resources": [
        {
            "apiVersion": "2019-04-01",
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('storageName')]",
            "location": "[parameters('location')]",
            "sku": {
                "name": "Standard_LRS"
            },
            "kind": "Storage",
            "properties": {}
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[parameters('roleNameGuid')]",
            "scope": "[concat('Microsoft.Storage/storageAccounts', '/', variables('storageName'))]",
            "dependsOn": [
                "[variables('storageName')]"
            ],
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

Zum Bereitstellen der vorherigen Vorlage verwenden Sie die Befehle für die Ressourcengruppe. Im Folgenden finden Sie Beispiele für die Befehle New-AzResourceGroupDeployment und az deployment group create zum Starten der Bereitstellung in einem Ressourcenbereich.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Contributor
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Contributor

Das folgende Beispiel veranschaulicht die Zuweisung der Rolle „Mitwirkender“ zu einem Benutzer für ein Speicherkonto nach dem Bereitstellen der Vorlage.

Role assignment at resource scope

Neuer Dienstprinzipal

Wenn Sie einen neuen Dienstprinzipal erstellen und sofort versuchen, diesem eine Rolle zuzuweisen, kann die Rollenzuweisung in einigen Fällen fehlschlagen. Wenn Sie z. B. eine neue verwaltete Identität erstellen und dann versuchen, in derselben Azure Resource Manager-Vorlage dem Dienstprinzipal eine Rolle zuzuweisen, kann die Rollenzuweisung fehlschlagen. Der Grund für diesen Fehler ist wahrscheinlich eine Replikationsverzögerung. Der Dienstprinzipal wird in einer Region erstellt, die Rollenzuweisung kann aber in einer anderen Region stattfinden, in die der Dienstprinzipal noch nicht repliziert wurde.

Um dieses Szenario zu beheben, sollten Sie beim Erstellen der Rollenzuweisung die principalType-Eigenschaft auf ServicePrincipal festlegen. Sie müssen auch die apiVersion der Rollenzuweisung auf Version 2018-09-01-preview oder höher festlegen. 2022-04-01 ist die erste stabile Version.

Die folgende Vorlage veranschaulicht Folgendes:

  • Erstellen eines neuen Dienstprinzipals für verwaltete Identitäten
  • Angeben des principalType
  • Zuweisen der Rolle „Mitwirkender“ zu dem Dienstprinzipal in einem Ressourcengruppenbereich

Um die Vorlage zu verwenden, müssen Sie Folgendes eingeben:

  • Den Basisnamen der verwalteten Identität, oder Sie können die Standardzeichenfolge verwenden.
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "baseName": {
            "type": "string",
            "defaultValue": "msi-test"
        }
    },
    "variables": {
        "identityName": "[concat(parameters('baseName'), '-bootstrap')]",
        "bootstrapRoleAssignmentId": "[guid(concat(resourceGroup().id, 'contributor'))]",
        "contributorRoleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]"
    },
    "resources": [
        {
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
            "name": "[variables('identityName')]",
            "apiVersion": "2018-11-30",
            "location": "[resourceGroup().location]"
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[variables('bootstrapRoleAssignmentId')]",
            "dependsOn": [
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
            ],
            "properties": {
                "roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
                "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName')), '2018-11-30').principalId]",
                "principalType": "ServicePrincipal"
            }
        }
    ]
}

Im Folgenden finden Sie Beispiele für die Befehle New-AzResourceGroupDeployment und az deployment group create zum Starten der Bereitstellung in einem Ressourcengruppenbereich.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup2 -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup2 --template-file rbac-test.json

Das folgende Beispiel veranschaulicht die Zuweisung der Rolle „Mitwirkender“ zu einem neuen Dienstprinzipal für verwaltete Identitäten nach dem Bereitstellen der Vorlage.

Role assignment for a new managed identity service principal

Nächste Schritte