Поделиться через


Получение данных о соответствии для ресурсов Azure

Одним из наибольших преимуществ Политики Azure является анализ и контроль, который эта служба выполняет над ресурсами в подписке или группе управления подписками. Этот элемент управления можно использовать для предотвращения создания ресурсов в неправильном расположении, принудительного использования общих и согласованных тегов или аудита существующих ресурсов для соответствующих конфигураций и параметров. Во всех случаях Политика Azure создает данные, которые позволяют определить состояние соответствия среды.

Прежде чем просматривать данные о соответствии, важно понимать состояния соответствия в Политика Azure.

Существует несколько способов доступа к информации о соответствии, которая создается при назначении политик и инициатив:

Прежде чем переходить к способам создания отчетов о соответствии, давайте рассмотрим, когда обновляются данные о соответствии, а также с какой частотой и какие события запускают цикл оценки.

Триггеры оценки

Результаты завершенного цикла оценки отражаются в поставщике ресурсов Microsoft.PolicyInsights с помощью операций PolicyStates и PolicyEvents. Дополнительные сведения об операциях REST API Azure Policy Insights см. здесь.

Оценка назначенных политик и инициатив выполняется в результате разных событий:

  • Определенной области назначается новая политика или инициатива. Для применения назначения к определенной области требуется около пяти минут, а затем цикл оценки начинается для применимых ресурсов в отношении вновь назначенной политики или инициативы. В зависимости от используемых эффектов ресурсы помечаются как соответствующие, несоответствующие, исключенные или неизвестные. Большая политика или инициатива, оцененная по большому объему ресурсов, может занять некоторое время, поэтому не существует предопределенного ожидания завершения цикла оценки. После завершения обновленные результаты соответствия будут доступны на портале и пакетах SDK.

  • Политика или инициатива, уже назначенная определенной области, является обновленной. Цикл и время оценки в этом сценарии аналогичны новому назначению области.

  • Ресурс разворачивается или обновляется в области с назначением с помощью Azure Resource Manager, REST API или поддерживаемого пакета SDK. В этом сценарии событие действия политики (присоединение, аудит, отказ, развертывание) и данные о состоянии соответствия отдельного ресурса становятся доступными на портале и в пакетах SDK примерно через 15 минут. Это событие не вызывает оценку других ресурсов.

  • Подписка (тип ресурса Microsoft.Resources/subscriptions) создается или перемещается в иерархии группы управления с назначенным определением политики, предназначенным для типа ресурса подписки. Оценка поддерживаемых подпиской эффектов (audit (аудит), auditIfNotExist, deployIfNotExists, modify (изменение)), ведение журнала и выполнение любого действия по исправлению занимает около 30 минут.

  • Исключение политики можно создавать, обновлять или удалять. В этом сценарии соответствующее назначение оценивается для определенной области исключения.

  • Стандартный цикл оценки соответствия. Каждые 24 часа назначения автоматически повторно оцениваются. Оценка масштабной политики или инициативы для большой области ресурсов может занять много времени. Поэтому сведений об ожидаемом времени завершения цикла оценки нет. После этого обновленные результаты оценки соответствия становятся доступными на портале и в пакетах SDK.

  • Управляемый ресурс обновляется поставщиком ресурсов машинной конфигурации, добавляя сведения о соответствии.

  • Проверка по запросу.

Примечание.

По проектированию Политика Azure освобождает все ресурсы в Microsoft.Resources поставщике ресурсов (RP) от оценки политики за исключением подписок и групп ресурсов, которые можно оценить.

Проверка оценки по запросу

Оценочное сканирование подписки или группы ресурсов можно начать с Azure CLI, Azure PowerShell, вызова REST API или с помощью действия "Проверка соответствия Политике Azure" в GitHub. Эта проверка является асинхронным процессом.

Примечание.

Не все поставщики ресурсов Azure поддерживают оценочные проверки по запросу. Например, в настоящее время Диспетчер виртуальных сетей Azure (AVNM) не поддерживает триггеры, запущенные вручную, или стандартный цикл оценки соответствия политикам (ежедневные проверки).

