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

Ří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í rozhraní Azure PowerShell nebo Azure CLI můžete role přiřazovat pomocí Azure Resource Manager šablon. Šablony mohou být užitečné, pokud potřebujete nasazovat prostředky konzistentně a opakovaně. Tento článek popisuje, jak přiřadit role pomocí šablon.

Požadavky

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

  • Microsoft.Authorization/roleAssignments/write oprávnění, jako je Microsoft.Authorization/roleAssignments/write nebo vlastník

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í rozhraní příkazového řádku Azure Azure Portal, Azure PowerShell nebo Azure CLI.

Uživatel

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 objectId --output tsv)

Group (Skupina)

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 objectId --output tsv)

Spravované identity

K získání ID spravované identity můžete použít příkazy Get-AzAdServiceprincipalnebo az ad sp.

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

Aplikace

K získání ID objektu služby (identity používané aplikací) můžete použít příkazy Get-AzADServicePrincipal nebo az ad sp list. Pro objekt služby použijte ID objektu, a ne ID aplikace.

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

Přiřazení role Azure

V Azure RBAC přidělíte přístup přiřazením role.

Obor skupiny prostředků (bez parametrů)

Následující šablona ukazuje základní způsob přiřazení role. Některé hodnoty jsou zadány v rámci šablony. Následující šablona ukazuje:

  • Přiřazení role Čtenář uživateli, skupině nebo aplikaci v oboru skupiny prostředků

Pokud chcete šablonu použít, musíte provést následující:

  • Vytvoření nového souboru JSON a zkopírování šablony
  • Nahraďte ID uživatele, skupiny, spravované identity nebo aplikace, ke které <your-principal-id> chcete přiřadit roli.
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2018-09-01-preview",
            "name": "[guid(resourceGroup().id)]",
            "properties": {
                "roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
                "principalId": "<your-principal-id>"
            }
        }
    ]
}

Tady jsou příklady příkazů New-AzResourceGroupDeployment a az deployment group create pro spuštění nasazení ve skupině prostředků s názvem 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í moc flexibilní. Následující šablona používá parametry a lze ji 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
  • Jak zadat role 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, ke které se má role přiřadit
  • 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": "2018-09-01-preview",
            "name": "[parameters('roleNameGuid')]",
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

Poznámka

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

Rozsah přiřazení role se určuje z úrovně nasazení. Tady jsou příklady příkazů New-AzResourceGroupDeployment a az deployment group create pro spuštění nasazení v oboru skupiny prostředků.

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 je příklad příkazů New-AzDeployment a az deployment sub create, jak spustit nasazení v oboru předplatného a zadat 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 vlastnost přiřazení role na scope 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ě
  • Jak zadat role 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, ke které se má role přiřadit
{
    "$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": "2020-04-01-preview",
            "name": "[parameters('roleNameGuid')]",
            "scope": "[concat('Microsoft.Storage/storageAccounts', '/', variables('storageName'))]",
            "dependsOn": [
                "[variables('storageName')]"
            ],
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

K nasazení předchozí šablony použijte příkazy skupiny prostředků. Tady jsou příklady příkazů New-AzResourceGroupDeployment a az deployment group create pro spuštění nasazení v oboru prostředků.

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ásledující příklad ukazuje 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ý objekt služby

Pokud vytvoříte nový instanční objekt a okamžitě se pokusíte přiřadit roli k instančnímu objektu, může toto přiřazení role 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 instančnímu objektu ve stejné Azure Resource Manager, 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. K přiřazení role ale může dojít v jiné oblasti, ve které se instanční objekt ještě nereplikoval.

Tento scénář řešíte tak, že při principalType vytváření přiřazení role nastavíte vlastnost na ServicePrincipal . Musíte také nastavit apiVersion přiřazení role na nebo 2018-09-01-preview novější.

Následující šablona ukazuje:

  • Vytvoření nového objektu služby spravované identity
  • Jak zadat principalType
  • Přiřazení role Přispěvatel k tomtou objektu služby 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": "2018-09-01-preview",
            "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 jsou příklady příkazů New-AzResourceGroupDeployment a az deployment group create pro spuštění nasazení v oboru skupiny prostředků.

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

Následující příklad ukazuje příklad přiřazení role Přispěvatel k novému objektu služby spravované identity po nasazení šablony.

Role assignment for a new managed identity service principal

Další kroky