Delegeringswijzigingen in uw beherende tenant controleren

Als serviceprovider wilt u wellicht weten wanneer klantabonnementen of resourcegroepen worden gedelegeerd aan uw tenant via Azure Lighthouse of wanneer eerder gedelegeerde resources worden verwijderd.

In de beherende tenant houdt het Azure-activiteitenlogboek delegeringsactiviteit bij op tenantniveau. Deze vastgelegde activiteit omvat eventuele toegevoegde of verwijderde delegaties van tenants van klanten.

In dit onderwerp worden de machtigingen uitgelegd die nodig zijn om delegeringsactiviteiten voor uw tenant voor al uw klanten te bewaken. Het bevat ook een voorbeeldscript met één methode voor het opvragen en rapporteren van deze gegevens.

Belangrijk

Al deze stappen moeten worden uitgevoerd in uw beheertenant, in plaats van in tenants van klanten.

Hoewel we in dit onderwerp verwijzen naar serviceproviders en klanten, kunnen ondernemingen die meerdere tenants beheren dezelfde processen gebruiken.

Toegang tot gegevens op tenantniveau inschakelen

Als u toegang wilt krijgen tot activiteitenlogboekgegevens op tenantniveau, moet aan een account de ingebouwde Azure-rol Bewakingslezer worden toegewezen voor het hoofdbereik (/). Deze toewijzing moet worden uitgevoerd door een gebruiker met de rol Global Beheer istrator met extra verhoogde toegang.

Toegang verhogen voor een Global Beheer istrator-account

Als u een rol wilt toewijzen aan het hoofdbereik (/), moet u de rol Global Beheer istrator met verhoogde toegang hebben. Deze verhoogde toegang moet alleen worden toegevoegd wanneer u de roltoewijzing moet maken en vervolgens moet worden verwijderd wanneer u klaar bent.

Zie Toegang verhogen voor het beheren van alle Azure-abonnementen en -beheergroepen voor gedetailleerde instructies over het toevoegen en verwijderen van uitbreidingen.

Nadat u uw toegang hebt verheven, heeft uw account de rol Gebruikerstoegang Beheer istrator in Azure in het hoofdbereik. Met deze roltoewijzing kunt u alle resources weergeven en toegang toewijzen in een abonnement of beheergroep in de directory, en roltoewijzingen maken in het hoofdbereik.

De rol Bewakingslezer toewijzen aan het hoofdbereik

Zodra u uw toegang hebt verhoogd, kunt u de juiste machtigingen toewijzen aan een account, zodat er query's kunnen worden uitgevoerd op activiteitenlogboekgegevens op tenantniveau. Aan dit account moet de ingebouwde Rol Bewakingslezer van Azure zijn toegewezen aan het hoofdbereik van uw beheertenant.

Belangrijk

Het verlenen van een roltoewijzing in het hoofdbereik betekent dat dezelfde machtigingen van toepassing zijn op elke resource in de tenant. Omdat dit een breed toegangsniveau is, raden we u aan deze rol toe te wijzen aan een service-principal-account en dat account te gebruiken om een query uit te voeren op gegevens.

U kunt de rol Bewakingslezer ook toewijzen aan afzonderlijke gebruikers of aan gebruikersgroepen, zodat ze delegeringsgegevens rechtstreeks in Azure Portal kunnen bekijken. Als u dit doet, moet u er rekening mee houden dat dit een breed toegangsniveau is dat moet worden beperkt tot het minste aantal gebruikers dat mogelijk is.

Gebruik een van de volgende methoden om de toewijzing van het hoofdbereik te maken.

PowerShell

# Log in first with Connect-AzAccount if you're not using Cloud Shell

New-AzRoleAssignment -SignInName <yourLoginName> -Scope "/" -RoleDefinitionName "Monitoring Reader"  -ObjectId <objectId> 

Azure-CLI

# Log in first with az login if you're not using Cloud Shell

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 --role "Monitoring Reader" --scope "/"

Verhoogde toegang voor het global Beheer istrator-account verwijderen

Nadat u de rol Controlelezer bij het hoofdbereik hebt toegewezen aan het gewenste account, moet u ervoor zorgen dat u de verhoogde toegang voor het globale Beheer istrator-account verwijdert, omdat dit toegangsniveau niet meer nodig is.

Delegeringswijzigingen weergeven in De Azure-portal

Gebruikers aan wie de rol Controlelezer in het hoofdbereik is toegewezen, kunnen delegeringswijzigingen rechtstreeks in Azure Portal bekijken.

  1. Navigeer naar de pagina Mijn klanten en selecteer vervolgens Activiteitenlogboek in het navigatiemenu aan de linkerkant.
  2. Zorg ervoor dat Directory-activiteit is geselecteerd in het filter boven aan het scherm.

Er wordt een lijst met overdrachtswijzigingen weergegeven. U kunt kolommen bewerken selecteren om de status, gebeurteniscategorie, tijd, tijdstempel, abonnement, gebeurtenis geïnitieerd door, resourcegroep, resourcetype en resourcewaarden weer te geven of te verbergen.

Screenshot of delegation changes in the Azure portal.

Een service-principal-account gebruiken om een query uit te voeren op het activiteitenlogboek

Omdat de rol Bewakingslezer in het hoofdbereik zo'n breed toegangsniveau is, kunt u de rol toewijzen aan een service-principal-account en dat account gebruiken om gegevens op te vragen met behulp van het onderstaande script.

Belangrijk

Op dit moment kunnen tenants met een grote hoeveelheid delegatieactiviteit fouten tegenkomen bij het uitvoeren van query's op deze gegevens.

