Monitorowanie zmian delegowania w dzierżawie zarządzającej

Jako dostawca usług możesz chcieć wiedzieć, kiedy subskrypcje klienta lub grupy zasobów są delegowane do dzierżawy za pośrednictwem usługi Azure Lighthouse lub gdy wcześniej delegowane zasoby zostaną usunięte.

W dzierżawie zarządzającej dziennik aktywności platformy Azure śledzi aktywność delegowania na poziomie dzierżawy. To zarejestrowane działanie obejmuje wszystkie dodane lub usunięte delegowania z dzierżaw klientów.

W tym temacie opisano uprawnienia wymagane do monitorowania działań delegowania do dzierżawy we wszystkich Twoich klientach. Zawiera również przykładowy skrypt, który pokazuje jedną metodę wykonywania zapytań i raportowania tych danych.

Ważne

Wszystkie te kroki należy wykonać w dzierżawie zarządzającej, a nie w dowolnej dzierżawie klienta.

Chociaż w tym temacie odwołujemy się do dostawców usług i klientów, przedsiębiorstwa zarządzające wieloma dzierżawami mogą używać tych samych procesów.

Włączanie dostępu do danych na poziomie dzierżawy

Aby uzyskać dostęp do danych dziennika aktywności na poziomie dzierżawy, konto musi mieć przypisaną wbudowaną rolę Czytelnik monitorowania platformy Azure w zakresie głównym (/). To przypisanie musi być wykonywane przez użytkownika, który ma rolę Global Administracja istrator z dodatkowym podwyższonym poziomem uprawnień.

Podnoszenie poziomu dostępu dla konta globalnego Administracja istratora

Aby przypisać rolę w zakresie głównym (/), musisz mieć rolę globalnego Administracja istratora z podwyższonym poziomem dostępu. Ten podwyższony poziom dostępu powinien być dodawany tylko wtedy, gdy konieczne jest przypisanie roli, a następnie usunięty po zakończeniu.

Aby uzyskać szczegółowe instrukcje dotyczące dodawania i usuwania podniesienia uprawnień, zobacz Podnoszenie poziomu dostępu do zarządzania wszystkimi subskrypcjami i grupami zarządzania platformy Azure.

Po podwyższeniu poziomu dostępu twoje konto będzie mieć rolę Administracja istratora dostępu użytkowników na platformie Azure w zakresie głównym. To przypisanie roli umożliwia wyświetlanie wszystkich zasobów i przypisywanie dostępu w dowolnej subskrypcji lub grupie zarządzania w katalogu, a także tworzenie przypisań ról w zakresie głównym.

Przypisywanie roli Czytelnik monitorowania w zakresie głównym

Po podwyższeniu poziomu dostępu możesz przypisać odpowiednie uprawnienia do konta, aby umożliwić wykonywanie zapytań dotyczących danych dziennika aktywności na poziomie dzierżawy. To konto musi mieć wbudowaną rolę czytelnika monitorowania platformy Azure przypisaną w głównym zakresie dzierżawy zarządzania.

Ważne

Przyznanie przypisania roli w zakresie głównym oznacza, że te same uprawnienia będą stosowane do każdego zasobu w dzierżawie. Ponieważ jest to szeroki poziom dostępu, zalecamy przypisanie tej roli do konta jednostki usługi i użycie tego konta do wykonywania zapytań dotyczących danych.

Rolę Czytelnik monitorowania można również przypisać do poszczególnych użytkowników lub grup użytkowników, aby mogli wyświetlać informacje delegowania bezpośrednio w witrynie Azure Portal. Jeśli to zrobisz, należy pamiętać, że jest to szeroki poziom dostępu, który powinien być ograniczony do najmniejszej liczby możliwych użytkowników.

Użyj jednej z następujących metod, aby przypisać zakres główny.

Program PowerShell

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

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

Interfejs wiersza polecenia platformy Azure

# 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 "/"

Usuwanie podwyższonego poziomu dostępu dla konta globalnego Administracja istratora

