Bereitstellen von Azure Policy für delegierte Abonnements in großem Umfang

Als Dienstanbieter haben Sie möglicherweise mehrere Kundenmandanten in Azure Lighthouse integriert. Azure Lighthouse ermöglicht Dienstanbietern das gleichzeitige Ausführen von skalierbaren Vorgängen für mehrere Mandanten, wodurch Verwaltungsaufgaben effizienter werden.

In diesem Thema erfahren Sie, wie Sie mithilfe von Azure Policy eine Richtliniendefinition und eine Richtlinienzuweisung für mehrere Mandanten unter Verwendung von PowerShell-Befehlen bereitstellen. In diesem Beispiel stellt die Richtliniendefinition sicher, dass Speicherkonten geschützt werden, indem nur HTTPS-Datenverkehr zugelassen wird.

Tipp

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

Verwenden von Azure Resource Graph zum Abfragen von Kundenmandanten

Sie können Azure Resource Graph verwenden, um alle Abonnements in den von Ihnen verwalteten Kunden-Tenants abzufragen. In diesem Beispiel werden alle Speicherkonten in diesen Abonnements identifiziert, für die derzeit kein HTTPS-Datenverkehr erforderlich ist.

$MspTenant = "insert your managing tenantId here"

$subs = Get-AzSubscription

$ManagedSubscriptions = Search-AzGraph -Query "ResourceContainers | where type == 'microsoft.resources/subscriptions' | where tenantId != '$($mspTenant)' | project name, subscriptionId, tenantId" -subscription $subs.subscriptionId

Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Storage/storageAccounts' | project name, location, subscriptionId, tenantId, properties.supportsHttpsTrafficOnly" -subscription $ManagedSubscriptions.subscriptionId | convertto-json

Bereitstellen einer Richtlinie für mehrere Kundenmandanten

Im folgenden Beispiel wird veranschaulicht, wie Sie eine Azure Resource Manager-Vorlage verwenden, um eine Richtliniendefinition und eine Richtlinienzuweisung für delegierte Abonnements in mehreren Kundenmandanten bereitzustellen. Diese Richtliniendefinition erfordert, dass alle Speicherkonten HTTP-Datenverkehr verwenden. Sie verhindert die Erstellung neuer Speicherkonten, die nicht den Anforderungen entsprechen. Alle vorhandenen Speicherkonten ohne die Einstellung werden als nicht konform markiert.

Write-Output "In total, there are $($ManagedSubscriptions.Count) delegated customer subscriptions to be managed"

foreach ($ManagedSub in $ManagedSubscriptions)
{
    Select-AzSubscription -SubscriptionId $ManagedSub.subscriptionId

    New-AzSubscriptionDeployment -Name mgmt `
                     -Location eastus `
                     -TemplateUri "https://raw.githubusercontent.com/Azure/Azure-Lighthouse-samples/master/templates/policy-enforce-https-storage/enforceHttpsStorage.json" `
                     -AsJob
}

Hinweis

Sie können zwar Richtlinien mandantenübergreifend bereitstellen, aber für nicht konforme Ressourcen in diesen Mandanten keine Konformitätsdetails anzeigen.

Überprüfen der Richtlinienbereitstellung

Überprüfen Sie nach dem Bereitstellen der Azure Resource Manager-Vorlage, ob die Richtliniendefinition erfolgreich angewendet wurde, indem Sie versuchen, ein Speicherkonto zu erstellen, wobei EnableHttpsTrafficOnly in einem ihrer Delegiertenabonnements auf false festgelegt ist. Aufgrund der Richtlinienzuweisung sollte es nicht möglich sein, dieses Speicherkonto zu erstellen.

New-AzStorageAccount -ResourceGroupName (New-AzResourceGroup -name policy-test -Location eastus -Force).ResourceGroupName `
                     -Name (get-random) `
                     -Location eastus `
                     -EnableHttpsTrafficOnly $false `
                     -SkuName Standard_LRS `
                     -Verbose                  

Bereinigen von Ressourcen

Wenn Sie fertig sind, entfernen Sie die Richtliniendefinition und die von der Bereitstellung erstellte Zuweisung.

foreach ($ManagedSub in $ManagedSubscriptions)
{
    select-azsubscription -subscriptionId $ManagedSub.subscriptionId

    Remove-AzSubscriptionDeployment -Name mgmt -AsJob

    $Assignment = Get-AzPolicyAssignment | where-object {$_.Name -like "enforce-https-storage-assignment"}

    if ([string]::IsNullOrEmpty($Assignment))
    {
        Write-Output "Nothing to clean up - we're done"
    }
    else
    {

    Remove-AzPolicyAssignment -Name 'enforce-https-storage-assignment' -Scope "/subscriptions/$($ManagedSub.subscriptionId)" -Verbose

    Write-Output "Deployment has been deleted - we're done"
    }
}

Nächste Schritte