Проверка доступа к административным ролям с помощью API проверки доступа

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

Компании Contoso необходимо убедиться, что только право назначаемые роли назначены административным ролям. Системные аудиторы также должны провести аудит журнала проверок доступа, чтобы сообщить об эффективности внутренних средств контроля Contoso.

В этом руководстве рассказывается, как:

  • Создайте повторяющуюся проверку доступа субъектов с активными или соответствующими Microsoft Entra ролями.
  • Изучите решения, которые применяются к проверкам доступа.
  • Создание отчета журнала проверки доступа

Предварительные требования

Для работы с этим руководством вам потребуются следующие ресурсы и привилегии:

  • Рабочий клиент Microsoft Entra с включенной лицензией Microsoft Entra ID P2 или Управление Microsoft Entra ID.
  • Войдите в клиент API, например Graph Обозреватель, чтобы вызвать Microsoft Graph с учетной записью, которая имеет по крайней мере роль администратора управления удостоверениями.
  • Субъекты, такие как группа безопасности и отдельный пользователь, с активными или соответствующими назначениями Microsoft Entra роли, например роли администратора пользователей. Их назначения являются область проверки доступа. Сведения о назначении административных ролей см. в статье Руководство. Использование API управление привилегированными пользователями (PIM) для назначения Microsoft Entra ролей.
  • Предоставьте себе следующие делегированные разрешения: AccessReview.ReadWrite.All.

Шаг 1. Создание проверки доступа для назначений ролей

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

  • Область проверки — группы и пользователи (свойство principalScopes) с доступом к роли администратора пользователей.
    • Проверка доступа может быть ограничена несколькими типами субъектов (пользователи и группы или субъекты-службы) и только одним ресурсом. Чтобы проверить доступ к нескольким Microsoft Entra ролям, создайте отдельные проверки доступа.
    • roleDefinitionId fe930be7-5e62-47db-91af-98c3a49a38b1 — это глобальный идентификатор шаблона для роли администратора Microsoft Entra пользователей.
  • Просматриваются как активные, так и соответствующие назначения роли администратора пользователей.
  • Рецензент является отдельным пользователем. Вы можете назначить себя в качестве рецензента.
  • Утверждающий должен предоставить обоснование, прежде чем утвердить доступ к роли Microsoft Entra.
  • По умолчанию рецензенты None не отвечают на запрос на проверку доступа до истечения срока действия экземпляра.
  • параметр autoApplyDecisionsEnabled не задан и по умолчанию false— . В этом случае после завершения проверки решения не применяются автоматически, поэтому их необходимо применить вручную.
  • Проверка повторяется каждые три месяца в течение трех дней и не заканчивается.

Запрос

POST https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions
Content-type: application/json

{
    "displayName": "Review access of users and groups to privileged roles",
    "descriptionForAdmins": "Review access of users and groups to privileged roles",
    "scope": {
        "@odata.type": "#microsoft.graph.principalResourceMembershipsScope",
        "principalScopes": [
            {
                "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                "query": "/users",
                "queryType": "MicrosoftGraph"
            },
            {
                "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                "query": "/groups",
                "queryType": "MicrosoftGraph"
            }
        ],
        "resourceScopes": [
            {
                "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                "query": "/roleManagement/directory/roleDefinitions/fe930be7-5e62-47db-91af-98c3a49a38b1",
                "queryType": "MicrosoftGraph"
            }
        ]
    },
    "reviewers": [
        {
            "query": "/users/2560f739-2e0e-4550-9fa0-1a1e67ae0ab8",
            "queryType": "MicrosoftGraph"
        }
    ],
    "settings": {
        "mailNotificationsEnabled": true,
        "reminderNotificationsEnabled": true,
        "justificationRequiredOnApproval": true,
        "defaultDecisionEnabled": false,
        "defaultDecision": "None",
        "instanceDurationInDays": 1,
        "recommendationsEnabled": false,
        "recurrence": {
            "pattern": {
                "type": "absoluteMonthly",
                "interval": 3
            },
            "range": {
                "type": "noEnd",
                "startDate": "2024-03-25"
            }
        }
    }
}

