Azure-rollen toewijzen met behulp van Azure Resource Manager-sjablonen

Op rollen gebaseerd toegangsbeheer van Azure (Azure RBAC) is het autorisatiesysteem om de toegang tot Azure-resources te beheren. Als u toegang wilt verlenen, wijst u rollen toe aan gebruikers, groepen, service-principals of beheerde identiteiten voor een bepaald bereik. Naast het gebruik van Azure PowerShell of de Azure CLI kunt u rollen toewijzen met behulp van Azure Resource Manager-sjablonen. Sjablonen kunnen handig zijn als u resources consistent en herhaaldelijk wilt implementeren. In dit artikel wordt beschreven hoe u rollen toewijst met behulp van sjablonen.

Notitie

Bicep is een nieuwe taal voor het definiëren van uw Azure-resources. Het heeft een eenvoudigere ontwerpervaring dan JSON, samen met andere functies die helpen de kwaliteit van uw infrastructuur als code te verbeteren. Het is raadzaam dat iedereen die niet bekend is met infrastructuur als code in Azure Bicep gebruikt in plaats van JSON.

Zie Azure RBAC-resources maken met bicep voor meer informatie over het definiëren van roltoewijzingen met behulp van Bicep. Zie Quickstart: Een Azure-rol toewijzen met bicep voor een voorbeeld van een quickstart.

Vereisten

Als u Azure-rollen wilt toewijzen, hebt u het volgende nodig:

U moet de volgende versies gebruiken:

  • 2018-09-01-preview of later om een Azure-rol toe te wijzen aan een nieuwe service-principal
  • 2020-04-01-preview of later om een Azure-rol toe te wijzen op resourcebereik
  • 2022-04-01 is de eerste stabiele versie

Zie API-versies van Azure RBAC REST API's voor meer informatie.

Object-id's ophalen

Als u een rol wilt toewijzen, moet u de id opgeven van de gebruiker, groep of toepassing waaraan u de rol wilt toewijzen. De id heeft de indeling: 11111111-1111-1111-1111-111111111111. U kunt de id ophalen met behulp van de Azure Portal, Azure PowerShell of Azure CLI.

Gebruiker

Als u de id van een gebruiker wilt ophalen, kunt u de opdrachten Get-AzADUser of az ad user show gebruiken.

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

Groep

Als u de id van een groep wilt ophalen, kunt u de opdrachten Get-AzADGroup of az ad group show gebruiken.

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

Beheerde identiteiten

Als u de id van een beheerde identiteit wilt ophalen, kunt u de opdrachten Get-AzAdServiceprincipal of az ad sp gebruiken.

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

Toepassing

Als u de id van een service-principal wilt ophalen (identiteit die wordt gebruikt door een toepassing), kunt u de opdrachten Get-AzADServicePrincipal of az ad sp list gebruiken. Gebruik voor een service-principal de object-id en niet de toepassings-id.

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

Een Azure-rol toewijzen

In Azure RBAC wijst u een rol toe om toegang te verlenen.

Bereik van resourcegroep (zonder parameters)

In de volgende sjabloon ziet u een eenvoudige manier om een rol toe te wijzen. Sommige waarden worden opgegeven in de sjabloon. In de volgende sjabloon ziet u het volgende:

  • De rol Lezer toewijzen aan een gebruiker, groep of toepassing binnen het bereik van een resourcegroep

Als u de sjabloon wilt gebruiken, moet u het volgende doen:

  • Een nieuw JSON-bestand maken en de sjabloon kopiëren
  • Vervang door <your-principal-id> de id van een gebruiker, groep, beheerde identiteit of toepassing waaraan u de rol wilt toewijzen
{
    "$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>"
            }
        }
    ]
}

Hier volgen voorbeelden van opdrachten New-AzResourceGroupDeployment en az deployment group create voor het starten van de implementatie in een resourcegroep met de naam ExampleGroup.

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

Hieronder ziet u een voorbeeld van de toewijzing van de rol Lezer aan een gebruiker voor een resourcegroep na het implementeren van de sjabloon.

Roltoewijzing op resourcegroepbereik

Resourcegroep of abonnementsbereik

De vorige sjabloon is niet erg flexibel. De volgende sjabloon maakt gebruik van parameters en kan worden gebruikt in verschillende bereiken. In de volgende sjabloon ziet u het volgende:

  • Een rol toewijzen aan een gebruiker, groep of toepassing in een resourcegroep of abonnementsbereik
  • De rollen Eigenaar, Inzender en Lezer opgeven als een parameter

