Pobieranie danych dotyczących zgodności zasobów platformy Azure

Jedną z największych zalet Azure Policy jest wgląd w szczegółowe informacje i mechanizmy kontroli nad zasobami w subskrypcji lub grupie zarządzania subskrypcji. Ta kontrolka może służyć do zapobiegania tworzeniu zasobów w niewłaściwej lokalizacji, wymuszania wspólnego i spójnego użycia tagów lub inspekcji istniejących zasobów pod kątem odpowiednich konfiguracji i ustawień. We wszystkich przypadkach dane są generowane przez Azure Policy, aby umożliwić zrozumienie stanu zgodności środowiska.

Przed przejrzeniem danych zgodności ważne jest zrozumienie stanów zgodności w Azure Policy.

Istnieje kilka sposobów uzyskiwania dostępu do informacji o zgodności generowanych przez zasady i przypisania inicjatyw:

Zanim przyjrzymy się metodom raportowania zgodności, przyjrzyjmy się aktualizacji informacji o zgodności oraz częstotliwości i zdarzeń, które wyzwalają cykl oceny.

Wyzwalacze oceny

Wyniki ukończonego cyklu oceny są dostępne w dostawcy Microsoft.PolicyInsights zasobów za pośrednictwem operacji PolicyStates i PolicyEvents . Aby uzyskać więcej informacji na temat operacji interfejsu API REST usługi Azure Policy Insights, zobacz Azure Policy Insights.

Oceny przypisanych zasad i inicjatyw są wykonywane w wyniku różnych zdarzeń:

  • Zasady lub inicjatywa są nowo przypisywane do zakresu. Zastosowanie przypisania do zdefiniowanego zakresu trwa około pięciu minut, a następnie cykl oceny rozpoczyna się dla odpowiednich zasobów dla nowo przypisanych zasad lub inicjatywy. W zależności od używanych efektów zasoby są oznaczone jako zgodne, niezgodne, wykluczone lub nieznane. Duża zasada lub inicjatywa oceniana pod kątem dużego zakresu zasobów może zająć trochę czasu, więc nie ma wstępnie zdefiniowanych oczekiwań dotyczących ukończenia cyklu oceny. Po zakończeniu zaktualizowane wyniki zgodności są dostępne w portalu i zestawach SDK.

  • Zaktualizowano już zasady lub inicjatywę przypisaną do zakresu. Cykl oceny i czas dla tego scenariusza są takie same jak w przypadku nowego przypisania do zakresu.

  • Zasób jest wdrażany lub aktualizowany w zakresie przy użyciu przypisania za pośrednictwem usługi Azure Resource Manager, interfejsu API REST lub obsługiwanego zestawu SDK. W tym scenariuszu zdarzenie efektu (dołączanie, inspekcja, odmowa, wdrażanie) i informacje o stanie zgodności dla poszczególnych zasobów stają się dostępne w portalu i zestawach SDK około 15 minut później. To zdarzenie nie powoduje oceny innych zasobów.

  • Subskrypcja (typ Microsoft.Resources/subscriptionszasobu ) jest tworzona lub przenoszona w hierarchii grup zarządzania z przypisaną definicją zasad przeznaczoną dla typu zasobu subskrypcji. Ocena obsługiwanych efektów subskrypcji (audit, auditIfNotExist, deployIfNotExists, modify), rejestrowanie i wszelkie akcje korygowania trwają około 30 minut.

  • Wykluczenie z zasad jest tworzone, aktualizowane lub usuwane. W tym scenariuszu odpowiednie przypisanie jest oceniane dla zdefiniowanego zakresu wykluczenia.

  • Standardowy cykl oceny zgodności. Co 24 godziny przydziały są automatycznie ponownie oceniane. Duża zasada lub inicjatywa wielu zasobów może zająć trochę czasu, więc nie ma wstępnie zdefiniowanych oczekiwań dotyczących ukończenia cyklu oceny. Po zakończeniu zaktualizowane wyniki zgodności są dostępne w portalu i zestawach SDK.

  • Dostawca zasobów konfiguracji maszyny jest aktualizowany o szczegóły zgodności przez zasób zarządzany.

  • Skanowanie na żądanie