Отклик

Примечание. Объект отклика, показанный здесь, может быть сокращен для удобочитаемости.

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#identityGovernance/accessReviews/definitions/$entity",
    "id": "02800b79-1a6f-40b7-8381-c0bebc3763bd",
    "displayName": "Review access of users and groups to privileged roles",
    "status": "NotStarted",
    "descriptionForAdmins": "Review access of users and groups to privileged roles",
    "scope": {
        "@odata.type": "#microsoft.graph.principalResourceMembershipsScope",
        "principalScopes": [
            {
                "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                "query": "/users",
                "queryType": "MicrosoftGraph"
            },
            {
                "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                "query": "/groups",
                "queryType": "MicrosoftGraph"
            }
        ],
        "resourceScopes": [
            {
                "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                "query": "/roleManagement/directory/roleDefinitions/fe930be7-5e62-47db-91af-98c3a49a38b1",
                "queryType": "MicrosoftGraph"
            }
        ]
    },
    "reviewers": [
        {
            "query": "/users/2560f739-2e0e-4550-9fa0-1a1e67ae0ab8",
            "queryType": "MicrosoftGraph"
        }
    ],
    "fallbackReviewers": [],
    "settings": {
        "mailNotificationsEnabled": true,
        "reminderNotificationsEnabled": true,
        "justificationRequiredOnApproval": true,
        "defaultDecisionEnabled": false,
        "defaultDecision": "None",
        "instanceDurationInDays": 1,
        "autoApplyDecisionsEnabled": false,
        "recommendationsEnabled": false,
        "recommendationLookBackDuration": null,
        "decisionHistoriesForReviewersEnabled": false,
        "recurrence": {
            "pattern": {
                "type": "absoluteMonthly",
                "interval": 3,
                "month": 0,
                "dayOfMonth": 0,
                "daysOfWeek": [],
                "firstDayOfWeek": "sunday",
                "index": "first"
            },
            "range": {
                "type": "noEnd",
                "numberOfOccurrences": 0,
                "recurrenceTimeZone": null,
                "startDate": "2024-03-25",
                "endDate": null
            }
        },
        "applyActions": [],
        "recommendationInsightSettings": []
    },
    "stageSettings": [],
    "additionalNotificationRecipients": []
}

Шаг 2. Получение экземпляров проверки доступа

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

Запрос

GET https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/02800b79-1a6f-40b7-8381-c0bebc3763bd/instances

Отклик

Состояние этого экземпляра проверки доступа равно InProgress, что означает, что экземпляр проверки открыт для рецензентов для отправки решений, а период для этого экземпляра проверки доступа не истек. Вы также получили уведомление по электронной почте от Microsoft Azure с просьбой выполнить проверку доступа.

Примечание. Объект отклика, показанный здесь, может быть сокращен для удобочитаемости.

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#identityGovernance/accessReviews/definitions('02800b79-1a6f-40b7-8381-c0bebc3763bd')/instances",
    "@odata.count": 1,
    "@microsoft.graph.tips": "Use $select to choose only the properties your app needs, as this can lead to performance improvements. For example: GET identityGovernance/accessReviews/definitions('<guid>')/instances?$select=endDateTime,fallbackReviewers",
    "value": [
        {
            "id": "30f0cb53-da42-402e-8be5-9005f9c374f7",
            "startDateTime": "2024-03-25T09:38:15.177Z",
            "endDateTime": "2024-03-26T09:38:15.177Z",
            "status": "InProgress",
            "scope": {
                "@odata.type": "#microsoft.graph.principalResourceMembershipsScope",
                "principalScopes": [
                    {
                        "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                        "query": "/v1.0/users",
                        "queryType": "MicrosoftGraph"
                    },
                    {
                        "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                        "query": "/v1.0/groups",
                        "queryType": "MicrosoftGraph"
                    }
                ],
                "resourceScopes": [
                    {
                        "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                        "query": "/beta/roleManagement/directory/roleDefinitions/fe930be7-5e62-47db-91af-98c3a49a38b1",
                        "queryType": "MicrosoftGraph"
                    }
                ]
            },
            "reviewers": [
                {
                    "query": "/v1.0/users/2560f739-2e0e-4550-9fa0-1a1e67ae0ab8",
                    "queryType": "MicrosoftGraph"
                }
            ],
            "fallbackReviewers": []
        }
    ]
}

