Microsoft Defender の推奨事項をカスタマイズする

# はじめに
[前回の記事](https://qiita.com/hiroakimurata/items/eeea86517c527df7d07a) で、Defender for App Service が気軽に試せることを紹介しました。
Defender が自動でチェックしてくれる既定の推奨事項の１つに、カスタマイズした方が良い項目がありましたので、本記事では、その項目を例にして、Microsoft Defender の推奨事項をカスタマイズする方法をお伝えします。

推奨項目をカスタマイズする理由は、大きく分けると下記２つになります。
１．既定の推奨事項に手入れして、チェックリストを適正化したい
２．新規の推奨事項を作成して、個別のセキュリティ要件をチェックリストへ追加したい

本記事では、１番目の理由にあるチェックリストの適正化を行う手順を紹介します。ただし、２番目の理由の場合に対しても、管理ポータル上の操作や API の利用において共通する手順があるため、参考にしていただくことが出来ます。
（API の実行手順については、公開ドキュメントを読み解く必要があり、 @murasamelabo に手伝ってもらい確立できました！）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879870/a764b879-0a5f-1465-0f8c-34c850f11f69.png)

# 既定の推奨事項を適正化する
「PHP を使用する App Service アプリでは、最新の 'PHP バージョン' を使用する必要があります」という項目の規定値にある PHP のマイナーバージョンを **8.0** から **8.1** へ適正化します。
既定の推奨事項は、定義の編集ができない（グレイアウトしている）ため、**定義を複製する**を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879870/6bb103c5-6b19-b3fb-7ef4-cf6c113fe584.png)

定義を複製するを選択すると、管理ポータル上の画面操作のみで簡単にカスタムポリシーを作成し、 PHP のマイナーバージョンを **8.0** から **8.1** へ適正化することができました。**割り当て**を忘れずに行うとよいでしょう。割り当てについては、リソースグループ単位、サブスクリプション単位、管理グループ単位で設定可能です。
また、この記事の操作のようにポリシーを個別に割り当てる方法以外に、イニチシアティブを定義して複数のポリシーをまとめて割り当てることも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879870/5cd7508d-77a1-c8d0-6015-d469012e452d.png)

https://learn.microsoft.com/ja-jp/training/modules/build-cloud-governance-strategy-azure/6-control-audit-resources-azure-policy


既定の推奨事項をベースにしたカスタムポリシーの作成、割り当てを行った後、しばらく時間を置くと（この検証では８時間ほど置きました）、Defender の推奨事項にカスタムポリシーが表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879870/4140fd44-1245-7ee6-b447-44dffcd68787.png)

ここから少し注意点を書いていきます。まず、新しく追加された推奨事項の重要度が「**低**」になっていることに気付きました。管理ポータル上で編集してみようと試みましたが、設定項目が見当たりません。調べてみると、現状(2022年12月時点)の仕様では、重要度の変更は Rest API を使用する必要があるようです。

https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/custom-security-policies?pivots=azure-portal#enhance-your-custom-recommendations-with-detailed-information

# Rest API を用いて推奨事項の重要度を変更する
Rest API のサンプルリクエストは公開文書に記載があります。この記事を参考に、具体的な HTTP リクエストの内容を本記事で書き記しておきます。最初に必要となる持ち物は、API の実行環境とサブスクリプション ID のみです。本検証における API の実行は Postman から行いました。

https://learn.microsoft.com/ja-jp/rest/api/defenderforcloud/assessments-metadata/create-in-subscription?tabs=HTTP#examples

最初に、Azure のサブスクリプションIDをパラメータに指定して、メタデータを GETします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879870/73b84a82-ce9e-84a3-0ee0-04026340d9d3.png)

```:GET
https://management.azure.com/subscriptions/5555428a-ffff-4567-bbbb-0a725ccccccc/providers/Microsoft.Security/assessmentMetadata?api-version=2020-01-01
```

レスポンスの中から、作成したカスタムポリシーに該当するものを JSON で抽出します。この JSON の内容をほぼ流用して、カスタムポリシーの重要度を変更していきます。

