委任されたサブスクリプションに Azure Policy を大規模にデプロイする

サービス プロバイダーは、Azure Lighthouse に複数の顧客テナントをオンボードしている場合があります。 Azure Lighthouse を使用すると、サービス プロバイダーは一度に複数のテナントにわたって大規模に操作を実行できるため、管理タスクがより効率的になります。

このトピックでは、PowerShell コマンドを介して Azure Policy を使用し、複数のテナントにわたってポリシー定義とポリシー割り当てをデプロイする方法について説明します。 この例では、ポリシー定義によって HTTPS トラフィックのみを許可することで、ストレージ アカウントが確実に保護されるようにしています。

ヒント

このトピックではサービス プロバイダーと顧客の場合について説明していますが、複数のテナントを管理するエンタープライズも同じプロセスを使用できます。

Azure Resource Graph を使用して複数の顧客テナントにわたるクエリを実行する

Azure Resource Graph を使用して、管理対象の顧客テナントに含まれるすべてのサブスクリプションにわたってクエリを実行できます。 この例では、現在 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

複数の顧客テナントにわたってポリシーをデプロイする

下の例は、Azure Resource Manager テンプレートを使用して、複数の顧客テナントの委任されたサブスクリプションにわたってポリシー定義とポリシー割り当てをデプロイする方法を示しています。 このポリシー定義は、HTTPS トラフィックを使用するようすべてのストレージ アカウントに要求します。 こうすると、準拠していない新しいストレージ アカウントは作成されません。 この設定のない既存のストレージ アカウントは、非準拠として示されます。

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
}

注意

複数のテナントにポリシーをデプロイすることはできますが、現時点では、これらのテナント内の非準拠リソースに関するコンプライアンスの詳細を表示することはできません。

ポリシーのデプロイを検証する

Azure Resource Manager テンプレートをデプロイしたら、委任されたサブスクリプションのいずれかで EnableHttpsTrafficOnlyfalse に設定してストレージ アカウントの作成を試みて、ポリシー定義が正しく適用されたことを確認します。 ポリシーの割り当てにより、このストレージ アカウントの作成はできないはずです。

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

リソースをクリーンアップする

終了したら、このデプロイによって作成されたポリシー定義と割り当てを削除します。

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

次のステップ