Wdrażanie Azure Policy do delegowanych subskrypcji na dużą skalę

Jako dostawca usług możesz dołączyć wiele dzierżaw klientów do usługi Azure Lighthouse. Usługa Azure Lighthouse umożliwia dostawcom usług wykonywanie operacji na dużą skalę w wielu dzierżawach jednocześnie, dzięki czemu zadania zarządzania są wydajniejsze.

W tym temacie wyjaśniono, jak za pomocą Azure Policy wdrożyć definicję zasad i przypisanie zasad w wielu dzierżawach przy użyciu poleceń programu PowerShell. W tym przykładzie definicja zasad gwarantuje, że konta magazynu są zabezpieczone, zezwalając tylko na ruch HTTPS.

Porada

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

Wykonywanie zapytań dotyczących dzierżaw klientów przy użyciu usługi Azure Resource Graph

Usługa Azure Resource Graph umożliwia wykonywanie zapytań dotyczących wszystkich subskrypcji w dzierżawach klientów, którymi zarządzasz. W tym przykładzie zidentyfikujemy wszystkie konta magazynu w tych subskrypcjach, które nie wymagają obecnie ruchu HTTPS.

$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

Wdrażanie zasad w wielu dzierżawach klientów

W poniższym przykładzie pokazano, jak za pomocą szablonu usługi Azure Resource Manager wdrożyć definicję zasad i przypisanie zasad w ramach delegowanych subskrypcji w wielu dzierżawach klientów. Ta definicja zasad wymaga, aby wszystkie konta magazynu używały ruchu HTTPS. Zapobiega to tworzeniu nowych kont magazynu, które nie są zgodne. Wszystkie istniejące konta magazynu bez ustawienia są oznaczone jako niezgodne.

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
}

Uwaga

Zasady można wdrażać w wielu dzierżawach, ale obecnie nie można wyświetlić szczegółów zgodności dla niezgodnych zasobów w tych dzierżawach.

Weryfikowanie wdrożenia zasad

Po wdrożeniu szablonu usługi Azure Resource Manager upewnij się, że definicja zasad została pomyślnie zastosowana, próbując utworzyć konto magazynu z ustawieniem EnableHttpsTrafficOnly na wartość false w jednej z delegowanych subskrypcji. Ze względu na przypisanie zasad nie można utworzyć tego konta magazynu.

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

Czyszczenie zasobów

Po zakończeniu usuń definicję zasad i przypisanie zasad utworzone przez wdrożenie.

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

Następne kroki