Uwaga

Zgodnie z projektem Azure Policy wyklucza wszystkie zasoby w ramach Microsoft.Resources dostawcy zasobów (RP) z oceny zasad z wyjątkiem subskrypcji i grup zasobów, które można ocenić.

Skanowanie oceny na żądanie

Skanowanie ewaluacyjne subskrypcji lub grupy zasobów można uruchomić za pomocą interfejsu wiersza polecenia platformy Azure, Azure PowerShell, wywołania interfejsu API REST lub przy użyciu akcji gitHub skanowania zgodności Azure Policy. To skanowanie jest procesem asynchronicznym.

Uwaga

Nie wszyscy dostawcy zasobów platformy Azure obsługują skanowania oceny na żądanie. Na przykład usługa Azure Virtual Network Manager (AVNM) obecnie nie obsługuje wyzwalaczy ręcznych ani standardowego cyklu oceny zgodności zasad (codzienne skanowanie).

Skanowanie oceny na żądanie — Akcja usługi GitHub

Akcja skanowania pod kątem zgodności Azure Policy umożliwia wyzwolenie skanowania oceny na żądanie z przepływu pracy usługi GitHub w jednym lub wielu zasobach, grupach zasobów lub subskrypcjach oraz bramowanie przepływu pracy na podstawie stanu zgodności zasobów. Można również skonfigurować przepływ pracy do uruchamiania w zaplanowanym czasie, aby uzyskać najnowszy stan zgodności w dogodnym czasie. Opcjonalnie GitHub Actions może wygenerować raport dotyczący stanu zgodności zeskanowanych zasobów w celu dalszej analizy lub archiwizacji.

W poniższym przykładzie jest uruchamiane skanowanie pod kątem zgodności dla subskrypcji.

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

Aby uzyskać więcej informacji i przykładów przepływu pracy, zobacz GitHub Actions dla repozytorium skanowania zgodności Azure Policy.

Skanowanie oceny na żądanie — interfejs wiersza polecenia platformy Azure

Skanowanie pod kątem zgodności jest uruchamiane za pomocą polecenia az policy state trigger-scan .

Domyślnie az policy state trigger-scan rozpoczyna ocenę wszystkich zasobów w bieżącej subskrypcji. Aby rozpocząć ocenę dla określonej grupy zasobów, użyj parametru grupy zasobów . Poniższy przykład uruchamia skanowanie pod kątem zgodności w bieżącej subskrypcji dla grupy zasobów MyRG :

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

Przed kontynuowaniem parametru no-wait możesz nie czekać na zakończenie procesu asynchronicznego.

Skanowanie oceny na żądanie — Azure PowerShell

Skanowanie zgodności jest uruchamiane za pomocą polecenia cmdlet Start-AzPolicyComplianceScan .

Domyślnie Start-AzPolicyComplianceScan rozpoczyna ocenę wszystkich zasobów w bieżącej subskrypcji. Aby rozpocząć ocenę dla określonej grupy zasobów, użyj parametru ResourceGroupName . Poniższy przykład uruchamia skanowanie pod kątem zgodności w bieżącej subskrypcji dla grupy zasobów MyRG :

Start-AzPolicyComplianceScan -ResourceGroupName 'MyRG'

Możesz zaczekać na zakończenie wywołania asynchronicznego programu PowerShell przed dostarczeniem danych wyjściowych wyników lub uruchomieniem go w tle jako zadania. Aby użyć zadania programu PowerShell do uruchomienia skanowania zgodności w tle, użyj parametru AsJob i ustaw wartość na obiekt, na $job przykład w tym przykładzie:

$job = Start-AzPolicyComplianceScan -AsJob

Stan zadania można sprawdzić, sprawdzając $job obiekt . Zadanie jest typu Microsoft.Azure.Commands.Common.AzureLongRunningJob. Użyj Get-Member polecenia w $job obiekcie , aby wyświetlić dostępne właściwości i metody.

Podczas skanowania pod kątem zgodności sprawdź, czy $job obiekt zwraca wyniki, takie jak:

$job

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

Po zakończeniu skanowania zgodności właściwość State zmieni się na Ukończono.

Skanowanie oceny na żądanie — REST

