Tilldela Azure-roller med hjälp av Azure Resource Manager-mallar

Rollbaserad åtkomstkontroll i Azure (Azure RBAC) är det auktoriseringssystem som du använder för att hantera åtkomst till Azure-resurser. Om du vill bevilja åtkomst tilldelar du roller till användare, grupper, tjänsthuvudnamn eller hanterade identiteter i ett visst omfång. Förutom att använda Azure PowerShell eller Azure CLI kan du tilldela roller med hjälp av Azure Resource Manager-mallar. Mallar kan vara användbara om du behöver distribuera resurser konsekvent och upprepade gånger. I den här artikeln beskrivs hur du tilldelar roller med hjälp av mallar.

Kommentar

Bicep är ett nytt språk för att definiera dina Azure-resurser. Den har en enklare redigeringsupplevelse än JSON, tillsammans med andra funktioner som hjälper till att förbättra kvaliteten på infrastrukturen som kod. Vi rekommenderar att alla som är nya i infrastrukturen som kod i Azure använder Bicep i stället för JSON.

Mer information om hur du definierar rolltilldelningar med hjälp av Bicep finns i Skapa Azure RBAC-resurser med hjälp av Bicep. Ett snabbstartsexempel finns i Snabbstart: Tilldela en Azure-roll med Bicep.

Förutsättningar

För att tilldela Azure-roller måste du ha:

Du måste använda följande versioner:

  • 2018-09-01-preview eller senare för att tilldela en Azure-roll till ett nytt huvudnamn för tjänsten
  • 2020-04-01-preview eller senare för att tilldela en Azure-roll i resursomfånget
  • 2022-04-01 är den första stabila versionen

Mer information finns i API-versioner av Azure RBAC REST API:er.

Hämta objekt-ID:t

Om du vill tilldela en roll måste du ange ID för den användare, grupp eller det program som du vill tilldela rollen till. ID:t har formatet : 11111111-1111-1111-1111-111111111111. Du kan hämta ID:t med hjälp av Azure-portalen, Azure PowerShell eller Azure CLI.

User

Om du vill hämta ID:t för en användare kan du använda kommandona Get-AzADUser eller az ad user show .

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

Grupp

Om du vill hämta ID:t för en grupp kan du använda kommandona Get-AzADGroup eller az ad group show .

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

Hanterade identiteter

Om du vill hämta ID:t för en hanterad identitet kan du använda Kommandona Get-AzAdServiceprincipal eller az ad sp .

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

Program

Om du vill hämta ID:t för ett tjänsthuvudnamn (identitet som används av ett program) kan du använda kommandona Get-AzADServicePrincipal eller az ad sp list . För tjänstens huvudnamn använder du objekt-ID:t och inte program-ID:t.

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

Tilldela en Azure-roll

För att bevilja åtkomst i Azure RBAC tilldelar du en roll.

Resursgruppsomfång (utan parametrar)

Följande mall visar ett grundläggande sätt att tilldela en roll. Vissa värden anges i mallen. Följande mall visar:

  • Så här tilldelar du rollen Läsare till en användare, grupp eller ett program i ett resursgruppsomfång

Om du vill använda mallen måste du göra följande:

  • Skapa en ny JSON-fil och kopiera mallen
  • Ersätt <your-principal-id> med ID:t för en användare, grupp, hanterad identitet eller ett program för att tilldela rollen till
{
    "$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>"
            }
        }
    ]
}

Här är exempel på kommandona New-AzResourceGroupDeployment och az deployment group create för hur du startar distributionen i en resursgrupp med namnet ExampleGroup.

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

Följande visar ett exempel på rolltilldelningen Läsare till en användare för en resursgrupp efter att mallen har distribuerats.

Role assignment at resource group scope

Resursgrupp eller prenumerationsomfång

