Defender for Servers でリソース単位でプランを分けるには？ (P2 混在編) (2024年6月時点)

# 本記事について

Azure のセキュリティサービスである Microsoft Defender for Cloud は基本的にはサブスクリプション単位で有効化・無効化や、プランを構成します。ただ、場合によってはリソース単位で有効化したり、プランを分割したりしたいこともあるかと思います。

Defender for Servers については、それを Rest API を使って行うことができます。特に、限定的に P1 を有効化したい場合は、下記記事で詳細に解説されています。

https://qiita.com/hisnakad/items/a9244f48cb580140ea5a

https://zenn.dev/microsoft/articles/7bfee6a78d1d64

ただ、Defender for Servers P2 を利用したい場合は、2024年6月現在、サブスクリプションレベルで P2 を有効化したのち、各リソースで P1 または Free へ変更することが必要です。(つまり、リソース単位で、P2 を有効にするということはできません。)

なので、ひとつのサブスクリプション内で、Free, P1, P2 を混在させたい場合は、下記図のような形で構成することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/81c1b0c8-3a4b-6caf-d626-4ab5399cec39.png)

本記事では、その Rest API での操作や作業結果を見ていきます。

# Rest API での操作

下記のような Rest API による操作が必要になります。

## 特定リソースでの P1 や Free への変更

P1 や Free に特定の仮想マシンの Defender 設定を変更するには、下記の Rest のメソッドを使います。

https://learn.microsoft.com/en-us/rest/api/defenderforcloud/pricings/update?view=rest-defenderforcloud-2024-01-01&tabs=HTTP

```http
PUT https://management.azure.com/subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>/providers/Microsoft.Compute/virtualMachines/<仮想マシン名>/providers/Microsoft.Security/pricings/VirtualMachines?api-version=2024-01-01
```

Body にはそれぞれ下記の JSON を使います。

**P1 への変更**

```json
{
  "properties": {
    "pricingTier": "Standard",
    "subPlan": "P1"
  }
}
```

**Free への変更**

```json
{
  "properties": {
    "pricingTier": "Free"
  }
}
```

Postman で実行すると、下記のようにレスポンスが返ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/62060a59-79f0-72b1-e006-7fd644bda237.png)


## リソース単位での構成値の確認

リソース単位での構成値は Rest API や Resource Graph にて確認ができます。

**Rest API**

https://learn.microsoft.com/en-us/rest/api/defenderforcloud/pricings/get?view=rest-defenderforcloud-2024-01-01&tabs=HTTP

```
GET https://management.azure.com/subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>/providers/Microsoft.Compute/virtualMachines/<仮想マシン名>/providers/Microsoft.Security/pricings/VirtualMachines?api-version=2024-01-01
```

実行結果例はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/3ddaeefb-cb37-29de-8abc-a438ef0acba7.png)

**Resource Graph**

Resource Graph のクエリでも確認ができます。

```
securityresources
| where type =~ "microsoft.security/pricings"
| where name == "VirtualMachines"
| extend pricingTier = properties.pricingTier
| extend subPlan = properties.subPlan
| extend isInherited = iff(isempty(properties.inherited), True, properties.inherited)
| project id, subscriptionId, resourceGroup, pricingTier, subPlan, isInherited
```

上記クエリを混在のサブスクリプションで実行してみると下記のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/377b0dc6-ca9b-1783-3343-7cd8c3f6098c.png)


## サブスクリプションからの継承に戻す

継承された値に戻すには、DELETE メソッドを使います。

https://learn.microsoft.com/en-us/rest/api/defenderforcloud/pricings/delete?view=rest-defenderforcloud-2024-01-01&tabs=HTTP

```
DELETE https://management.azure.com/subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>/providers/Microsoft.Compute/virtualMachines/<仮想マシン名>/providers/Microsoft.Security/pricings/VirtualMachines?api-version=2024-01-01
```

# 最後に

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。