Přiřazení rolí Azure pomocí šablon Azure Resource Manageru

Řízení přístupu na základě role v Azure (Azure RBAC) je autorizační systém, který používáte ke správě přístupu k prostředkům Azure. Chcete-li udělit přístup, přiřaďte role uživatelům, skupinám, instančním objektům nebo spravovaným identitám v konkrétním rozsahu. Kromě použití Azure PowerShellu nebo Azure CLI můžete role přiřadit pomocí šablon Azure Resource Manageru. Šablony můžou být užitečné, pokud potřebujete prostředky nasazovat konzistentně a opakovaně. Tento článek popisuje, jak přiřadit role pomocí šablon.

Poznámka:

Bicep je nový jazyk pro definování prostředků Azure. Má jednodušší prostředí pro vytváření obsahu než JSON a další funkce, které pomáhají zlepšit kvalitu infrastruktury jako kódu. Doporučujeme, aby každý nový uživatel infrastruktury jako kód v Azure používal Bicep místo JSON.

Další informace o definování přiřazení rolí pomocí Bicep najdete v tématu Vytváření prostředků Azure RBAC pomocí Bicep. Příklad rychlého startu najdete v tématu Rychlý start: Přiřazení role Azure pomocí Bicep.

Požadavky

Pokud chcete přiřazovat role Azure, musíte mít:

Musíte použít následující verze:

  • 2018-09-01-preview nebo novější pro přiřazení role Azure k novému instančnímu objektu
  • 2020-04-01-preview nebo novější, pokud chcete přiřadit roli Azure v oboru prostředků
  • 2022-04-01 je první stabilní verze.

Další informace najdete v tématu Verze rozhraní API azure RBAC REST API.

Získání ID objektů

Pokud chcete přiřadit roli, musíte zadat ID uživatele, skupiny nebo aplikace, ke které chcete roli přiřadit. ID má formát: 11111111-1111-1111-1111-111111111111. ID můžete získat pomocí webu Azure Portal, Azure PowerShellu nebo Azure CLI.

Uživatelská

K získání ID uživatele můžete použít příkazy Get-AzADUser nebo az ad user show .

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

Seskupit

K získání ID skupiny můžete použít příkazy Get-AzADGroup nebo az ad group show .

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

Spravované identity

Pokud chcete získat ID spravované identity, můžete použít rutiny Get-AzAdServiceprincipal nebo 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)

Aplikace

Pokud chcete získat ID instančního objektu (identitu používanou aplikací), můžete použít příkazy Get-AzADServicePrincipal nebo az ad sp list . Pro instanční objekt použijte ID objektu, nikoli ID aplikace.

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

Přiřazení role Azure

Pokud chcete v Azure RBAC udělit přístup, přiřaďte roli.

Rozsah skupiny prostředků (bez parametrů)

Následující šablona ukazuje základní způsob přiřazení role. Některé hodnoty jsou zadané v šabloně. Následující šablona ukazuje:

Pokud chcete šablonu použít, musíte udělat toto:

  • Vytvoření nového souboru JSON a zkopírování šablony
  • Nahraďte <your-principal-id> ID uživatele, skupiny, spravované identity nebo aplikace, ke které se má role přiřadit.
{
    "$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>"
            }
        }
    ]
}

Tady je příklad New-AzResourceGroupDeployment a az deployment group create commands for how to start the deployment in a resource group group named ExampleGroup.

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

Následuje příklad přiřazení role Čtenář uživateli pro skupinu prostředků po nasazení šablony.

Role assignment at resource group scope

Rozsah skupiny prostředků nebo předplatného

Předchozí šablona není příliš flexibilní. Následující šablona používá parametry a lze je použít v různých oborech. Následující šablona ukazuje:

  • Přiřazení role uživateli, skupině nebo aplikaci v oboru skupiny prostředků nebo předplatného
  • Určení rolí Vlastník, Přispěvatel a Čtenář jako parametr

Pokud chcete šablonu použít, musíte zadat následující vstupy:

  • ID uživatele, skupiny, spravované identity nebo aplikace pro přiřazení role
  • Jedinečné ID, které se použije pro přiřazení role, nebo můžete použít výchozí 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')]"
            }
        }
    ]
}

Poznámka:

Tato šablona není idempotentní, pokud není pro každé nasazení šablony zadaná stejná roleNameGuid hodnota jako parametr. Pokud není roleNameGuid k dispozici, ve výchozím nastavení se pro každé nasazení vygeneruje nový identifikátor GUID a následná nasazení selžou s chybou Conflict: RoleAssignmentExists .

Rozsah přiřazení role se určuje z úrovně nasazení. Tady je příklad New-AzResourceGroupDeployment a az deployment group create commands for how to start the deployment at a resource group scope.

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

Tady jsou příklady příkazů New-AzDeployment a az deployment sub create pro spuštění nasazení v oboru předplatného a určení umístění.

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

Obor prostředku

Pokud potřebujete přiřadit roli na úrovni prostředku, nastavte scope vlastnost přiřazení role na název prostředku.

Následující šablona ukazuje:

  • Vytvoření nového účtu úložiště
  • Přiřazení role uživateli, skupině nebo aplikaci v oboru účtu úložiště
  • Určení rolí Vlastník, Přispěvatel a Čtenář jako parametr

Pokud chcete šablonu použít, musíte zadat následující vstupy:

  • ID uživatele, skupiny, spravované identity nebo aplikace pro přiřazení role
{
    "$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')]"
            }
        }
    ]
}

Pokud chcete nasadit předchozí šablonu, použijte příkazy skupiny prostředků. Tady je příklad New-AzResourceGroupDeployment a az deployment group create commands for how to start the deployment at a resource scope.

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

Následuje příklad přiřazení role Přispěvatel uživateli pro účet úložiště po nasazení šablony.

Role assignment at resource scope

Nový instanční objekt

Pokud vytvoříte nový instanční objekt a okamžitě se pokusíte přiřadit roli k danému instančnímu objektu, přiřazení této role může v některých případech selhat. Pokud například vytvoříte novou spravovanou identitu a pak se pokusíte přiřadit roli k danému instančnímu objektu ve stejné šabloně Azure Resource Manageru, přiřazení role může selhat. Důvodem tohoto selhání je pravděpodobně zpoždění replikace. Instanční objekt se vytvoří v jedné oblasti; Přiřazení role však může nastat v jiné oblasti, která ještě nereplikovala instanční objekt.

Pokud chcete tento scénář vyřešit, měli byste vlastnost ServicePrincipal nastavit principalType při vytváření přiřazení role. Musíte také nastavit vlastnost apiVersion přiřazení role na hodnotu 2018-09-01-preview nebo novější. 2022-04-01 je první stabilní verze.

Následující šablona ukazuje:

  • Vytvoření nového instančního objektu spravované identity
  • Jak zadat principalType
  • Přiřazení role Přispěvatel k danému instančnímu objektu v oboru skupiny prostředků

Pokud chcete šablonu použít, musíte zadat následující vstupy:

  • Základní název spravované identity nebo můžete použít výchozí řetězec.
{
    "$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"
            }
        }
    ]
}

Tady je příklad New-AzResourceGroupDeployment a az deployment group create commands for how to start the deployment at a resource group scope.

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

Následuje příklad přiřazení role Přispěvatel k novému instančnímu objektu spravované identity po nasazení šablony.

Role assignment for a new managed identity service principal

Další kroky