Шаг 3. Получение решений о проверке доступа перед записью любых решений

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

Запрос

GET https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/02800b79-1a6f-40b7-8381-c0bebc3763bd/instances/30f0cb53-da42-402e-8be5-9005f9c374f7/decisions

Отклик

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

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#identityGovernance/accessReviews/definitions('02800b79-1a6f-40b7-8381-c0bebc3763bd')/instances('30f0cb53-da42-402e-8be5-9005f9c374f7')/decisions",
    "@odata.count": 2,
    "@microsoft.graph.tips": "Use $select to choose only the properties your app needs, as this can lead to performance improvements. For example: GET identityGovernance/accessReviews/definitions('<guid>')/instances('<guid>')/decisions?$select=accessReviewId,appliedBy",
    "value": [
        {
            "id": "25bf64c2-2396-4efc-9bb8-e9dc39ee0441",
            "accessReviewId": "30f0cb53-da42-402e-8be5-9005f9c374f7",
            "decision": "NotReviewed",
            "applyResult": "New",
            "recommendation": "NoInfoAvailable",
            "principalLink": "https://graph.microsoft.com/v1.0/users/ad20a697-7be8-410a-bb08-207a21e6400d",
            "resourceLink": "https://graph.microsoft.com/beta/roleManagement/directory/roleDefinitions/fe930be7-5e62-47db-91af-98c3a49a38b1",
            "reviewedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "appliedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "resource": {
                "id": "fe930be7-5e62-47db-91af-98c3a49a38b1",
                "displayName": "User Administrator",
                "type": "directoryRole"
            },
            "principal": {
                "@odata.type": "#microsoft.graph.userIdentity",
                "id": "ad20a697-7be8-410a-bb08-207a21e6400d",
                "displayName": "Adele Vance",
                "type": "user",
                "userPrincipalName": "AdeleV@contoso.com",
                "lastUserSignInDateTime": ""
            }
        },
        {
            "id": "888007fa-1d32-4000-a359-fd1d5876a3ed",
            "accessReviewId": "30f0cb53-da42-402e-8be5-9005f9c374f7",
            "decision": "NotReviewed",
            "applyResult": "New",
            "recommendation": "NoInfoAvailable",
            "principalLink": "https://graph.microsoft.com/v1.0/groups/df434df5-5b8e-4044-9fa3-ac9d6ea45156",
            "resourceLink": "https://graph.microsoft.com/beta/roleManagement/directory/roleDefinitions/fe930be7-5e62-47db-91af-98c3a49a38b1",
            "reviewedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "appliedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "resource": {
                "id": "fe930be7-5e62-47db-91af-98c3a49a38b1",
                "displayName": "User Administrator",
                "type": "directoryRole"
            },
            "principal": {
                "id": "df434df5-5b8e-4044-9fa3-ac9d6ea45156",
                "displayName": "User Administrators",
                "type": "group"
            }
        }
    ]
}

Шаг 4. Запись решений

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

Утверждение назначения ролей группы безопасности

В следующем запросе вы утверждаете доступ к группе ИТ-службы технической поддержки. Запрос возвращает код отклика 204 No Content.

POST https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/02800b79-1a6f-40b7-8381-c0bebc3763bd/instances/30f0cb53-da42-402e-8be5-9005f9c374f7/decisions/888007fa-1d32-4000-a359-fd1d5876a3ed
Content-type: application/json

{
    "decision": "Approve",
    "justification": "The IT Helpdesk requires continued access to the User Administrator role to manage user account support requests, lifecycle, and access to resources"
}

Запретить отдельному пользователю назначение ролей

В следующем запросе вы запретите доступ для Адель Вэнс. Запрос возвращает код отклика 204 No Content.

