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 moet 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 de kwaliteit van uw infrastructuur als code helpen 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 snelstartvoorbeeld.

Vereisten

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

U moet de volgende versies gebruiken:

  • 2018-09-01-preview of hoger om een Azure-rol toe te wijzen aan een nieuwe service-principal
  • 2020-04-01-preview of hoger om een Azure-rol toe te wijzen aan het 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 volgende indeling: 11111111-1111-1111-1111-111111111111. U kunt de id ophalen met behulp van Azure Portal, Azure PowerShell of Azure CLI.

User

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 Get-AzAdServiceprincipal of az ad sp-opdrachten 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 (identiteit die door een toepassing wordt gebruikt), 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. De volgende sjabloon demonstreert:

  • De rol Lezer toewijzen aan een gebruiker, groep of toepassing binnen een resourcegroepbereik

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

  • Een nieuw JSON-bestand maken en de sjabloon kopiëren
  • Vervang <your-principal-id> door de id van een gebruiker, groep, beheerde identiteit of toepassing om de rol toe te wijzen aan
{
    "$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 voor het maken van new-AzResourceGroupDeployment en az deployment group 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 roltoewijzing Lezer voor een gebruiker voor een resourcegroep nadat de sjabloon is geïmplementeerd.

Role assignment at resource group scope

Resourcegroep of abonnementsbereik

De vorige sjabloon is niet erg flexibel. De volgende sjabloon maakt gebruik van parameters en kan worden gebruikt voor verschillende bereiken. De volgende sjabloon demonstreert:

  • Een rol toewijzen aan een gebruiker, groep of toepassing op een resourcegroep of abonnementsbereik
  • De rollen Eigenaar, Inzender en Lezer opgeven als 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 mislukt de volgende implementaties met een Conflict: RoleAssignmentExists fout.

Het bereik van de roltoewijzing wordt bepaald op basis van het niveau van de implementatie. Hier volgen voorbeelden van opdrachten voor het maken van de implementatiegroep New-AzResourceGroupDeployment en az deployment group voor het starten van de implementatie in een resourcegroepbereik.

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 opdrachten voor 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.

De volgende sjabloon demonstreert:

  • Een nieuw opslagaccount maken
  • Een rol toewijzen aan een gebruiker, groep of toepassing in het bereik van het opslagaccount
  • De rollen Eigenaar, Inzender en Lezer opgeven als 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 voor het maken van de implementatiegroep New-AzResourceGroupDeployment en az deployment group 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 voor een gebruiker voor een opslagaccount nadat de sjabloon is geïmplementeerd.

Role assignment at resource scope

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 apiVersion van de roltoewijzing instellen op 2018-09-01-preview of hoger. 2022-04-01 is de eerste stabiele versie.

De volgende sjabloon demonstreert:

  • Een nieuwe service-principal voor beheerde identiteit maken
  • Het opgeven van de principalType
  • De rol Inzender toewijzen aan die service-principal in een 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 voor het maken van de implementatiegroep New-AzResourceGroupDeployment en az deployment group voor het starten van de implementatie in een resourcegroepbereik.

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 voor een nieuwe service-principal voor beheerde identiteiten na het implementeren van de sjabloon.

Role assignment for a new managed identity service principal

Volgende stappen