Den tidigare mallen är inte särskilt flexibel. Följande mall använder parametrar och kan användas i olika omfång. Följande mall visar:

  • Så här tilldelar du en roll till en användare, grupp eller ett program i antingen en resursgrupp eller prenumerationsomfång
  • Så här anger du rollerna Ägare, Deltagare och Läsare som en parameter

Om du vill använda mallen måste du ange följande indata:

  • ID för en användare, grupp, hanterad identitet eller ett program för att tilldela rollen till
  • Ett unikt ID som ska användas för rolltilldelningen, eller så kan du använda standard-ID:t
{
    "$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')]"
            }
        }
    ]
}

Kommentar

Den här mallen är inte idempotent om inte samma roleNameGuid värde anges som en parameter för varje distribution av mallen. Om inget roleNameGuid anges genereras som standard ett nytt GUID för varje distribution och efterföljande distributioner misslyckas med ett Conflict: RoleAssignmentExists fel.

Omfånget för rolltilldelningen bestäms från distributionsnivån. Här är exempel på kommandona New-AzResourceGroupDeployment och az deployment group create för hur du startar distributionen i ett resursgruppsomfång.

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

Här är exempel på kommandona New-AzDeployment och az deployment sub create för hur du startar distributionen i ett prenumerationsomfång och anger platsen.

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

Resursomfång

Om du behöver tilldela en roll på resursnivå anger du scope egenskapen för rolltilldelningen till resursens namn.

Följande mall visar:

  • Så här skapar du ett nytt lagringskonto
  • Så här tilldelar du en roll till en användare, grupp eller ett program i lagringskontots omfång
  • Så här anger du rollerna Ägare, Deltagare och Läsare som en parameter

Om du vill använda mallen måste du ange följande indata:

  • ID för en användare, grupp, hanterad identitet eller ett program för att tilldela rollen till
{
    "$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')]"
            }
        }
    ]
}

Om du vill distribuera den tidigare mallen använder du resursgruppskommandona. Här är exempel på kommandona New-AzResourceGroupDeployment och az deployment group create för hur du startar distributionen i ett resursomfång.

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

Följande visar ett exempel på rolltilldelningen Deltagare till en användare för ett lagringskonto när mallen har distribuerats.

Role assignment at resource scope

Nytt huvudnamn för tjänsten

Om du skapar ett nytt huvudnamn för tjänsten och omedelbart försöker tilldela tjänstens huvudnamn en roll kan rolltilldelningen misslyckas i vissa fall. Om du till exempel skapar en ny hanterad identitet och sedan försöker tilldela tjänstens huvudnamn en roll i samma Azure Resource Manager-mall kan rolltilldelningen misslyckas. Orsaken till det här felet är sannolikt en replikeringsfördröjning. Tjänstens huvudnamn skapas i en region. Rolltilldelningen kan dock ske i en annan region som inte har replikerat tjänstens huvudnamn ännu.

För att hantera det här scenariot bör du ange principalType egenskapen till ServicePrincipal när du skapar rolltilldelningen. Du måste även ange apiVersion för rolltilldelningen till 2018-09-01-preview eller senare. 2022-04-01 är den första stabila versionen.

Följande mall visar:

  • Så här skapar du ett nytt huvudnamn för tjänsten för hanterad identitet
  • Så här anger du principalType
  • Så här tilldelar du rollen Deltagare till tjänstens huvudnamn i ett resursgruppsomfång

Om du vill använda mallen måste du ange följande indata:

  • Basnamnet för den hanterade identiteten, eller så kan du använda standardsträngen
{
    "$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"
            }
        }
    ]
}

Här är exempel på kommandona New-AzResourceGroupDeployment och az deployment group create för hur du startar distributionen i ett resursgruppsomfång.

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

Följande visar ett exempel på rolltilldelningen Deltagare till ett nytt huvudnamn för den hanterade identitetstjänsten efter att mallen har distribuerats.

Role assignment for a new managed identity service principal

Nästa steg