POST https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/02800b79-1a6f-40b7-8381-c0bebc3763bd/instances/30f0cb53-da42-402e-8be5-9005f9c374f7/decisions/25bf64c2-2396-4efc-9bb8-e9dc39ee0441
Content-type: application/json

{
    "decision": "Deny",
    "justification": "Adele should join an allowed group to maintain access to the User Administrator role. For more details, refer to the company policy '#132487: Administrative roles'"
}

При получении решений о проверке доступа (повтор шага 3) они имеют следующие параметры:

  • Решение о проверке доступа для группы ИТ-службы поддержки имеет значение Approve , а для Adele — Deny.
  • Объект reviewedBy содержит сведения в качестве рецензента.
  • applyResult означает New , что решения не были применены.

Хотя вы записали все ожидающие решения для этого экземпляра, решения не были применены к объектам ресурсов и субъектов. Например, У Адель по-прежнему есть права администратора пользователей. Это назначение можно проверить, выполнив следующий запрос https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments?$filter=roleDefinitionId eq 'fe930be7-5e62-47db-91af-98c3a49a38b1'. Это связано с тем, что для параметра autoApplyDecisionsEnabled задано значение false, вы не остановили проверку или период экземпляра не закончился.

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

Совет

  1. Пока состояние экземпляра проверки доступа не помечается как Completed, решения по-прежнему можно изменить. Повторно выполните шаг 4, чтобы применить различные решения для субъектов.
  2. Вы также можете вручную остановить экземпляр проверки доступа, чтобы ускорить ход выполнения шага 5.

Шаг 5. Применение решений по проверке доступа

Как администратор, после того как для экземпляра проверки доступа задано значение Completed, вы можете применить решения. Запрос возвращает код отклика 204 No Content.

POST https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/02800b79-1a6f-40b7-8381-c0bebc3763bd/instances/30f0cb53-da42-402e-8be5-9005f9c374f7/applyDecisions

Адель потеряла доступ к роли администратора пользователей, а группа ИТ-службы технической поддержки сохранила свой доступ. Это состояние назначения ролей можно проверить, выполнив следующий запрос GET https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments?$filter=roleDefinitionId eq 'fe930be7-5e62-47db-91af-98c3a49a38b1'.

Теперь экземпляр проверки доступа имеет Appliedсостояние . Кроме того, так как проверка доступа повторяется, немедленно создается новый экземпляр. Дата начала — три месяца с момента endDateTime текущего экземпляра проверки.

Шаг 6. Получение определений журнала проверки доступа

Аудиторы Contoso также хотят просмотреть журнал проверок доступа за последний квартал. В этом примере создается отчет журнала проверки доступа для всех объектов accessReviewScheduleDefinition , ограниченных назначениями ролей каталога (roleAssignmentScheduleInstances). В этом запросе проверки доступа со всеми решениями включаются в отчет журнала.

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

Определение область данных журнала проверки доступа

Запрос

POST https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/historyDefinitions

{
    "displayName": "Last quarter's access reviews for administrative roles - User Administrator",
    "decisions": [],
    "reviewHistoryPeriodStartDateTime": "2024-03-24T00:00:00Z",
    "reviewHistoryPeriodEndDateTime": "9999-12-31T00:00:00Z",
    "scopes": [
        {
            "@odata.type": "#microsoft.graph.accessReviewQueryScope",
            "queryType": "MicrosoftGraph",
            "query": "/identityGovernance/accessReviews/definitions?$filter=contains(scope/query, 'roleAssignmentScheduleInstances')"
        }
    ]
}

Отклик

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#identityGovernance/accessReviews/historyDefinitions/$entity",
    "id": "841fc5d5-b89e-42cd-9f76-3343689aaabf",
    "displayName": "Last quarter's access reviews for administrative roles - User Administrator",
    "reviewHistoryPeriodStartDateTime": "2024-03-24T00:00:00Z",
    "reviewHistoryPeriodEndDateTime": "9999-12-31T00:00:00Z",
    "decisions": [
        "approve",
        "deny",
        "dontKnow",
        "notReviewed",
        "notNotified"
    ],
    "status": "requested",
    "createdDateTime": "2024-03-25T17:15:45.1940174Z",
    "createdBy": {
        "id": "2560f739-2e0e-4550-9fa0-1a1e67ae0ab8",
        "displayName": "MOD Administrator",
        "type": null,
        "userPrincipalName": "admin@contoso.com"
    },
    "scopes": [
        {
            "@odata.type": "#microsoft.graph.accessReviewQueryScope",
            "query": "/identityGovernance/accessReviews/definitions?$filter=contains(scope/query, 'roleAssignmentScheduleInstances')",
            "queryType": "MicrosoftGraph",
            "queryRoot": null
        }
    ]
}