```JSON
{
   "id": "/subscriptions/5555428a-ffff-4567-bbbb-0a725ccccccc/providers/Microsoft.Security/assessmentMetadata/9999b98a-2222-hoge-hoge-492563b64xxx",
   "name": "9999b98a-2222-hoge-hoge-492563b64xxx",
   "type": "Microsoft.Security/assessmentMetadata",
   "properties": {
      "displayName": "PHP を使用する App Service アプリでは、最新の 'PHP バージョン 8.1' を使用する必要があります",
       "assessmentType": "CustomPolicy",
       "policyDefinitionId": "/subscriptions/5555428a-ffff-4567-bbbb-0a725ccccccc/providers/Microsoft.Authorization/policyDefinitions/037df79d-b89a-492f-94cd-214749877353",
       "description": "セキュリティ上の欠陥のため、または追加機能を組み込むために、PHP ソフトウェアの新しいバージョンが定期的にリリースされます。最新バージョンのセキュリティ修正プログラム (存在する場合) や新機能を利用するために、App Service アプリに対して最新の PHP バージョンを使用することをお勧めします。現在、このポリシーは Linux アプリにのみ適用されます。",
       "remediationDescription": "",
       "categories": [
           "Unknown"
       ],
       "severity": "Low"
    }
} 
```

上記 JSON パラメータの **id** のパラメータを HTTP リクエストへ追加して PUT で送信するための URL を作成しておきます。

```:PUT
https://management.azure.com/subscriptions/5555428a-ffff-4567-bbbb-0a725ccccccc/providers/Microsoft.Security/assessmentMetadata/9999b98a-2222-hoge-hoge-492563b64xxx?api-version=2020-01-01
```

HTTP リクエストの Body に上記の JSON をコピーして、**severity** を **Low** から **Medium** へ、そして **assessmentType** を **CostomPolicy** から **CustomerManaged** へ変更して、リクエストを送信します（変更しないとエラーになりました）。

```JSON
{
    "id": "/subscriptions/5555428a-ffff-4567-bbbb-0a725ccccccc/providers/Microsoft.Security/assessmentMetadata/9999b98a-2222-hoge-hoge-492563b64xxx",
    "name": "9999b98a-2222-hoge-hoge-492563b64xxx",
    "type": "Microsoft.Security/assessmentMetadata",
    "properties": {
        "displayName": "PHP を使用する App Service アプリでは、最新の 'PHP バージョン 8.1' を使用する必要があります",
        "assessmentType": "CustomerManaged",
        "policyDefinitionId": "/subscriptions/5555428a-ffff-4567-bbbb-0a725ccccccc/providers/Microsoft.Authorization/policyDefinitions/037df79d-b89a-492f-94cd-214749877353",
        "description": "セキュリティ上の欠陥のため、または追加機能を組み込むために、PHP ソフトウェアの新しいバージョンが定期的にリリースされます。最新バージョンのセキュリティ修正プログラム (存在する場合) や新機能を利用するために、App Service アプリに対して最新の PHP バージョンを使用することをお勧めします。現在、このポリシーは Linux アプリにのみ適用されます。",
        "remediationDescription": "",
        "categories": [
            "Unknown"
        ],
        "severity": "Medium"
    }
}
```

上記 Rest API による一連の HTTP リクエストの送信が完了すると、カスタムポリシーによる推奨事項の重要度を複製（コピー）元の推奨事項と揃えることが出来ました。
最後に、チェックが不要となった既定の推奨事項を適用除外します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879870/5a518aaa-fd58-40a0-60dc-e2f49ee2a5f6.png)

# 既定の推奨事項を適用除外する
適用除外は Azure 管理ポータルから行えます。適用除外をする対象は割り当てと同様に、管理グループ、サブスクリプション、リソースグループの単位で行うことが出来ます。適用除外のカテゴリ指定およびコメントを必ず残す必要があるため、組織内の担当者が変わった場合でも後から理由を確認することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879870/9f1384b8-6a02-3d8b-d18d-ee53078e95ff.png)

ここまでのステップを通して、既定の推奨項目を変更して、チェックリストを適正化することが出来ました。推奨事項のダッシュボード表示は下記のようになります。（適用除外の項目はステータスが **該当なし-権利放棄により除外** へ変更される）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879870/27c146bf-97d1-d186-944f-fef8606b6832.png)

# 最後に
本記事では Microsoft Defender を利用している、あるいはこれから利用を検討している方向けに、下記のことを提示しました。
* Defender for App Serviceを例にした、推奨事項をカスタマイズする方法
* 既定の推奨項目を変更して、チェックリストを適正化する方法
* Rest API を用いた、推奨事項の重要度を変更する方法

最後まで読んでいただきありがとうございました。