Examinar o acesso a funções administrativas usando as APIs de revisão de acesso

A API de revisões de acesso no Microsoft Graph permite que as organizações auditem e atestem o acesso que as identidades (também chamadas de entidades) são atribuídas aos recursos na organização. Um dos recursos mais sensíveis em uma organização são as funções administrativas. Usando a API de revisões de acesso, as organizações podem atestar periodicamente as entidades que têm acesso a funções administrativas de acordo com a política de organização.

A Contoso precisa garantir que apenas os atribuidos certos sejam atribuídos às funções administrativas. Os auditores do sistema também devem auditar o histórico de revisão de acesso para relatar a eficácia dos controles internos da Contoso.

Neste tutorial, você aprende a:

  • Crie uma revisão de acesso recorrente de entidades com funções Microsoft Entra ativas ou qualificadas.
  • Investigue as decisões aplicadas às revisões de acesso.
  • Gerar um relatório de histórico de revisão de acesso

Pré-requisitos

Para concluir este tutorial, você precisa dos seguintes recursos e privilégios:

  • Um locatário Microsoft Entra funcionando com uma licença P2 ou Microsoft Entra ID Governance Microsoft Entra ID habilitada.
  • Entre em um cliente de API, como o Graph Explorer chamar o Microsoft Graph com uma conta que tenha pelo menos a função administrador de governança de identidade.
  • Entidades de segurança, como um grupo de segurança e um usuário individual, com atribuições ativas ou qualificadas para uma função Microsoft Entra, como a função administrador de usuário. Suas atribuições são o escopo da revisão de acesso. Para atribuir funções administrativas, consulte Tutorial: use a API do PIM (Privileged Identity Management) para atribuir funções Microsoft Entra.
  • Conceda a si mesmo as seguintes permissões delegadas: AccessReview.ReadWrite.All.

Etapa 1: criar uma revisão de acesso de atribuições de função

A definição de agendamento de revisão de acesso a seguir tem as seguintes configurações:

  • O escopo da revisão é grupos e usuários (propriedade principalScopes ) com acesso à função administrador de usuário.
    • Uma revisão de acesso pode ser escopo para vários tipos principais (usuários e grupos ou entidades de serviço) e apenas um recurso. Para examinar o acesso a várias funções de Microsoft Entra, crie revisões de acesso separadas.
    • roleDefinitionId fe930be7-5e62-47db-91af-98c3a49a38b1 é o identificador de modelo global para a função Microsoft Entra Administrador de Usuário.
  • As atribuições ativas e qualificadas para a função de Administrador de Usuário estão em revisão.
  • O revisor é um usuário individual. Você pode atribuir a si mesmo como o revisor.
  • O aprovador deve fornecer justificativa antes de aprovar o acesso à função Microsoft Entra.
  • A decisão padrão é None quando os revisores não respondem à solicitação de revisão de acesso antes da instância expirar.
  • autoApplyDecisionsEnabled não é definido e é padrão como false. Nesse caso, após a conclusão da revisão, as decisões não são aplicadas automaticamente, portanto, você deve aplicá-las manualmente.
  • A revisão se repetirá a cada três meses em um período de três dias e não termina.

Solicitação

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

Resposta

Observação: o objeto de resposta mostrado aqui pode ser encurtado para legibilidade.

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

Etapa 2: recuperar instâncias da revisão de acesso

Cada instância de revisão de acesso representa cada recorrência com cada recurso exclusivo que está em análise. Como você definiu uma revisão de acesso recorrente, a ID da instância é diferente da ID da definição de agendamento na Etapa 1.

Solicitação

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

Resposta

O status dessa instância de revisão de acesso é InProgress, o que significa que a instância de revisão está aberta para os revisores enviarem decisões e o período para essa instância de revisão de acesso não expirou. Você também recebeu uma notificação por email do Microsoft Azure solicitando que você executasse a revisão de acesso.

Observação: o objeto de resposta mostrado aqui pode ser encurtado para legibilidade.

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

Etapa 3: recuperar decisões de revisão de acesso antes de registrar qualquer decisão

Antes de postar decisões, vamos primeiro inspecionar os itens à espera de sua decisão.

Solicitação

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

Resposta

A resposta a seguir mostra dois itens de decisão cada um correspondentes a uma decisão necessária para o acesso de cada entidade ao recurso. Como as recomendações não estavam habilitadas na Etapa 1, nenhuma recomendação está disponível. Como revisor, agora você pode enviar suas decisões para a instância de revisão de acesso.

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

Etapa 4: Registrar decisões