Po przypisaniu roli Czytelnik monitorowania w zakresie głównym do żądanego konta pamiętaj, aby usunąć podwyższony poziom dostępu dla konta globalnego Administracja istrator, ponieważ ten poziom dostępu nie będzie już potrzebny.

Wyświetlanie zmian delegowania w witrynie Azure Portal

Użytkownicy, którym przypisano rolę Czytelnik monitorowania w zakresie głównym, mogą wyświetlać zmiany delegowania bezpośrednio w witrynie Azure Portal.

  1. Przejdź do strony Moje klienci , a następnie wybierz pozycję Dziennik aktywności z menu nawigacji po lewej stronie.
  2. Upewnij się, że działanie katalogu jest zaznaczone w filtrze w górnej części ekranu.

Zostanie wyświetlona lista zmian delegowania. Możesz wybrać pozycję Edytuj kolumny , aby wyświetlić lub ukryć wartości Stan, Kategoria zdarzeń, Czas, Sygnatura czasowa, Subskrypcja, Zdarzenie inicjowane przez, Grupa zasobów, Typ zasobu i Zasób .

Screenshot of delegation changes in the Azure portal.

Używanie konta jednostki usługi do wykonywania zapytań w dzienniku aktywności

Ponieważ rola Czytelnik monitorowania w zakresie głównym jest tak szeroki poziom dostępu, możesz przypisać rolę do konta jednostki usługi i użyć tego konta do wykonywania zapytań dotyczących danych przy użyciu poniższego skryptu.

Ważne

Obecnie dzierżawy z dużą ilością działań delegowania mogą napotkać błędy podczas wykonywania zapytań dotyczących tych danych.

W przypadku używania konta jednostki usługi do wykonywania zapytań w dzienniku aktywności zalecamy następujące najlepsze rozwiązania:

Po utworzeniu nowego konta jednostki usługi z dostępem czytelnika monitorowania do zakresu głównego dzierżawy zarządzania możesz użyć go do wykonywania zapytań i raportowania działań delegowania w dzierżawie.

Ten skrypt programu Azure PowerShell może służyć do wykonywania zapytań dotyczących ostatniego dnia działania i zgłaszania wszelkich dodanych lub usuniętych delegacji (lub prób, które nie powiodły się). Wysyła zapytanie do danych dziennika aktywności dzierżawy, a następnie tworzy następujące wartości w celu raportowania delegowania, które są dodawane lub usuwane:

  • DelegatedResourceId: identyfikator delegowanej subskrypcji lub grupy zasobów
  • CustomerTenantId: identyfikator dzierżawy klienta
  • CustomerSubscriptionId: identyfikator subskrypcji, który został delegowany lub który zawiera grupę zasobów, która została delegowana
  • CustomerDelegationStatus: zmiana stanu delegowanego zasobu (powodzenie lub niepowodzenie)
  • EventTimeStamp: data i godzina zarejestrowania zmiany delegowania

Podczas wykonywania zapytań dotyczących tych danych należy pamiętać:

  • Jeśli wiele grup zasobów jest delegowanych w jednym wdrożeniu, dla każdej grupy zasobów zostaną zwrócone oddzielne wpisy.
  • Zmiany wprowadzone w poprzednim delegowaniu (takie jak aktualizowanie struktury uprawnień) zostaną zarejestrowane jako dodane delegowanie.
  • Jak wspomniano powyżej, konto musi mieć wbudowaną rolę czytelnika monitorowania platformy Azure w zakresie głównym (/), aby uzyskać dostęp do tych danych na poziomie dzierżawy.
  • Te dane można używać we własnych przepływach pracy i raportowaniu. Na przykład możesz użyć interfejsu API modułu zbierającego dane HTTP (wersja zapoznawcza) do rejestrowania danych w usłudze Azure Monitor z poziomu klienta interfejsu API REST, a następnie używać grup akcji do tworzenia powiadomień lub alertów.
# 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)"
}

Następne kroki