Есть ли способ применить правила RBAC на уровне ресурсов через ARM? Я смог следовать это руководство Microsoft, чтобы добавить пользователя / роль на уровне группы ресурсов, но не на уровне ресурса. В частности, я пытаюсь добавить новую роль читателя в AppInsights через ARM. Однако, когда я настраиваю область видимости, шаблон просто выходит из строя с этой ошибкой:
"error": {
"code": "InvalidCreateRoleAssignmentRequest",
"message": "The request to create role assignment '{guid}' is not valid. Role assignment scope '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/Microsoft.Insights/components/{resourceGroupName}' must match the scope specified on the URI '/subscriptions/{resourceGroupName}/resourcegroups/{resourceGroupName}'."
}
Мне остается интересно, для чего нужна переменная области, если ее нельзя изменить. Есть ли другое место, где я должен изменить область действия, чтобы это работало?
Заранее спасибо!

Можно применить RBAC на уровне ресурсов с помощью ARM.
В приведенном вами примере показано, как применить RBAC к определенной группе ресурсов, где область действия - это путь к группе ресурсов.
Здесь вы пытаетесь назначить роль определенному ресурсу. Изменение области с группы ресурсов на ресурс (AppInsights) будет работать.
Из исключения я вижу, что путь к ресурсу может быть не в ожидаемом формате.
Путь к AppInsights должен быть в следующем формате:
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/microsoft.insights/components/{insightName}
Надеюсь, такой прицел поможет!
Когда вы говорите «путь к AppInsights», и я предполагаю, что вы имеете в виду, что мне нужно изменить настройку области действия. Я добавил в свою область действия «/ провайдеры», как вы предложили, и получил следующее (что похоже на то, что я получил изначально): The request to create role assignment '{guid}' is not valid. Role assignment scope '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/microsoft.insights/components/{insightName}' must match the scope specified on the URI '/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}. Мысли?
Вы применяете правила RBAC на уровне ресурсов через ARM, и здесь есть пример шаблона, который применяет правила RBAC к виртуальной машине Azure:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"principalId": {
"type": "string",
"metadata": {
"description": "Principal ID associated with the subscription ID"
}
},
"virtualMachineName": {
"type": "string",
"metadata": {
"description": "Name of the virtual machine"
}
},
"builtInRoleType": {
"type": "string",
"metadata": {
"description": "Built In Role Type for the Virtual Machine"
},
"allowedValues": [
"Owner",
"Contributor",
"Reader",
"Virtual Machine Contributor"
]
},
"guid": {
"type": "string",
"metadata": {
"description": "A new GUID used to identify the role"
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for all resources."
}
}
},
"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')]",
"Virtual Machine Contributor": "[concat('/subscriptions/',subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'd73bb868-a0df-4d4d-bd69-98a00b01fccb')]",
"resourceName": "[concat(parameters('virtualMachineName'), '/Microsoft.Authorization/', parameters('guid'))]"
},
"resources": [
{
"type": "Microsoft.Compute/virtualMachines/providers/roleAssignments",
"apiVersion": "2017-05-01",
"name": "[variables('resourceName')]",
"properties": {
"roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
"principalId": "[parameters('principalId')]"
}
}
]
}
Надеюсь, что это поможет вам.
Интересно. Итак, вы говорите, что мы можем применить apply на уровне ресурсов, но похоже, что поля типа и имени должны немного измениться в шаблоне ARM. Не могли бы вы помочь мне найти подходящий тип и имя ресурса, которые применили бы RBAC к ресурсу AppInsight?
Можно попробовать поменять вот так "type": "microsoft.insights/components/providers/roleAssignments" для ресурса.
Я получаю сообщение об ошибке при простом изменении типа: Ошибка проверки шаблона развертывания: «Ресурс шаблона {guid} для типа microsoft.insights / components / sizes / roleAssignments» в строке «1» и столбце «7721» имеет неправильную длину сегмента. Вложенный тип ресурса должен иметь такое же количество сегментов, как и его имя ресурса. Тип корневого ресурса должен иметь длину сегмента на единицу больше, чем его имя ресурса. Пожалуйста, смотрите aka.ms/arm-template/#resources для деталей использования. '.
Guid - это идентификатор подписки, в котором находится ApplicationInsight.
Та же ошибка. РольDefinitionId и PrincipalId окончательная работа. По-прежнему не могу найти подходящий тип и название. Вот где я нахожусь: { "type": "microsoft.insights/components/providers/roleAssignments", "apiVersion": "2017-05-01", "name": "[subscription().subscriptionId]", "properties": { "roleDefinitionId": "[variables('MonitoringReaderAzureSecurityGroup')]", "principalId": "[variables('AppInsightsReadOnlyPrincipalId')]" }, "dependsOn": [ "[resourceId('Microsoft.Insights/components/', parameters('websiteName'))]" ] }
Вы также можете следовать примеру здесь. Вы можете изменить область действия на параметр для ввода идентификатора ApplicationInsight.
Добавлен "scope": "[resourceId('Microsoft.Insights/components/', parameters('websiteName'))]". Я получил ту же ошибку, что и в исходном вопросе. Я также связал тот же пример в документации. Итак, мы прошли полный круг и вернулись к тому, с чего я начал ... Переменная области действия не работает так, как вы или я ожидали. Либо здесь нарушена "область видимости", либо мы все еще что-то упускаем ...
@DilipRaghunathan Замечательно, если это может вам помочь.
@Negatar проблема с шаблоном в вашем комментарии выше - это name. Он должен быть в формате [concat(parameters('appInsightsResourceName'), '/Microsoft.Authorization/', guid(...))]. Обратите внимание, что guid(...) должен быть стабильным, но уникальным для этого назначения ролей, один простой вариант - guid(subscription().subscriptionId) (например, ``). Вы не должны указывать scope.
Ключ состоит в том, чтобы отбросить свойство scope и вместо этого вложить назначение ролей в требуемый ресурс, используя Microsoft.FooResource/BarSubType/providers/roleAssignments в качестве типа и используя следующий формат для имени: {resourceName}/Microsoft.Authorization/{uniqueRoleAssignmentGuid}. Обратите внимание, что GUID должен быть стабильным, но уникальным для этого назначения ролей, один простой вариант - guid(subscription().subscriptionId, 'some-sub-identifier-if-you-wish').
Вот шаблон, который показывает, как применить RBAC к отдельному ресурсу, используя назначенное пользователем управляемое удостоверение, определенное в том же шаблоне:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": { "type": "string" },
"userAssignedIdentityName": { "type": "string" }
},
"variables": {
"ContributorRoleDefinition": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
},
"resources": [
{
"type": "Microsoft.ManagedIdentity/userAssignedIdentities",
"name": "[parameters('userAssignedIdentityName')]",
"location": "[resourceGroup().location]",
"apiVersion": "2018-11-30"
},
{
"type": "Microsoft.Storage/storageAccounts",
"name": "[parameters('storageAccountName')]",
"location": "[resourceGroup().location]",
"apiVersion": "2016-12-01",
"sku": { "name": "Standard_LRS" },
"kind": "Storage",
"resources": [
{
"type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
"apiVersion": "2017-05-01",
"name": "[concat(parameters('storageAccountName'), '/Microsoft.Authorization/', guid(subscription().subscriptionId, 'foo'))]",
"properties": {
"roleDefinitionId": "[variables('ContributorRoleDefinition')]",
"principalId": "[reference(parameters('userAssignedIdentityName'), '2018-11-30').principalId]"
},
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName'))]"
]
}
]
}
]
}
Источник: https://www.henrybeen.nl/creating-an-authorization-rule-using-an-arm-template/
Для меня это правильное решение, но его более понятно, если прочитать пример henrybeen. Ключ - это имя и масштаб.
Microsoft наконец предоставила документацию, объясняющую это:
Согласитесь, документация по этому вопросу менее чем полезна. У меня есть массив идентификаторов ролей, которые я хотел добавить в качестве владельцев на ресурсе App Insight, не делая пользователей владельцами на уровне группы ресурсов. Я не хотел использовать подход вложенных ресурсов, так как я хотел перебирать массив объектов для динамического создания ролей, поэтому после настройки атрибутов типа, имени и области действия следующий блок ресурсов - это то, что в конечном итоге сработало для меня. :
{
"comments": "Add the Application Insights resource",
"apiVersion": "2014-04-01",
"name": "[variables('appInsightsName')]",
"type": "Microsoft.Insights/components",
"location": "[resourceGroup().location]",
"properties": {
"ApplicationId": "[variables('appInsightsName')]"
}
},
{
"comments": "Add the IAM roles to the App Insights resource",
"condition": "[parameters('isProduction')]",
"type": "Microsoft.Insights/components/providers/roleAssignments",
"name": "[concat(variables('appInsightsName'),'/Microsoft.Authorization/',guid(parameters('roleAssignments')[copyIndex()].principalId))]",
"apiVersion": "2017-05-01",
"location": "[resourceGroup().location]",
"properties": {
"roleDefinitionId": "[concat(subscription().Id, '/providers/Microsoft.Authorization/roleDefinitions/8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]", // Owner Role
"principalId": "[parameters('roleAssignments')[copyIndex()].principalId]",
"scope": "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
},
"copy": {
"name": "appInsightsRoleAssignments",
"count": "[length(parameters('roleAssignments'))]"
},
"dependsOn": [
"[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
]
}