Defender CSPM を複数のサブスクリプション一括で OFF にする

2023/04/21に公開

はじめに

Defender for Cloud の新しい機能で、Defender CSPM という機能が一般提供開始しました。
https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/concept-cloud-security-posture-management

こちら、一般提供開始に伴い、2023/5/1 から課金が始まるのですが、プレビュー期間に無償だったため有効にしている場合、自動では無効にならないため、課金をさせないためには自身で無効化する必要があります。大量にサブスクリプションがある場合、Azure ポータルからまとめて OFF にする方法がないため、PowerShellコマンド、API 操作、Azure ポリシーで一括で OFF にする方法を調べました。

PowerShell コマンド

これが一番シンプルです。サブスクリプション指定のところでループさせてください。

# ログイン
Connect-AzAccount

# サブスクリプション指定
$subscriptionId = "subscriptionId"
Set-AzContext -Subscription $subscriptionId

# 設定値確認
Get-AzSecurityPricing -Name "CloudPosture"

# 無効化
Set-AzSecurityPricing -Name "CloudPosture" -PricingTier "Free"

https://learn.microsoft.com/ja-jp/powershell/module/az.security/set-azsecuritypricing?view=azps-9.6.0

API

直接叩くのは手間なので、Azure PowerShell の Invoke-AzRestMethod を使います。こちらもサブスクリプション指定のところでループさせてください。

# ログイン
Connect-AzAccount

# サブスクリプション指定
$subscriptionId = "subscriptionId"

# 設定値確認
Invoke-AzRestMethod -Path "/subscriptions/$subscriptionId/providers/Microsoft.Security/pricings/CloudPosture?api-version=2023-01-01" -Method GET

# 無効化
$params = @'
{
  "properties": {
    "pricingTier": "Free"
  }
}
'@

Invoke-AzRestMethod -Path "/subscriptions/$subscriptionId/providers/Microsoft.Security/pricings/CloudPosture?api-version=2023-01-01" -Method PUT -payload $params

https://learn.microsoft.com/ja-jp/rest/api/defenderforcloud/pricings/update?tabs=HTTP

Azure ポリシー

ビルドインポリシーで「Microsoft Defender CSPM を有効にするように構成する」というのが準備されていたので、これを無効化用に Standard のところを Free に変更したカスタムポリシーを作ります。

参考にしたビルドイン ポリシー
https://github.com/Azure/azure-policy/blob/master/built-in-policies/policyDefinitions/Security Center/ASC_Azure_Defender_CSPM_Deploy.json


無効化するためのカスタムポリシー定義

{
  "mode": "All",
  "policyRule": {
    "if": {
      "field": "type",
      "equals": "Microsoft.Resources/subscriptions"
    },
    "then": {
      "effect": "[parameters('effect')]",
      "details": {
        "type": "Microsoft.Security/pricings",
        "name": "CloudPosture",
        "deploymentScope": "subscription",
        "existenceScope": "subscription",
        "roleDefinitionIds": [
          "/providers/Microsoft.Authorization/roleDefinitions/fb1c8493-542b-48eb-b624-b4c8fea62acd"
        ],
        "existenceCondition": {
          "field": "Microsoft.Security/pricings/pricingTier",
          "equals": "Free"
        },
        "deployment": {
          "location": "japaneast",
          "properties": {
            "mode": "incremental",
            "parameters": {},
            "template": {
              "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
              "contentVersion": "1.0.0.0",
              "parameters": {},
              "variables": {},
              "resources": [
                {
                  "type": "Microsoft.Security/pricings",
                  "apiVersion": "2018-06-01",
                  "name": "CloudPosture",
                  "properties": {
                    "pricingTier": "Free"
                  }
                }
              ],
              "outputs": {}
            }
          }
        }
      }
    }
  },
  "parameters": {
    "effect": {
      "type": "String",
      "metadata": {
        "displayName": "効果",
        "description": "ポリシーの実行を有効または無効にします"
      },
      "allowedValues": [
        "DeployIfNotExists",
        "Disabled"
      ],
      "defaultValue": "DeployIfNotExists"
    }
  }
}

こちらの定義を管理グループなどの定義の場所に指定し割り当てます。割り当てる際に修復タスクを作成すると、既存サブスクリプションに対して無効化の処理ができます。

Microsoft (有志)

Discussion