Als u de sjabloon wilt gebruiken, moet u de volgende invoer opgeven:

  • De id van een gebruiker, groep, beheerde identiteit of toepassing waaraan de rol moet worden toegewezen
  • Een unieke id die wordt gebruikt voor de roltoewijzing, of u kunt de standaard-id gebruiken
{
    "$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')]"
            }
        }
    ]
}

Notitie

Deze sjabloon is niet idempotent, tenzij dezelfde roleNameGuid waarde wordt opgegeven als een parameter voor elke implementatie van de sjabloon. Als er geen roleNameGuid is opgegeven, wordt standaard een nieuwe GUID gegenereerd voor elke implementatie en zullen volgende implementaties mislukken met een Conflict: RoleAssignmentExists fout.

Het bereik van de roltoewijzing wordt bepaald op basis van het implementatieniveau. Hier volgen voorbeelden van opdrachten New-AzResourceGroupDeployment en az deployment group create voor het starten van de implementatie in het bereik van een resourcegroep.

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

Hier volgen voorbeelden van de opdrachten New-AzDeployment en az deployment sub create voor het starten van de implementatie in een abonnementsbereik en het opgeven van de locatie.

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

Resourcebereik

Als u een rol wilt toewijzen op het niveau van een resource, stelt u de scope eigenschap voor de roltoewijzing in op de naam van de resource.

In de volgende sjabloon ziet u het volgende:

  • Een nieuw opslagaccount maken
  • Een rol toewijzen aan een gebruiker, groep of toepassing binnen het bereik van het opslagaccount
  • De rollen Eigenaar, Inzender en Lezer opgeven als een parameter

Als u de sjabloon wilt gebruiken, moet u de volgende invoer opgeven:

  • De id van een gebruiker, groep, beheerde identiteit of toepassing waaraan de rol moet worden toegewezen
{
    "$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')]"
            }
        }
    ]
}

Als u de vorige sjabloon wilt implementeren, gebruikt u de opdrachten van de resourcegroep. Hier volgen voorbeelden van opdrachten New-AzResourceGroupDeployment en az deployment group create voor het starten van de implementatie in een resourcebereik.

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

Hieronder ziet u een voorbeeld van de roltoewijzing Inzender aan een gebruiker voor een opslagaccount nadat de sjabloon is geïmplementeerd.

Roltoewijzing op resourcebereik

Nieuwe service-principal

Als u een nieuwe service-principal maakt en onmiddellijk probeert een rol toe te wijzen aan die service-principal, kan die roltoewijzing in sommige gevallen mislukken. Als u bijvoorbeeld een nieuwe beheerde identiteit maakt en vervolgens probeert een rol toe te wijzen aan die service-principal in dezelfde Azure Resource Manager-sjabloon, kan de roltoewijzing mislukken. De reden voor deze fout is waarschijnlijk een replicatievertraging. De service-principal wordt in één regio gemaakt; De roltoewijzing kan echter plaatsvinden in een andere regio die de service-principal nog niet heeft gerepliceerd.

Als u dit scenario wilt aanpakken, moet u de principalType eigenschap ServicePrincipal instellen op bij het maken van de roltoewijzing. U moet ook de apiVersion van de roltoewijzing instellen op 2018-09-01-preview of hoger. 2022-04-01 is de eerste stabiele versie.

In de volgende sjabloon ziet u het volgende:

  • Een nieuwe service-principal voor beheerde identiteit maken
  • Het opgeven van de principalType
  • De rol Inzender toewijzen aan die service-principal in het bereik van een resourcegroep

Als u de sjabloon wilt gebruiken, moet u de volgende invoer opgeven:

  • De basisnaam van de beheerde identiteit of u kunt de standaardtekenreeks gebruiken
{
    "$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"
            }
        }
    ]
}

Hier volgen voorbeelden van opdrachten New-AzResourceGroupDeployment en az deployment group create voor het starten van de implementatie in het bereik van een resourcegroep.

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

Hieronder ziet u een voorbeeld van de roltoewijzing Inzender aan een nieuwe service-principal voor beheerde identiteiten na het implementeren van de sjabloon.

Roltoewijzing voor een nieuwe service-principal voor beheerde identiteit

Volgende stappen