Проверка по требованию (действие GitHub)

Действие "Проверка соответствия Политике Azure" позволяет активировать проверку оценки по запросу из рабочего процесса GitHub для одного или нескольких ресурсов, групп ресурсов или подписок, а также направить этот рабочий процесс на основе данных о состоянии соответствия требованиям этих ресурсов. Вы также можете настроить выполнение рабочего процесса в запланированное время, чтобы получать самые свежие данные о состоянии соответствия в удобное для себя время. При необходимости GitHub Actions может создать отчет о состоянии соответствия сканированных ресурсов для дальнейшего анализа или архивации.

Следующий пример выполняет проверку соответствия для одной подписки.

on:
  schedule:
    - cron:  '0 8 * * *'  # runs every morning 8am
jobs:
  assess-policy-compliance:
    runs-on: ubuntu-latest
    steps:
    - name: Login to Azure
      uses: azure/login@v1
      with:
        creds: ${{secrets.AZURE_CREDENTIALS}}

    - name: Check for resource compliance
      uses: azure/policy-compliance-scan@v0
      with:
        scopes: |
          /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Дополнительные сведения и примеры рабочих процессов см. в разделе GitHub Actions для репозитория проверки соответствия Политике Azure.

Проверка оценки по запросу (Azure CLI)

Проверка соответствия запускается с помощью команды az policy state trigger-scan.

По умолчанию az policy state trigger-scan запускает оценку для всех ресурсов в текущей подписке. Чтобы запустить оценку для определенной группы ресурсов, используйте resource-group этот параметр. Следующий пример запускает проверку соответствия в текущей подписке для группы ресурсов MyRG:

az policy state trigger-scan --resource-group "MyRG"

Вы можете не ожидать завершения асинхронного процесса, прежде чем продолжать работу с параметром no-wait .

Проверка оценки по запросу (Azure PowerShell)

Проверка соответствия запускается командлетом Start-AzPolicyComplianceScan.

По умолчанию Start-AzPolicyComplianceScan запускает оценку для всех ресурсов в текущей подписке. Чтобы запустить оценку для определенной группы ресурсов, используйте ResourceGroupName этот параметр. Следующий пример запускает проверку соответствия в текущей подписке для группы ресурсов MyRG:

Start-AzPolicyComplianceScan -ResourceGroupName 'MyRG'

Можно сделать так, чтобы PowerShell ожидал завершения асинхронного вызова перед выдачей выходных данных или выполнял его в фоновом режиме в качестве задания. Чтобы использовать задание PowerShell для выполнения проверки соответствия требованиям в фоновом режиме, используйте AsJob параметр и задайте для объекта значение, например $job в этом примере:

$job = Start-AzPolicyComplianceScan -AsJob

Чтобы проверить состояние этого задания, получите свойства объекта $job. Задание имеет тип Microsoft.Azure.Commands.Common.AzureLongRunningJob. Используйте Get-Member для объекта $job, чтобы просмотреть доступные свойства и методы.

Пока выполняется проверка соответствия, объект $job возвращает следующие результаты:

$job

Id     Name              PSJobTypeName     State         HasMoreData     Location             Command
--     ----              -------------     -----         -----------     --------             -------
2      Long Running O... AzureLongRunni... Running       True            localhost            Start-AzPolicyCompliance...

После завершения State проверки соответствия свойство изменится на Completed.

Проверка оценки по запросу (REST)

Так как процесс является асинхронным, запускающая его конечная точка REST возвращает ответ, не дожидаясь его завершения. Вместо этого она предоставляет URI для получения состояния выполняемой оценки.

В каждом универсальном коде ресурса (URI) REST API есть переменные, которые необходимо заменить собственными значениями:

  • {YourRG} — замените это значение именем своей группы ресурсов.
  • {subscriptionId} — замените это значение идентификатором своей подписки.

Сканирование поддерживает оценку ресурсов в подписке или группе ресурсов. Запустите сканирование для области через команду POST REST API, используя следующие структуры универсального кода ресурса (URI):

  • Подписка

    POST https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/triggerEvaluation?api-version=2019-10-01
    
  • Группа ресурсов

    POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{YourRG}/providers/Microsoft.PolicyInsights/policyStates/latest/triggerEvaluation?api-version=2019-10-01
    