Jako proces asynchroniczny punkt końcowy REST do uruchomienia skanowania nie czeka, aż skanowanie zostanie ukończone, aby odpowiedzieć. Zamiast tego udostępnia identyfikator URI do wykonywania zapytań o stan żądanej oceny.

Każdy identyfikator URI interfejsu API REST zawiera używane zmienne, które musisz zastąpić własnymi wartościami:

  • {YourRG} — Zastąp ciąg nazwą grupy zasobów
  • {subscriptionId} — zastąp swoim identyfikatorem subskrypcji

Skanowanie obsługuje ocenę zasobów w subskrypcji lub w grupie zasobów. Rozpocznij skanowanie według zakresu za pomocą polecenia POST interfejsu API REST przy użyciu następujących struktur identyfikatorów URI:

  • Subskrypcja

    POST https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.PolicyInsights/policyStates/latest/triggerEvaluation?api-version=2019-10-01
    
  • Grupa zasobów

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

Wywołanie zwraca stan Zaakceptowane 202 . W nagłówku odpowiedzi znajduje się właściwość Location o następującym formacie:

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

{ResourceContainerGUID} element jest generowany statycznie dla żądanego zakresu. Jeśli zakres już uruchamia skanowanie na żądanie, nowe skanowanie nie jest uruchamiane. Zamiast tego nowe żądanie ma ten sam {ResourceContainerGUID} identyfikator URI lokalizacji dla stanu. Polecenie GET interfejsu API REST do identyfikatora URI lokalizacji zwraca wartość 202 Zaakceptowano , gdy ocena jest w toku. Po zakończeniu skanowania oceny zostanie zwrócony stan 200 OK . Treść ukończonego skanowania to odpowiedź JSON ze stanem:

{
    "status": "Succeeded"
}

Skanowanie oceny na żądanie — Visual Studio Code

Rozszerzenie Azure Policy dla Visual Studio Code umożliwia uruchomienie skanowania wersji ewaluacyjnej dla określonego zasobu. To skanowanie jest procesem synchronicznym, w przeciwieństwie do metod Azure PowerShell i REST. Aby uzyskać szczegółowe informacje i kroki, zobacz Ocena na żądanie za pomocą rozszerzenia programu VS Code.

Portal

Azure Portal przedstawia graficzne doświadczenie wizualizacji i zrozumienia stanu zgodności w środowisku. Na stronie Zasady opcja Przegląd zawiera szczegółowe informacje dotyczące dostępnych zakresów dotyczących zgodności zarówno zasad, jak i inicjatyw. Wraz ze stanem zgodności i liczbą na przypisanie zawiera wykres przedstawiający zgodność w ciągu ostatnich siedmiu dni. Strona Zgodność zawiera wiele tych samych informacji (z wyjątkiem wykresu), ale udostępnia dodatkowe opcje filtrowania i sortowania.

Zrzut ekranu przedstawiający stronę Zgodność, opcje filtrowania i szczegóły.

Ponieważ zasady lub inicjatywa można przypisać do różnych zakresów, tabela zawiera zakres dla każdego przypisania i typ przypisanej definicji. Podano również liczbę niezgodnych zasobów i niezgodnych zasad dla każdego przypisania. Wybranie zasad lub inicjatywy w tabeli umożliwia dokładniejsze przyjrzenie się zgodności dla tego konkretnego przypisania.

Zrzut ekranu przedstawiający stronę Szczegóły zgodności, w tym liczbę i szczegóły zgodności zasobów.

Lista zasobów na karcie Zgodność zasobów zawiera stan oceny istniejących zasobów dla bieżącego przypisania. Karta jest domyślnie ustawiona na Niezgodne, ale można je filtrować. Zdarzenia (dołączanie, inspekcja, odmowa, wdrażanie, modyfikowanie) wyzwalane przez żądanie utworzenia zasobu są wyświetlane na karcie Zdarzenia .

Zrzut ekranu przedstawiający kartę Zdarzenia na stronie Szczegóły zgodności.

