Überwachen von Delegierungsänderungen in Ihrem Verwaltungsmandanten

Als Dienstanbieter möchten Sie möglicherweise wissen, wenn Kundenabonnements oder Ressourcengruppen über Azure Lighthouse an Ihren Mandanten delegiert oder zuvor delegierte Ressourcen entfernt werden.

Im Verwaltungsmandanten werden Delegierungsaktivitäten auf Mandantenebene im Azure-Aktivitätsprotokoll erfasst. Diese protokollierten Aktivitäten umfassen alle hinzugefügten oder entfernten Delegierungen von Kundenmandanten.

In diesem Thema werden die erforderlichen Berechtigungen zum übergreifenden Überwachen von Delegierungsaktivitäten für alle Ihre Kunden für Ihren Mandanten erläutert. Es enthält auch ein Beispielskript, das eine Methode zum Abfragen und zur Berichterstellung für diese Daten zeigt.

Wichtig

Alle diese Schritte müssen in Ihrem Verwaltungsmandanten und nicht in einem Kundenmandanten ausgeführt werden.

Zwar beziehen wir uns in diesem Thema auf Dienstanbieter und Kunden, doch können Unternehmen, die mehrere Mandanten verwalten, denselben Prozess verwenden.

Ermöglichen des Datenzugriffs auf Mandantenebene

Für den Zugriff auf Aktivitätsprotokolldaten auf Mandantenebene muss einem Konto die integrierte Azure-Rolle Überwachungsleser im Stammbereich (/) zugewiesen werden. Diese Zuweisung muss von einem Benutzer durchgeführt werden, der über die globale Administratorrolle mit zusätzlichen erhöhten Zugriffsrechten verfügt.

Erhöhen der Zugriffsrechte für ein globales Administratorkonto

Zum Zuweisen einer Rolle im Stammbereich (/) benötigen Sie die globale Administratorrolle mit erhöhten Zugriffsrechten. Diese erhöhten Zugriffsrechte sollten nur dann hinzugefügt werden, wenn Sie die Rollenzuweisung vornehmen müssen, und anschließend wieder entfernt werden.

Ausführliche Anweisungen zum Hinzufügen und Entfernen der Erhöhung von Rechten finden Sie unter Erhöhen der Zugriffsrechte zum Verwalten aller Azure-Abonnements und Verwaltungsgruppen.

Nachdem Sie Ihre Zugriffsrechte erhöht haben, weist Ihr Konto die Rolle „Benutzerzugriffsadministrator“ in Azure für den Stammbereich auf. Durch diese Rollenzuweisung können Sie alle Ressourcen anzeigen und den Zugriff in jeder Abonnement- oder Verwaltungsgruppe im Verzeichnis zuweisen sowie Rollenzuweisungen im Stammbereich vornehmen.

Zuweisen der Rolle „Überwachungsleser“ im Stammbereich

Nachdem Sie die Zugriffsrechte erhöht haben, können Sie einem Konto die entsprechenden Berechtigungen zuweisen, damit es Aktivitätsprotokolldaten auf Mandantenebene abfragen kann. Diesem Konto muss die integrierte Azure-Rolle Überwachungsleser im Stammbereich Ihres Verwaltungsmandanten zugewiesen sein.

Wichtig

Das Erteilen einer Rollenzuweisung im Stammbereich bedeutet, dass die gleichen Berechtigungen für jede Ressource im Mandanten gelten. Da dies einen sehr weitgefassten Zugriff ermöglicht, empfehlen wir, diese Rolle einem Dienstprinzipalkonto zuzuweisen und dieses Konto für das Abfragen von Daten zu verwenden.

Sie können auch einzelnen Benutzern oder Benutzergruppen die Rolle „Überwachungsleser“ im Stammbereich zuweisen, damit sie die Delegierungsinformationen direkt im Azure-Portal anzeigen können. Beachten Sie, dass es sich hierbei um einen umfassenden Zugriff handelt, der auf eine möglichst geringe Anzahl von Benutzern begrenzt sein sollte.

Verwenden Sie eine der folgenden Methoden für die Stammbereichszuweisung.

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

Entfernen der erhöhten Zugriffsrechte für das globale Administratorkonto

