Przypisywanie ról platformy Azure przy użyciu szablonów usługi Azure Resource Manager

Kontrola dostępu oparta na rolach (RBAC) platformy Azure to system autoryzacji używany do zarządzania dostępem do zasobów platformy Azure. Aby udzielić dostępu, należy przypisać role do użytkowników, grup, jednostek usług lub tożsamości zarządzanych w określonym zakresie. Oprócz korzystania z programu Azure PowerShell lub interfejsu wiersza polecenia platformy Azure można przypisywać role przy użyciu szablonów usługi Azure Resource Manager. Szablony mogą być przydatne, jeśli konieczne jest spójne i wielokrotne wdrażanie zasobów. W tym artykule opisano sposób przypisywania ról przy użyciu szablonów.

Uwaga

Bicep to nowy język definiowania zasobów platformy Azure. Ma prostsze środowisko tworzenia niż JSON wraz z innymi funkcjami, które pomagają poprawić jakość infrastruktury jako kodu. Zalecamy, aby każdy nowy użytkownik infrastruktury jako kod na platformie Azure używał kodu Bicep zamiast kodu JSON.

Aby dowiedzieć się, jak definiować przypisania ról przy użyciu Bicep, zobacz Tworzenie zasobów RBAC platformy Azure przy użyciu Bicep. Aby zapoznać się z przykładem przewodnika Szybki start, zobacz Szybki start: przypisywanie roli platformy Azure przy użyciu aplikacji Bicep.

Wymagania wstępne

Aby przypisać role platformy Azure, musisz mieć:

Należy użyć następujących wersji:

  • 2018-09-01-preview lub nowsze, aby przypisać rolę platformy Azure do nowej jednostki usługi
  • 2020-04-01-preview lub nowsze, aby przypisać rolę platformy Azure w zakresie zasobów
  • 2022-04-01 jest pierwszą stabilną wersją

Aby uzyskać więcej informacji, zobacz Wersje interfejsów API rest kontroli dostępu opartej na rolach platformy Azure.

Pobieranie identyfikatorów obiektów

Aby przypisać rolę, musisz określić identyfikator użytkownika, grupy lub aplikacji, do której chcesz przypisać rolę. Identyfikator ma format: 11111111-1111-1111-1111-111111111111. Identyfikator można uzyskać przy użyciu witryny Azure Portal, programu Azure PowerShell lub interfejsu wiersza polecenia platformy Azure.

User

Aby uzyskać identyfikator użytkownika, możesz użyć poleceń Get-AzADUser lub az ad user show .

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

Grupuj

Aby uzyskać identyfikator grupy, możesz użyć poleceń Get-AzADGroup lub az ad group show .

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

Tożsamości zarządzane

Aby uzyskać identyfikator tożsamości zarządzanej, możesz użyć poleceń Get-AzAdServiceprincipal lub 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)

Aplikacja

Aby uzyskać identyfikator jednostki usługi (tożsamości używanej przez aplikację), możesz użyć poleceń Get-AzADServicePrincipal lub az ad sp list . W przypadku jednostki usługi użyj identyfikatora obiektu, a nie identyfikatora aplikacji.

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

Przypisywanie roli platformy Azure

Aby udzielić dostępu na podstawie ról platformy Azure, należy przypisać rolę.

Zakres grupy zasobów (bez parametrów)

Poniższy szablon przedstawia podstawowy sposób przypisywania roli. Niektóre wartości są określone w szablonie. Poniższy szablon przedstawia następujące elementy:

  • Jak przypisać rolę Czytelnik do użytkownika, grupy lub aplikacji w zakresie grupy zasobów

Aby użyć szablonu, należy wykonać następujące czynności:

  • Tworzenie nowego pliku JSON i kopiowanie szablonu
  • Zastąp <your-principal-id> element identyfikatorem użytkownika, grupy, tożsamości zarządzanej lub aplikacji, aby przypisać rolę do
{
    "$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>"
            }
        }
    ]
}

Oto przykład Polecenia New-AzResourceGroupDeployment i az deployment group create , aby dowiedzieć się, jak rozpocząć wdrożenie w grupie zasobów o nazwie ExampleGroup.

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

Poniżej przedstawiono przykład przypisania roli Czytelnik do użytkownika dla grupy zasobów po wdrożeniu szablonu.

Role assignment at resource group scope

Grupa zasobów lub zakres subskrypcji