W przypadku zasobów trybu dostawcy zasobów na karcie Zgodność zasobów wybierz zasób lub kliknij go prawym przyciskiem myszy, a następnie wybranie pozycji Wyświetl szczegóły zgodności powoduje otwarcie szczegółów zgodności składnika. Ta strona oferuje również karty umożliwiające wyświetlanie zasad przypisanych do tego zasobu, zdarzeń, zdarzeń składników i historii zmian.

Zrzut ekranu przedstawiający kartę Zgodność składników i szczegóły zgodności dla przypisania trybu dostawcy zasobów.

Po powrocie na stronę zgodności zasobów wybierz i przytrzymaj (lub kliknij prawym przyciskiem myszy) w wierszu zdarzenia, w którym chcesz zebrać więcej szczegółów, a następnie wybierz pozycję Pokaż dzienniki aktywności. Zostanie otwarta strona dziennika aktywności i zostanie wstępnie przefiltrowana do wyszukiwania zawierającego szczegóły przypisania i zdarzeń. Dziennik aktywności zawiera więcej kontekstu i informacji o tych zdarzeniach.

Zrzut ekranu przedstawiający dziennik aktywności dla Azure Policy działań i ocen.

Uwaga

Wyniki zgodności można wyeksportować z witryny Portal za pośrednictwem zapytań usługi Azure Resource Graph.

Wiersz polecenia

Te same informacje dostępne w portalu można pobrać za pomocą interfejsu API REST (w tym usługi ARMClient), Azure PowerShell i interfejsu wiersza polecenia platformy Azure. Aby uzyskać szczegółowe informacje na temat interfejsu API REST, zobacz dokumentację Azure Policy. Strony referencyjne interfejsu API REST mają zielony przycisk "Wypróbuj", który umożliwia wypróbowanie go bezpośrednio w przeglądarce.

Użyj elementu ARMClient lub podobnego narzędzia do obsługi uwierzytelniania na platformie Azure na potrzeby przykładów interfejsu API REST.

Podsumuj wyniki

Za pomocą interfejsu API REST podsumowania mogą być wykonywane przez kontener, definicję lub przypisanie. Oto przykład podsumowania na poziomie subskrypcji przy użyciu podsumowania dla subskrypcji usługi Azure Policy Insight:

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

Dane wyjściowe zawierają podsumowanie subskrypcji. W poniższych przykładowych danych wyjściowych podsumowana zgodność znajduje się w obszarze value.results.nonCompliantResources i value.results.nonCompliantPolicies. To żądanie zawiera dodatkowe szczegóły, w tym każde przypisanie, które składa się na niezgodne numery i informacje o definicji dla każdego przypisania. Każdy obiekt zasad w hierarchii zawiera identyfikator queryResultsUri , którego można użyć do uzyskania większej ilości szczegółów na tym poziomie.

{
    "@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
                }
            }]
        }]
    }]
}

Wykonywanie zapytań o zasoby

W powyższym przykładzie value.policyAssignments.policyDefinitions.results.queryResultsUri udostępnia przykładowy identyfikator URI dla wszystkich niezgodnych zasobów dla określonej definicji zasad. W $filter wartość ComplianceState jest równa (eq) wartości "NonCompliant", PolicyAssignmentId jest określona dla definicji zasad, a następnie dla samej definicji zasad PolicyDefinitionId. Przyczyną stosowania atrybutu PolicyAssignmentId w filtrze jest to, że identyfikator PolicyDefinitionId może istnieć w kilku przypisaniach zasad lub inicjatyw z różnymi zakresami. Określając zarówno policyAssignmentId, jak i PolicyDefinitionId, możemy być jawnie w wynikach, których szukamy. Wcześniej dla parametru PolicyStates użyliśmy najnowszej wersji, która automatycznie ustawia przedział czasu od i do przedziału czasu z ostatnich 24 godzin.

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'

Przykładowa odpowiedź poniżej została przycięta do jednego niezgodnego zasobu w celu zwięzłości. Szczegółowa odpowiedź zawiera kilka elementów danych dotyczących zasobu, zasad lub inicjatywy oraz przypisania. Zwróć uwagę, że można również zobaczyć, jakie parametry przypisania zostały przekazane do definicji zasad.

{
    "@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": ""
    }]
}

Wyświetlanie zdarzeń

