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ć:
Microsoft.Authorization/roleAssignments/write
uprawnienia, takie jak kontrola dostępu oparta na rolach Administracja istrator lub Administracja istrator dostępu użytkowników
Należy użyć następujących wersji:
2018-09-01-preview
lub nowsze, aby przypisać rolę platformy Azure do nowej jednostki usługi2020-04-01-preview
lub nowsze, aby przypisać rolę platformy Azure w zakresie zasobów2022-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.
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.
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.