Poprzedni szablon nie jest bardzo elastyczny. Poniższy szablon używa parametrów i może być używany w różnych zakresach. Poniższy szablon przedstawia następujące elementy:

  • Jak przypisać rolę do użytkownika, grupy lub aplikacji w zakresie grupy zasobów lub subskrypcji
  • Jak określić role Właściciel, Współautor i Czytelnik jako parametr

Aby użyć szablonu, należy określić następujące dane wejściowe:

  • Identyfikator użytkownika, grupy, tożsamości zarządzanej lub aplikacji w celu przypisania roli do
  • Unikatowy identyfikator, który będzie używany do przypisania roli, lub można użyć domyślnego identyfikatora
{
    "$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')]"
            }
        }
    ]
}

Uwaga

Ten szablon nie jest idempotentny, chyba że ta sama roleNameGuid wartość jest podana jako parametr dla każdego wdrożenia szablonu. Jeśli nie roleNameGuid zostanie podany, domyślnie nowy identyfikator GUID jest generowany w każdym wdrożeniu, a kolejne wdrożenia kończą się niepowodzeniem Conflict: RoleAssignmentExists z powodu błędu.

Zakres przypisania roli zależy od poziomu wdrożenia. Oto przykład Polecenia New-AzResourceGroupDeployment i az deployment group create , aby dowiedzieć się, jak rozpocząć wdrażanie w zakresie grupy zasobów.

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

Poniżej przedstawiono przykład polecenia New-AzDeployment i az deployment sub create , aby dowiedzieć się, jak uruchomić wdrożenie w zakresie subskrypcji i określić lokalizację.

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

Zakres zasobu

Jeśli musisz przypisać rolę na poziomie zasobu, ustaw scope właściwość przypisania roli na nazwę zasobu.

Poniższy szablon przedstawia następujące elementy:

  • Jak utworzyć nowe konto magazynu
  • Jak przypisać rolę do użytkownika, grupy lub aplikacji w zakresie konta magazynu
  • Jak określić role Właściciel, Współautor i Czytelnik jako parametr

Aby użyć szablonu, należy określić następujące dane wejściowe:

  • Identyfikator użytkownika, grupy, tożsamości zarządzanej lub aplikacji w celu przypisania roli do
{
    "$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')]"
            }
        }
    ]
}

Aby wdrożyć poprzedni szablon, należy użyć poleceń grupy zasobów. Poniżej przedstawiono przykład polecenia New-AzResourceGroupDeployment i az deployment group create , aby dowiedzieć się, jak uruchomić wdrożenie w zakresie zasobów.

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

Poniżej przedstawiono przykład przypisania roli Współautor do użytkownika dla konta magazynu po wdrożeniu szablonu.

Role assignment at resource scope

Nowa jednostka usługi

Jeśli tworzysz nową jednostkę usługi i natychmiast spróbujesz przypisać rolę do tej jednostki usługi, przypisanie tej roli może zakończyć się niepowodzeniem w niektórych przypadkach. Jeśli na przykład utworzysz nową tożsamość zarządzaną, a następnie spróbujesz przypisać rolę do tej jednostki usługi w tym samym szablonie usługi Azure Resource Manager, przypisanie roli może zakończyć się niepowodzeniem. Przyczyną tego błędu jest prawdopodobnie opóźnienie replikacji. Jednostka usługi jest tworzona w jednym regionie; Jednak przypisanie roli może wystąpić w innym regionie, który jeszcze nie zreplikował jednostki usługi.

Aby rozwiązać ten scenariusz, należy ustawić principalType właściwość na wartość ServicePrincipal podczas tworzenia przypisania roli. Należy też ustawić właściwość apiVersion przypisania roli na 2018-09-01-preview lub nowszą wersję. 2022-04-01 jest pierwszą stabilną wersją.

Poniższy szablon przedstawia następujące elementy:

  • Jak utworzyć nową jednostkę usługi tożsamości zarządzanej
  • Jak określić principalType
  • Jak przypisać rolę Współautor do tej jednostki usługi w zakresie grupy zasobów

Aby użyć szablonu, należy określić następujące dane wejściowe:

  • Nazwa podstawowa tożsamości zarządzanej lub można użyć ciągu domyślnego
{
    "$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"
            }
        }
    ]
}

Oto przykład Polecenia New-AzResourceGroupDeployment i az deployment group create , aby dowiedzieć się, jak rozpocząć wdrażanie w zakresie grupy zasobów.

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

Poniżej przedstawiono przykład przypisania roli Współautor do nowej jednostki usługi tożsamości zarządzanej po wdrożeniu szablonu.

Role assignment for a new managed identity service principal

Następne kroki