Получение экземпляров журнала проверки доступа

Запрос

POST https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/historyDefinitions/841fc5d5-b89e-42cd-9f76-3343689aaabf/instances

Отклик

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#identityGovernance/accessReviews/historyDefinitions('841fc5d5-b89e-42cd-9f76-3343689aaabf')/instances",
    "@microsoft.graph.tips": "Use $select to choose only the properties your app needs, as this can lead to performance improvements. For example: GET identityGovernance/accessReviews/historyDefinitions('<guid>')/instances?$select=downloadUri,expirationDateTime",
    "value": [
        {
            "id": "841fc5d5-b89e-42cd-9f76-3343689aaabf",
            "reviewHistoryPeriodStartDateTime": "2024-03-24T00:00:00Z",
            "reviewHistoryPeriodEndDateTime": "9999-12-31T00:00:00Z",
            "status": "done",
            "runDateTime": "2024-03-25T17:15:45.1940174Z",
            "fulfilledDateTime": "2024-03-25T17:16:06.5812358Z",
            "downloadUri": null
        }
    ]
}

Запрос

POST https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/historyDefinitions/841fc5d5-b89e-42cd-9f76-3343689aaabf/instances/841fc5d5-b89e-42cd-9f76-3343689aaabf/microsoft.graph.generateDownloadUri

Отклик

Свойство downloadUri содержит ссылку для скачивания отчета журнала в формате файла Excel. Эта ссылка активна всего 24 часа.

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.accessReviewHistoryInstance",
    "id": "841fc5d5-b89e-42cd-9f76-3343689aaabf",
    "reviewHistoryPeriodStartDateTime": "2024-03-24T00:00:00Z",
    "reviewHistoryPeriodEndDateTime": "9999-12-31T00:00:00Z",
    "status": "done",
    "runDateTime": "2024-03-25T17:15:45.1940174Z",
    "fulfilledDateTime": "2024-03-25T17:16:06.5812358Z",
    "downloadUri": "https://ermconsolreportusc.blob.core.windows.net/erm-reports/Last quarter's access reviews for administrative roles - User Administrator-841fc5d5-b89e-42cd-9f76-3343689aaabf.csv?skoid=4ad0868b-7b78-4869-abb7-8f29151d8428&sktid=33e01921-4d64-4f8c-a055-5bdaffd5e33d&skt=2024-03-25T17:17:40Z&ske=2024-03-25T17:19:40Z&sks=b&skv=2021-08-06&sv=2021-08-06&st=2024-03-25T17:17:40Z&se=2024-03-26T17:17:40Z&sr=b&sp=r&sig=g%2BlQj2PxFG1lAYDuUt5VWO8tvLPQebA7GLnqz%2FQb%2BbQ%3D"
}

Шаг 7. Очистка ресурсов

На этом шаге вы удалите определение проверки доступа. Так как определение расписания проверки доступа является схемой проверки доступа, при удалении определения удаляются связанные параметры, экземпляры и решения. Запрос возвращает 204 No Content ответ.

DELETE https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/02800b79-1a6f-40b7-8381-c0bebc3763bd

Заключение

Вы узнали, как проверить доступ к административным ролям и создать отчет о журнале проверки проверяемого доступа для отчетов о соответствии требованиям. Ваша организация может использовать API проверки доступа для постоянного управления привилегированным доступом к ресурсам, включая роли Microsoft Entra и роли ресурсов Azure. Помимо пользователей и групп, можно также проверить доступ приложений и субъектов-служб к административным ролям.