Этот вызов возвращает состояние 202 — принято. В заголовке ответа входит свойство со следующим форматом location :

https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/asyncOperationResults/{ResourceContainerGUID}?api-version=2019-10-01

{ResourceContainerGUID} создается для запрошенной области статически. Если эта область уже выполняет проверку по требованию, новое сканирование не запускается. Вместо этого новый запрос предоставляется тот же {ResourceContainerGUID} location универсальный код ресурса (URI) для состояния. Команда GET REST API в location URI возвращает 202 Accepted во время оценки. После завершения проверки оценки возвращается состояние 200 ОК . Вот пример текста в формате JSON, который передается в ответе после завершения проверки:

{
  "status": "Succeeded"
}

Сканирование оценки по требованию (Visual Studio Code)

Расширение Политика Azure для Visual Studio Code может выполнять проверку оценки для определенного ресурса. Эта проверка является синхронным процессом, в отличие от методов Azure PowerShell и REST. Дополнительные сведения и инструкции см. в статье Оценка по запросу с помощью расширения VS Code.

Портал

На портале Azure можно ознакомиться с процессом визуализации и оценки состояния соответствия в вашей среде. На странице Политика параметр Обзор предоставляет сведения о соответствии для доступных областей в рамках соответствия для политик и инициатив. В дополнение к состоянию соответствия и числу на каждое назначение, в нем содержится диаграмма, отображающая соответствие за последние семь дней. Страница соответствия требованиям содержит большую часть этих же сведений (за исключением диаграммы), но предоставляет дополнительные параметры фильтрации и сортировки.

Снимок экрана со страницей соответствия, параметрами фильтрации и подробными сведениями.

Так как политика или инициатива может быть назначена разным областям, в таблице предусмотрена область для каждого назначения и тип определения, назначенный этой области. Здесь также отображается число несоответствующих ресурсов и политик для каждого назначения. Выбрав политику или инициативу в таблице, можно получить подробные сведения о соответствии для указанного назначения.

Снимок экрана со страницей сведений о соответствии, включая количество и сведения о соответствии ресурсов.

В списке ресурсов на вкладке Соответствие ресурсов отображается состояние оценки существующих ресурсов для текущего назначения. На вкладке по умолчанию установлено значение Не соответствует, но можно выполнить фильтрацию. События (присоединение, аудит, отказ, развертывание, изменение), инициируемые запросом для создания ресурса, отображаются на вкладке События.

Снимок экрана для вкладки

Для ресурсов режима поставщика ресурсов на вкладке Соответствие ресурсов можно открыть информацию о соответствии компонентов, выбрав этот ресурс или щелкнув его строку правой кнопкой мыши и выбрав действие Просмотреть сведения о соответствии. На этой странице также представлены вкладки для просмотра назначенных этому ресурсу политик, событий, событий компонентов и журнала изменений.

Снимок экрана: вкладка

Вернитесь на страницу соответствия ресурса, выберите и удерживайте событие (или нажмите правую кнопку мыши) в строке событий, о котором нужно собрать подробные сведения, и выберите Показать журналы действий. Откроется страница журнала действий и префильтровываются в поиске с подробными сведениями о назначении и событиях. Журнал действий предоставляет больше контекста и сведений об этих событиях.

Снимок экрана для журнала действий для действий и оценок в Политике Azure.

Примечание.

Результаты соответствия можно экспортировать с портала с помощью запросов Azure Resource Graph.

Командная строка

Те же сведения, которые доступны на портале, можно получить с помощью REST API (включая ARMClient), Azure PowerShell или Azure CLI. Дополнительные сведения о REST API см. в справочнике по Политике Azure. Справочные страницы REST API имеют зеленую кнопку "Попробовать" для каждой операции, которая позволяет попробовать ее прямо в браузере.

Используйте ARMClient или аналогичное средство для управления аутентификацией в Azure для примеров с REST API.

Суммирование результатов

