Применение Azure RBAC к ресурсу с помощью ARM

Есть ли способ применить правила 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}'."
  }

Мне остается интересно, для чего нужна переменная области, если ее нельзя изменить. Есть ли другое место, где я должен изменить область действия, чтобы это работало?

Заранее спасибо!

henrybeen.nl/…
Ohad Schneider 22.05.2019 20:08
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
12
1
2 460
5

Ответы 5

Можно применить 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/{resourceGro‌​upName}/providers/mi‌​crosoft.insights/com‌​ponents/{insightName‌​}' must match the scope specified on the URI '/subscriptions/{subscriptionId}/resourcegroups/{resourceGro‌​upName}. Мысли?

Negatar 17.09.2018 16:58

Вы применяете правила 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?

Negatar 17.09.2018 17:24

Можно попробовать поменять вот так "type": "microsoft.insights/components/providers/roleAssignments" для ресурса.

Charles Xu 18.09.2018 10:04

Я получаю сообщение об ошибке при простом изменении типа: Ошибка проверки шаблона развертывания: «Ресурс шаблона {guid} для типа microsoft.insights / components / sizes / roleAssignments» в строке «1» и столбце «7721» имеет неправильную длину сегмента. Вложенный тип ресурса должен иметь такое же количество сегментов, как и его имя ресурса. Тип корневого ресурса должен иметь длину сегмента на единицу больше, чем его имя ресурса. Пожалуйста, смотрите aka.ms/arm-template/#resources для деталей использования. '.

Negatar 18.09.2018 20:49

Guid - это идентификатор подписки, в котором находится ApplicationInsight.

Charles Xu 19.09.2018 02:52

Та же ошибка. Роль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'))]" ] }

Negatar 19.09.2018 18:38

Вы также можете следовать примеру здесь. Вы можете изменить область действия на параметр для ввода идентификатора ApplicationInsight.

Charles Xu 20.09.2018 09:11

Добавлен "scope": "[resourceId('Microsoft.Insights/components/', parameters('websiteName'))]". Я получил ту же ошибку, что и в исходном вопросе. Я также связал тот же пример в документации. Итак, мы прошли полный круг и вернулись к тому, с чего я начал ... Переменная области действия не работает так, как вы или я ожидали. Либо здесь нарушена "область видимости", либо мы все еще что-то упускаем ...

Negatar 20.09.2018 20:31

@DilipRaghunathan Замечательно, если это может вам помочь.

Charles Xu 31.01.2019 03:13

@Negatar проблема с шаблоном в вашем комментарии выше - это name. Он должен быть в формате [concat(parameters('appInsightsResourceName'), '/Microsoft.Authorization/', guid(...))]. Обратите внимание, что guid(...) должен быть стабильным, но уникальным для этого назначения ролей, один простой вариант - guid(subscription().subscriptionId) (например, ``). Вы не должны указывать scope.

Ohad Schneider 22.05.2019 20:16

Ключ состоит в том, чтобы отбросить свойство 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. Ключ - это имя и масштаб.

AntuanSoft 24.05.2019 15:40

Microsoft наконец предоставила документацию, объясняющую это:

https://docs.microsoft.com/en-us/azure/role-based-access-control/role-assignments-template#resource-scope

Согласитесь, документация по этому вопросу менее чем полезна. У меня есть массив идентификаторов ролей, которые я хотел добавить в качестве владельцев на ресурсе 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'))]"
      ]
    }

Другие вопросы по теме