Получение данных о соответствии для ресурсов 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} создается для запрошенной области статически. Если эта область уже выполняет проверку по требованию, новое сканирование не запускается. Вместо этого новому запросу для проверки состояния предоставляется тот же URI, указанные в свойстве Location ({ResourceContainerGUID}). Команда GET REST API, отправленная на URI, указанный в свойстве Location, возвращает состояние 202 — принято, пока продолжается выполнение оценки. Когда оценочное сканирование завершается, возвращается состояние 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 Insight Для подписки:

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) значению "NonCompliant", PolicyAssignmentId указывается для определения политики, а затем — сам PolicyDefinitionId. PolicyAssignmentId включается в фильтр, так как PolicyDefinitionId может существовать в нескольких назначениях политик или инициатив с разными областями. Указав как PolicyAssignmentId, так и PolicyDefinitionId, мы можем явно определить ожидаемые результаты. Ранее мы использовали значение latest для параметра PolicyStates, что автоматически делает временное окно 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 может использоваться для получения определенного пользователя с помощью командлета Azure PowerShell Get-AzADUser. Замените {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.

Дальнейшие действия