С помощью REST API формирование сводных данных можно выполнить по контейнеру, определению или назначению. Ниже приведен пример суммирования на уровне подписки с помощью Политика Azure Сводка по подписке аналитики:

POST https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/summarize?api-version=2019-10-01

В выходных данных будет представлена сводка по подписке. В следующем примере выходных данных сводная информация о соответствии выполняется value.results.nonCompliantResources и value.results.nonCompliantPolicies. Этот запрос предоставляет дополнительные сведения, включая каждое назначение, входящее в число несоответствующих, а также сведения об определении для каждого назначения. Каждый объект политики в иерархии предоставляет более подробную queryResultsUri информацию на этом уровне.

{
  "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#summary",
  "@odata.count": 1,
  "value": [
    {
      "@odata.id": null,
      "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#summary/$entity",
      "results": {
        "queryResultsUri": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2018-05-18 04:28:22Z&$to=2018-05-19 04:28:22Z&$filter=ComplianceState eq 'NonCompliant'",
        "nonCompliantResources": 15,
        "nonCompliantPolicies": 1
      },
      "policyAssignments": [
        {
          "policyAssignmentId": "/subscriptions/{subscriptionId}/resourcegroups/rg-tags/providers/microsoft.authorization/policyassignments/37ce239ae4304622914f0c77",
          "policySetDefinitionId": "",
          "results": {
            "queryResultsUri": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2018-05-18 04:28:22Z&$to=2018-05-19 04:28:22Z&$filter=ComplianceState eq 'NonCompliant' and PolicyAssignmentId eq '/subscriptions/{subscriptionId}/resourcegroups/rg-tags/providers/microsoft.authorization/policyassignments/37ce239ae4304622914f0c77'",
            "nonCompliantResources": 15,
            "nonCompliantPolicies": 1
          },
          "policyDefinitions": [
            {
              "policyDefinitionReferenceId": "",
              "policyDefinitionId": "/providers/microsoft.authorization/policydefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62",
              "effect": "deny",
              "results": {
                "queryResultsUri": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2018-05-18 04:28:22Z&$to=2018-05-19 04:28:22Z&$filter=ComplianceState eq 'NonCompliant' and PolicyAssignmentId eq '/subscriptions/{subscriptionId}/resourcegroups/rg-tags/providers/microsoft.authorization/policyassignments/37ce239ae4304622914f0c77' and PolicyDefinitionId eq '/providers/microsoft.authorization/policydefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62'",
                "nonCompliantResources": 15
              }
            }
          ]
        }
      ]
    }
  ]
}

Запрос ресурсов

В предыдущем примере value.policyAssignments.policyDefinitions.results.queryResultsUri предоставляет пример URI для всех несоответствующих ресурсов для определенного определения политики. В значении $filter Значение ComplianceState равно (eq) NonCompliantPolicyAssignmentId и указывается для определения политики, а затем сам PolicyDefinitionId. Причина включения PolicyAssignmentId в фильтр заключается в том, что может PolicyDefinitionId существовать в нескольких назначениях политик или инициатив с различными областями. Указав и те PolicyAssignmentId PolicyDefinitionId, и другие, мы можем быть явными в результатах, которые мы ищем. PolicyStates Ранее мы использовалиlatest, что автоматически задает from и to период времени за последние 24 часа.

https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2018-05-18 04:28:22Z&$to=2018-05-19 04:28:22Z&$filter=ComplianceState eq 'NonCompliant' and PolicyAssignmentId eq '/subscriptions/{subscriptionId}/resourcegroups/rg-tags/providers/microsoft.authorization/policyassignments/37ce239ae4304622914f0c77' and PolicyDefinitionId eq '/providers/microsoft.authorization/policydefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62'

Следующий пример ответа был обрезан до одного несоответствующего ресурса для краткости. Подробный ответ имеет несколько фрагментов данных о ресурсе, политике или инициативе и назначении. Здесь вы также можете увидеть, какие параметры назначения были переданы в определение политики.