Nachdem Sie dem gewünschten Konto die Rolle „Überwachungsleser“ im Stammbereich zugewiesen haben, müssen Sie die erhöhten Zugriffsrechte für das globale Administratorkonto entfernen, da diese Zugriffsebene nicht mehr benötigt wird.

Anzeigen von Delegierungsänderungen im Azure-Portal

Benutzer, denen die Rolle „Überwachungsleser“ im Stammbereich zugewiesen wurde, können Delegierungsänderungen direkt im Azure-Portal anzeigen.

  1. Navigieren Sie zur Seite Meine Kunden, und wählen Sie dann im linken Navigationsmenü die Option Aktivitätsprotokoll aus.
  2. Stellen Sie sicher, dass Verzeichnisaktivität im Filter am oberen Rand des Bildschirms ausgewählt ist.

Eine Liste der Delegierungsänderungen wird angezeigt. Sie können Spalten bearbeiten auswählen, um die Werte für Status, Ereigniskategorie, Zeit, Zeitstempel, Abonnement, Ereignis initiiert von, Ressourcengruppe, Ressourcentyp und Ressource ein- oder auszublenden.

Screenshot of delegation changes in the Azure portal.

Verwenden eines Dienstprinzipalkontos zum Abfragen des Aktivitätsprotokolls

Da die Rolle „Überwachungsleser“ im Stammbereich einen so weitreichenden Zugriff erlaubt, sollten Sie die Rolle einem Dienstprinzipalkonto zuweisen und Daten über dieses Konto abfragen. Verwenden Sie dazu das folgende Skript.

Wichtig

Derzeit treten bei Mandanten mit einer großen Menge an Delegierungsaktivitäten möglicherweise Fehler auf, wenn diese Daten abgefragt werden.

Wenn Sie zum Abfragen des Aktivitätsprotokolls ein Dienstprinzipalkonto verwenden, werden die folgenden bewährten Methoden empfohlen:

Nachdem Sie ein neues Dienstprinzipalkonto mit dem Zugriffsrecht der Rolle „Überwachungsleser“ im Stammbereich Ihres Verwaltungsmandanten erstellt haben, können Sie damit Delegierungsaktivitäten in Ihrem Mandanten abfragen und Berichte erstellen.

Dieses Azure PowerShell-Skript kann verwendet werden, um die Aktivitäten des vergangenen Tages abzufragen und einen Bericht über alle hinzugefügten oder entfernten Delegierungen (bzw. nicht erfolgreiche Versuche) zu erstellen. Es werden die Daten des Mandantenaktivitätsprotokolls abgefragt und dann die folgenden Werte erstellt, um über hinzugefügte oder entfernte Delegierungen zu berichten:

  • DelegatedResourceId: Die ID des delegierten Abonnements oder der delegierten Ressourcengruppe.
  • CustomerTenantId: Die ID des Kundenmandanten.
  • CustomerSubscriptionId: Die Abonnement-ID, die delegiert wurde oder die Ressourcengruppe enthält, die delegiert wurde.
  • CustomerDelegationStatus: Die Statusänderung für die delegierte Ressource (erfolgreich oder fehlerhaft).
  • EventTimeStamp: Das Datum und die Uhrzeit, zu der die Delegierungsänderung protokolliert wurde.

Beim Abfragen dieser Daten ist Folgendes zu beachten:

  • Wenn mehrere Ressourcengruppen in einer einzelnen Bereitstellung delegiert werden, werden für jede Ressourcengruppe separate Einträge zurückgegeben.
  • An einer vorherigen Delegierung vorgenommene Änderungen (z. B. Aktualisierung der Berechtigungsstruktur) werden als hinzugefügte Delegierung protokolliert.
  • Wie bereits erwähnt, muss ein Konto über die integrierte Azure-Rolle „Überwachungsleser“ im Stammbereich (/) verfügen, um auf diese Daten auf Mandantenebene zuzugreifen.
  • Sie können diese Daten in Ihren eigenen Workflows und der eigenen Berichterstellung verwenden. Beispielsweise können Sie mit der HTTP-Datensammler-API (Vorschau) Daten von einem REST-API-Client in Azure Monitor protokollieren und anschließend Aktionsgruppen verwenden, um Benachrichtigungen oder Warnungen zu erstellen.
# 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)"
}

Nächste Schritte