Suponha que a política da empresa exija que o acesso a funções administrativas seja concedido por meio de grupos de segurança e não diretamente a entidades de segurança individuais. Em conformidade com a política da empresa, você posta uma decisão de negar o acesso de Adele Vance ao aprovar o acesso para o grupo.

Aprovar a atribuição de função do grupo de segurança

Na solicitação a seguir, você aprova o acesso para o grupo helpdesk de TI. A solicitação retorna o código de resposta 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"
}

Negar ao usuário individual sua atribuição de função

Na solicitação a seguir, você nega o acesso para Adele Vance. A solicitação retorna o código de resposta 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'"
}

Quando você recupera as decisões de revisão de acesso (repita a Etapa 3), elas têm as seguintes configurações:

  • A decisão de revisão de acesso para o grupo helpdesk de TI é Approve enquanto para Adele é Deny.
  • O objeto reviewedBy contém seus detalhes como o revisor.
  • applyResult significa New que as decisões não foram aplicadas.

Embora você tenha gravado todas as decisões pendentes para esta instância, as decisões não foram aplicadas aos objetos de recurso e principal. Por exemplo, Adele ainda tem privilégios de Administrador de Usuário. Você pode verificar essa atribuição executando a consulta https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments?$filter=roleDefinitionId eq 'fe930be7-5e62-47db-91af-98c3a49a38b1'a seguir . Esse comportamento ocorre porque o autoApplyDecisionsEnabled foi definido como false, você não interrompeu a revisão ou o período da instância não terminou.

Neste tutorial, você não interromperá a instância manualmente, mas a deixará terminar automaticamente e aplicará as decisões.

Dica

  1. Até que o status da instância de revisão de acesso seja marcado como Completed, você ainda poderá alterar as decisões. Execute novamente a etapa 4 para aplicar decisões diferentes para as entidades de segurança.
  2. Você também pode interromper manualmente a instância de revisão de acesso para que você possa agilizar seu progresso para a Etapa 5.

Etapa 5: aplicar decisões de revisão de acesso

Como administrador, depois que o status da instância de revisão de acesso for definido como Completed, você poderá aplicar as decisões. A solicitação retorna o código de resposta 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

Adele perdeu o acesso à função de Administrador de Usuário, enquanto o grupo helpdesk de TI manteve seu acesso. Você pode verificar esse estado de atribuição de função executando a consulta GET https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments?$filter=roleDefinitionId eq 'fe930be7-5e62-47db-91af-98c3a49a38b1'a seguir .

O status da instância de revisão de acesso agora Appliedé . Além disso, como a revisão de acesso é recorrente, uma nova instância é criada imediatamente. Sua data de início é de três meses a partir do endDateTime da instância de revisão atual.

Etapa 6: recuperar definições de histórico de revisão de acesso

Os auditores da Contoso também querem examinar o histórico de revisão de acesso do último trimestre. Neste exemplo, você gera um relatório de histórico de revisão de acesso para todos os objetos accessReviewScheduleDefinition com escopo para atribuições de função de diretório (roleAssignmentScheduleInstances). Nesta consulta, as revisões de acesso com todas as decisões são incluídas no relatório de histórico.

Primeiro, você define o escopo do relatório de histórico. Em seguida, você gera um URI de download que os auditores usam para baixar o relatório. O URI de download está ativo por apenas 24 horas. Portanto, após a expiração, você pode regenerar outro URI de download do relatório de histórico definido anteriormente.

Definir o escopo dos dados do histórico de revisão de acesso

Solicitação

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

Resposta

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

Recuperar as instâncias do histórico de revisão de acesso

Solicitação

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

Resposta

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

Solicitação

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

Resposta

A propriedade downloadUri contém um link para baixar o relatório de histórico em um formato de arquivo do Excel. Este link está ativo por apenas 24 horas.

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

Etapa 7: Limpar recursos

Nesta etapa, você exclui a definição de revisão de acesso. Como a definição de agenda de revisão de acesso é o blueprint para a revisão de acesso, excluir a definição remove as configurações, instâncias e decisões relacionadas. A solicitação retorna uma 204 No Content resposta.

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

Conclusão

Você aprendeu a revisar o acesso a funções administrativas e gerar um relatório de histórico de revisão de acesso auditável para relatórios de conformidade. Sua organização pode usar as APIs de revisão de acesso para controlar continuamente o acesso privilegiado aos seus recursos, incluindo funções Microsoft Entra e funções de recurso do Azure. Além de usuários e grupos, você também pode examinar o acesso de aplicativos e entidades de serviço a funções administrativas.