Po utworzeniu lub zaktualizowaniu zasobu zostanie wygenerowany wynik oceny zasad. Wyniki są nazywane zdarzeniami zasad. Użyj następującego identyfikatora URI, aby wyświetlić ostatnie zdarzenia zasad skojarzone z subskrypcją.

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

Wyniki powinny wyglądać podobnie do następujących:

{
    "@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
    }]
}

Aby uzyskać więcej informacji na temat wykonywania zapytań dotyczących zdarzeń zasad, zobacz artykuł Azure Policy Events reference (Dokumentacja zdarzeń Azure Policy).

Interfejs wiersza polecenia platformy Azure

Grupa poleceń interfejsu wiersza polecenia platformy Azure dla Azure Policy obejmuje większość operacji dostępnych w interfejsie REST lub Azure PowerShell. Aby uzyskać pełną listę dostępnych poleceń, zobacz Interfejs wiersza polecenia platformy Azure — Azure Policy Omówienie.

Przykład: pobieranie podsumowania stanu dla najbardziej przypisanych zasad z największą liczbą niezgodnych zasobów.

az policy state summarize --top 1

Górna część odpowiedzi wygląda następująco:

{
    "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
                        }
                    ]
                }
            }],
    ...

Przykład: pobieranie rekordu stanu dla ostatnio ocenianego zasobu (domyślnie jest to sygnatura czasowa w kolejności malejącej).

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"
  }
]

Przykład: pobieranie szczegółów dla wszystkich niezgodnych zasobów sieci wirtualnej.

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"
  }
]

Przykład: pobieranie zdarzeń związanych z niezgodnymi zasobami sieci wirtualnej, które wystąpiły po określonej dacie.

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

Moduł Azure PowerShell dla Azure Policy jest dostępny w Galeria programu PowerShell jako Az.PolicyInsights. Przy użyciu modułu PowerShellGet można zainstalować za pomocą polecenia Install-Module -Name Az.PolicyInsights (upewnij się, że zainstalowano najnowszą 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

Moduł zawiera następujące polecenia cmdlet:

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

Przykład: pobieranie podsumowania stanu dla najbardziej przypisanych zasad z największą liczbą niezgodnych zasobów.

PS> Get-AzPolicyStateSummary -Top 1

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

Przykład: pobieranie rekordu stanu dla ostatnio ocenianego zasobu (domyślnie jest to sygnatura czasowa w kolejności malejącej).

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

Przykład: pobieranie szczegółów dla wszystkich niezgodnych zasobów sieci wirtualnej.

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

Przykład: pobieranie zdarzeń związanych z niezgodnymi zasobami sieci wirtualnej, które wystąpiły po określonej dacie, konwertowanie na obiekt CSV i eksportowanie do pliku.

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

Dane wyjściowe $policyEvents obiektu wyglądają podobnie do następujących danych wyjściowych:

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}

Pole PrincipalOid może służyć do pobrania określonego użytkownika za pomocą polecenia cmdlet Get-AzADUserAzure PowerShell . Zastąp element {principalOid} odpowiedzią uzyskaną z poprzedniego przykładu.

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

Dzienniki usługi Azure Monitor

Jeśli masz obszar roboczy usługi Log Analytics z rozwiązaniem Activity Log Analytics powiązanym z AzureActivity subskrypcją, możesz również wyświetlić wyniki niezgodności z oceny nowych i zaktualizowanych zasobów przy użyciu prostych zapytań Kusto i AzureActivity tabeli. Szczegółowe informacje w dziennikach usługi Azure Monitor umożliwiają skonfigurowanie alertów pod kątem watch pod kątem niezgodności.

Zrzut ekranu przedstawiający dzienniki usługi Azure Monitor przedstawiające akcje Azure Policy w tabeli AzureActivity.

Azure Resource Graph

Rekordy zgodności są przechowywane w usłudze Azure Resource Graph (ARG). Dane można eksportować z zapytań usługi ARG w celu utworzenia dostosowanych pulpitów nawigacyjnych na podstawie zakresów i zasad zainteresowania. Przejrzyj nasze przykładowe zapytania dotyczące eksportowania danych zgodności za pośrednictwem usługi ARG.

Następne kroki