Wanneer u een service-principal-account gebruikt om een query uit te voeren op het activiteitenlogboek, raden we de volgende aanbevolen procedures aan:

Zodra u een nieuw service-principal-account hebt gemaakt met bewakingslezertoegang tot het hoofdbereik van uw beherende tenant, kunt u dit gebruiken om query's uit te voeren en te rapporteren over delegeringsactiviteit in uw tenant.

Dit Azure PowerShell-script kan worden gebruikt om een query uit te voeren op de afgelopen dag van activiteit en eventuele toegevoegde of verwijderde delegaties te rapporteren (of pogingen die niet zijn geslaagd). Er worden query's uitgevoerd op de gegevens van het tenantactiviteitenlogboek en vervolgens worden de volgende waarden samengesteld om te rapporteren over delegaties die worden toegevoegd of verwijderd:

  • DelegatedResourceId: de id van het gedelegeerde abonnement of de resourcegroep
  • CustomerTenantId: De tenant-id van de klant
  • CustomerSubscriptionId: de abonnements-id die is gedelegeerd of die de resourcegroep bevat die is gedelegeerd
  • CustomerDelegationStatus: de statuswijziging voor de gedelegeerde resource (geslaagd of mislukt)
  • EventTimeStamp: de datum en tijd waarop de overdrachtswijziging is vastgelegd

Houd rekening met het volgende bij het uitvoeren van query's op deze gegevens:

  • Als meerdere resourcegroepen worden gedelegeerd in één implementatie, worden afzonderlijke vermeldingen geretourneerd voor elke resourcegroep.
  • Wijzigingen in een vorige delegatie (zoals het bijwerken van de machtigingsstructuur) worden geregistreerd als een toegevoegde delegatie.
  • Zoals hierboven vermeld, moet een account de ingebouwde Rol bewakingslezer van Azure hebben voor het hoofdbereik (/) om toegang te krijgen tot deze gegevens op tenantniveau.
  • U kunt deze gegevens gebruiken in uw eigen werkstromen en rapportage. U kunt bijvoorbeeld de HTTP Data Collector-API (preview) gebruiken om gegevens vanuit een REST API-client te registreren bij Azure Monitor en vervolgens actiegroepen gebruiken om meldingen of waarschuwingen te maken.
# Log in first with Connect-AzAccount if you're not using Cloud Shell

# Azure Lighthouse: Query Tenant Activity Log for registered/unregistered delegations for the last 1 day

$GetDate = (Get-Date).AddDays((-1))

$dateFormatForQuery = $GetDate.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")

# Getting Azure context for the API call
$currentContext = Get-AzContext

# Fetching new token
$azureRmProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$profileClient = [Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient]::new($azureRmProfile)
$token = $profileClient.AcquireAccessToken($currentContext.Tenant.Id)

$listOperations = @{
    Uri     = "https://management.azure.com/providers/microsoft.insights/eventtypes/management/values?api-version=2015-04-01&`$filter=eventTimestamp ge '$($dateFormatForQuery)'"
    Headers = @{
        Authorization  = "Bearer $($token.AccessToken)"
        'Content-Type' = 'application/json'
    }
    Method  = 'GET'
}
$list = Invoke-RestMethod @listOperations

# First link can be empty - and point to a next link (or potentially multiple pages)
# While you get more data - continue fetching and add result
while($list.nextLink){
    $list2 = Invoke-RestMethod $list.nextLink -Headers $listOperations.Headers -Method Get
    $data+=$list2.value;
    $list.nextLink = $list2.nextlink;
}

$showOperations = $data;

if ($showOperations.operationName.value -eq "Microsoft.Resources/tenants/register/action") {
    $registerOutputs = $showOperations | Where-Object -FilterScript { $_.eventName.value -eq "EndRequest" -and $_.resourceType.value -and $_.operationName.value -eq "Microsoft.Resources/tenants/register/action" }
    foreach ($registerOutput in $registerOutputs) {
        $eventDescription = $registerOutput.description | ConvertFrom-Json;
    $registerOutputdata = [pscustomobject]@{
        Event                    = "An Azure customer has registered delegated resources to your Azure tenant";
        DelegatedResourceId      = $eventDescription.delegationResourceId; 
        CustomerTenantId         = $eventDescription.subscriptionTenantId;
        CustomerSubscriptionId   = $eventDescription.subscriptionId;
        CustomerDelegationStatus = $registerOutput.status.value;
        EventTimeStamp           = $registerOutput.eventTimestamp;
        }
        $registerOutputdata | Format-List
    }
}
if ($showOperations.operationName.value -eq "Microsoft.Resources/tenants/unregister/action") {
    $unregisterOutputs = $showOperations | Where-Object -FilterScript { $_.eventName.value -eq "EndRequest" -and $_.resourceType.value -and $_.operationName.value -eq "Microsoft.Resources/tenants/unregister/action" }
    foreach ($unregisterOutput in $unregisterOutputs) {
        $eventDescription = $registerOutput.description | ConvertFrom-Json;
    $unregisterOutputdata = [pscustomobject]@{
        Event                    = "An Azure customer has unregistered delegated resources from your Azure tenant";
        DelegatedResourceId      = $eventDescription.delegationResourceId;
        CustomerTenantId         = $eventDescription.subscriptionTenantId;
        CustomerSubscriptionId   = $eventDescription.subscriptionId;
        CustomerDelegationStatus = $unregisterOutput.status.value;
        EventTimeStamp           = $unregisterOutput.eventTimestamp;
        }
        $unregisterOutputdata | Format-List
    }
}
else {
    Write-Output "No new delegation events for tenant: $($currentContext.Tenant.TenantId)"
}

Volgende stappen