{
  "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
  "@odata.count": 15,
  "value": [
    {
      "@odata.id": null,
      "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
      "timestamp": "2018-05-19T04:41:09Z",
      "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/rg-tags/providers/Microsoft.Compute/virtualMachines/linux",
      "policyAssignmentId": "/subscriptions/{subscriptionId}/resourceGroups/rg-tags/providers/Microsoft.Authorization/policyAssignments/37ce239ae4304622914f0c77",
      "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62",
      "effectiveParameters": "",
      "ComplianceState": "NonCompliant",
      "subscriptionId": "{subscriptionId}",
      "resourceType": "/Microsoft.Compute/virtualMachines",
      "resourceLocation": "westus2",
      "resourceGroup": "RG-Tags",
      "resourceTags": "tbd",
      "policyAssignmentName": "37ce239ae4304622914f0c77",
      "policyAssignmentOwner": "tbd",
      "policyAssignmentParameters": "{\"tagName\":{\"value\":\"costCenter\"},\"tagValue\":{\"value\":\"Contoso-Test\"}}",
      "policyAssignmentScope": "/subscriptions/{subscriptionId}/resourceGroups/RG-Tags",
      "policyDefinitionName": "1e30110a-5ceb-460c-a204-c1c3969c6d62",
      "policyDefinitionAction": "deny",
      "policyDefinitionCategory": "tbd",
      "policySetDefinitionId": "",
      "policySetDefinitionName": "",
      "policySetDefinitionOwner": "",
      "policySetDefinitionCategory": "",
      "policySetDefinitionParameters": "",
      "managementGroupIds": "",
      "policyDefinitionReferenceId": ""
    }
  ]
}

Просмотр событий

После создания или обновления ресурса создается результат оценки политики. Такие результаты называются событиями политики. Чтобы просмотреть последние события политики, связанные с подпиской, используйте следующий универсальный код ресурса (URI).

https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyEvents/default/queryResults?api-version=2019-10-01

Результаты должны выглядеть примерно так:

{
  "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyEvents/$metadata#default",
  "@odata.count": 1,
  "value": [
    {
      "@odata.id": null,
      "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyEvents/$metadata#default/$entity",
      "NumAuditEvents": 16
    }
  ]
}

Дополнительные сведения о запросах событий политик см. в справочной статье по событиям Политики Azure.

Azure CLI

Группа команд Azure CLI для Политики Azure охватывает большинство операций, доступных в REST или Azure PowerShell. Полный список доступных команд см. в разделе Azure CLI — общие сведения о Политике Azure.

Пример. Получение сводки состояния для приоритетной назначенной политики с наибольшим числом несоответствующих ресурсов.

az policy state summarize --top 1

Верхняя часть ответа выглядит примерно так:

{
  "odatacontext": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#summary/$entity",
  "odataid": null,
  "policyAssignments": [
    {
      "policyAssignmentId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/e0704696df5e4c3c81c873e8",
      "policyDefinitions": [
        {
          "effect": "audit",
          "policyDefinitionGroupNames": [
            ""
          ],
          "policyDefinitionId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policydefinitions/2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
          "policyDefinitionReferenceId": "",
          "results": {
            "nonCompliantPolicies": null,
            "nonCompliantResources": 398,
            "policyDetails": [
              {
                "complianceState": "noncompliant",
                "count": 1
              }
            ],
            "policyGroupDetails": [
              {
                "complianceState": "noncompliant",
                "count": 1
              }
            ],
            "queryResultsUri": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$from=2020-07-14 14:01:22Z&$to=2020-07-15 14:01:22Z and PolicyAssignmentId eq '/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/e0704696df5e4c3c81c873e8' and PolicyDefinitionId eq '/subscriptions/{subscriptionId}/providers/microsoft.authorization/policydefinitions/2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a'",
            "resourceDetails": [
              {
                "complianceState": "noncompliant",
                "count": 398
              },
              {
                "complianceState": "compliant",
                "count": 4
              }
            ]
          }
        }
      ],
  ...

Пример. Получение записи состояния для последнего оцененного ресурса (по умолчанию — по меткам времени в порядке убывания).

az policy state list --top 1
[
  {
    "complianceReasonCode": "",
    "complianceState": "Compliant",
    "effectiveParameters": "",
    "isCompliant": true,
    "managementGroupIds": "{managementgroupId}",
    "odatacontext": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
    "odataid": null,
    "policyAssignmentId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/securitycenterbuiltin",
    "policyAssignmentName": "SecurityCenterBuiltIn",
    "policyAssignmentOwner": "tbd",
    "policyAssignmentParameters": "",
    "policyAssignmentScope": "/subscriptions/{subscriptionId}",
    "policyAssignmentVersion": "",
    "policyDefinitionAction": "auditifnotexists",
    "policyDefinitionCategory": "tbd",
    "policyDefinitionGroupNames": [
      ""
    ],
    "policyDefinitionId": "/providers/microsoft.authorization/policydefinitions/aa633080-8b72-40c4-a2d7-d00c03e80bed",
    "policyDefinitionName": "aa633080-8b72-40c4-a2d7-d00c03e80bed",
    "policyDefinitionReferenceId": "identityenablemfaforownerpermissionsmonitoring",
    "policyDefinitionVersion": "",
    "policyEvaluationDetails": null,
    "policySetDefinitionCategory": "security center",
    "policySetDefinitionId": "/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8",
    "policySetDefinitionName": "1f3afdf9-d0c9-4c3d-847f-89da613e70a8",
    "policySetDefinitionOwner": "",
    "policySetDefinitionParameters": "",
    "policySetDefinitionVersion": "",
    "resourceGroup": "",
    "resourceId": "/subscriptions/{subscriptionId}",
    "resourceLocation": "",
    "resourceTags": "tbd",
    "resourceType": "Microsoft.Resources/subscriptions",
    "subscriptionId": "{subscriptionId}",
    "timestamp": "2020-07-15T08:37:07.903433+00:00"
  }
]

Пример. Получение сведений для всех несоответствующих ресурсов виртуальной сети.

az policy state list --filter "ResourceType eq 'Microsoft.Network/virtualNetworks'"
[
  {
    "complianceReasonCode": "",
    "complianceState": "NonCompliant",
    "effectiveParameters": "",
    "isCompliant": false,
    "managementGroupIds": "{managementgroupId}",
    "odatacontext": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
    "odataid": null,
    "policyAssignmentId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/e0704696df5e4c3c81c873e8",
    "policyAssignmentName": "e0704696df5e4c3c81c873e8",
    "policyAssignmentOwner": "tbd",
    "policyAssignmentParameters": "",
    "policyAssignmentScope": "/subscriptions/{subscriptionId}",
    "policyAssignmentVersion": "",
    "policyDefinitionAction": "audit",
    "policyDefinitionCategory": "tbd",
    "policyDefinitionGroupNames": [
      ""
    ],
    "policyDefinitionId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policydefinitions/2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
    "policyDefinitionName": "2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
    "policyDefinitionReferenceId": "",
    "policyDefinitionVersion": "",
    "policyEvaluationDetails": null,
    "policySetDefinitionCategory": "",
    "policySetDefinitionId": "",
    "policySetDefinitionName": "",
    "policySetDefinitionOwner": "",
    "policySetDefinitionParameters": "",
    "policySetDefinitionVersion": "",
    "resourceGroup": "RG-Tags",
    "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Microsoft.Network/virtualNetworks/RG-Tags-vnet",
    "resourceLocation": "westus2",
    "resourceTags": "tbd",
    "resourceType": "Microsoft.Network/virtualNetworks",
    "subscriptionId": "{subscriptionId}",
    "timestamp": "2020-07-15T08:37:07.901911+00:00"
  }
]

Пример. Получение событий, связанных с несоответствующими ресурсами виртуальной сети и произошедших после указанной даты.

az policy state list --filter "ResourceType eq 'Microsoft.Network/virtualNetworks'" --from '2020-07-14T00:00:00Z'
[
  {
    "complianceReasonCode": "",
    "complianceState": "NonCompliant",
    "effectiveParameters": "",
    "isCompliant": false,
    "managementGroupIds": "{managementgroupId}",
    "odatacontext": "https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
    "odataid": null,
    "policyAssignmentId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policyassignments/e0704696df5e4c3c81c873e8",
    "policyAssignmentName": "e0704696df5e4c3c81c873e8",
    "policyAssignmentOwner": "tbd",
    "policyAssignmentParameters": "",
    "policyAssignmentScope": "/subscriptions/{subscriptionId}",
    "policyAssignmentVersion": "",
    "policyDefinitionAction": "audit",
    "policyDefinitionCategory": "tbd",
    "policyDefinitionGroupNames": [
      ""
    ],
    "policyDefinitionId": "/subscriptions/{subscriptionId}/providers/microsoft.authorization/policydefinitions/2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
    "policyDefinitionName": "2e3197b6-1f5b-4b01-920c-b2f0a7e9b18a",
    "policyDefinitionReferenceId": "",
    "policyDefinitionVersion": "",
    "policyEvaluationDetails": null,
    "policySetDefinitionCategory": "",
    "policySetDefinitionId": "",
    "policySetDefinitionName": "",
    "policySetDefinitionOwner": "",
    "policySetDefinitionParameters": "",
    "policySetDefinitionVersion": "",
    "resourceGroup": "RG-Tags",
    "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Microsoft.Network/virtualNetworks/RG-Tags-vnet",
    "resourceLocation": "westus2",
    "resourceTags": "tbd",
    "resourceType": "Microsoft.Network/virtualNetworks",
    "subscriptionId": "{subscriptionId}",
    "timestamp": "2020-07-15T08:37:07.901911+00:00"
  }
]

Azure PowerShell

Модуль Azure PowerShell для Политики Azure доступен в коллекции PowerShell как Az.PolicyInsights. Используя PowerShellGet, вы можете установить модуль с помощью Install-Module -Name Az.PolicyInsights (установите последнюю версию Azure PowerShell):

# Install from PowerShell Gallery via PowerShellGet
Install-Module -Name Az.PolicyInsights

# Import the downloaded module
Import-Module Az.PolicyInsights

# Login with Connect-AzAccount if not using Cloud Shell
Connect-AzAccount

Модуль содержит следующие командлеты.

  • Get-AzPolicyStateSummary
  • Get-AzPolicyState
  • Get-AzPolicyEvent
  • Get-AzPolicyRemediation
  • Remove-AzPolicyRemediation
  • Start-AzPolicyRemediation
  • Stop-AzPolicyRemediation

Пример. Получение сводки состояния для приоритетной назначенной политики с наибольшим числом несоответствующих ресурсов.

PS> Get-AzPolicyStateSummary -Top 1

NonCompliantResources : 15
NonCompliantPolicies  : 1
PolicyAssignments     : {/subscriptions/{subscriptionId}/resourcegroups/RG-Tags/providers/micros
                        oft.authorization/policyassignments/37ce239ae4304622914f0c77}

Пример. Получение записи состояния для последнего оцененного ресурса (по умолчанию — по меткам времени в порядке убывания).

PS> Get-AzPolicyState -Top 1

Timestamp                  : 5/22/2018 3:47:34 PM
ResourceId                 : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Network/networkInterfaces/linux316
PolicyAssignmentId         : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Authorization/policyAssignments/37ce239ae4304622914f0c77
PolicyDefinitionId         : /providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62
ComplianceState            : NonCompliant
SubscriptionId             : {subscriptionId}
ResourceType               : /Microsoft.Network/networkInterfaces
ResourceLocation           : westus2
ResourceGroup              : RG-Tags
ResourceTags               : tbd
PolicyAssignmentName       : 37ce239ae4304622914f0c77
PolicyAssignmentOwner      : tbd
PolicyAssignmentParameters : {"tagName":{"value":"costCenter"},"tagValue":{"value":"Contoso-Test"}}
PolicyAssignmentScope      : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags
PolicyDefinitionName       : 1e30110a-5ceb-460c-a204-c1c3969c6d62
PolicyDefinitionAction     : deny
PolicyDefinitionCategory   : tbd

Пример. Получение сведений для всех несоответствующих ресурсов виртуальной сети.

PS> Get-AzPolicyState -Filter "ResourceType eq '/Microsoft.Network/virtualNetworks'"

Timestamp                  : 5/22/2018 4:02:20 PM
ResourceId                 : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Network/virtualNetworks/RG-Tags-vnet
PolicyAssignmentId         : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Authorization/policyAssignments/37ce239ae4304622914f0c77
PolicyDefinitionId         : /providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62
ComplianceState            : NonCompliant
SubscriptionId             : {subscriptionId}
ResourceType               : /Microsoft.Network/virtualNetworks
ResourceLocation           : westus2
ResourceGroup              : RG-Tags
ResourceTags               : tbd
PolicyAssignmentName       : 37ce239ae4304622914f0c77
PolicyAssignmentOwner      : tbd
PolicyAssignmentParameters : {"tagName":{"value":"costCenter"},"tagValue":{"value":"Contoso-Test"}}
PolicyAssignmentScope      : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags
PolicyDefinitionName       : 1e30110a-5ceb-460c-a204-c1c3969c6d62
PolicyDefinitionAction     : deny
PolicyDefinitionCategory   : tbd

Пример. Получение событий, связанных с несоответствующими ресурсами виртуальной сети, которые произошли после определенной даты, преобразование в объект CSV и экспорт в файл.

$policyEvents = Get-AzPolicyEvent -Filter "ResourceType eq '/Microsoft.Network/virtualNetworks'" -From '2020-09-19'
$policyEvents | ConvertTo-Csv | Out-File 'C:\temp\policyEvents.csv'

Выходные данные объекта $policyEvents выглядят следующим образом:

Timestamp                  : 9/19/2020 5:18:53 AM
ResourceId                 : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Network/virtualNetworks/RG-Tags-vnet
PolicyAssignmentId         : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags/providers/Mi
                             crosoft.Authorization/policyAssignments/37ce239ae4304622914f0c77
PolicyDefinitionId         : /providers/Microsoft.Authorization/policyDefinitions/1e30110a-5ceb-460c-a204-c1c3969c6d62
ComplianceState            : NonCompliant
SubscriptionId             : {subscriptionId}
ResourceType               : /Microsoft.Network/virtualNetworks
ResourceLocation           : eastus
ResourceGroup              : RG-Tags
ResourceTags               : tbd
PolicyAssignmentName       : 37ce239ae4304622914f0c77
PolicyAssignmentOwner      : tbd
PolicyAssignmentParameters : {"tagName":{"value":"costCenter"},"tagValue":{"value":"Contoso-Test"}}
PolicyAssignmentScope      : /subscriptions/{subscriptionId}/resourceGroups/RG-Tags
PolicyDefinitionName       : 1e30110a-5ceb-460c-a204-c1c3969c6d62
PolicyDefinitionAction     : deny
PolicyDefinitionCategory   : tbd
TenantId                   : {tenantId}
PrincipalOid               : {principalOid}

Поле PrincipalOid можно использовать для получения конкретного пользователя с помощью командлета Get-AzADUserAzure PowerShell. Замените {principalOid} ответ, полученный из предыдущего примера.

PS> (Get-AzADUser -ObjectId {principalOid}).DisplayName
Trent Baker

Журналы Azure Monitor

Если у вас есть рабочая область Log Analytics с AzureActivity из связанного с подпиской решения Аналитики журнала действий, вы также можете просмотреть результаты несоответствия из циклов оценки новых и обновленных ресурсов, используя простые запросы Kusto и таблицу AzureActivity. С учетом подробных сведений о несоответствии в журналах Azure Monitor вы также можете настроить оповещения для отслеживания несоответствия.

Снимок экрана с журналами Azure Monitor, демонстрирующими действия Политики Azure в таблице AzureActivity.

Azure Resource Graph

Записи соответствия хранятся в Azure Resource Graph (ARG). Данные можно экспортировать из запросов ARG для формирования настраиваемых панелей мониторинга на основе областей и политик, интересующих вас. Ознакомьтесь с нашими примерами запросов на экспорт данных соответствия с помощью ARG.

Следующие шаги