Azure PolicyでDefender for Cloudの推奨事項の通知を強制する

シングルテナントで複数のAzureサブスクリプションを管理していて、Defender for Cloudのセキュリティ推奨事項を通知したい場合、各サブスクリプションに「ワークフローの自動化」と通知用のLogicAppを作成するのが面倒なのでPolicyで強制した手順をまとめる。

### 前提
今回検証するサブスクリプション群は以下のような構成になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/95b53fc5-65da-b9a7-d5c6-b49aaf70c471.png)

### 通知用のLogicAppを作成する
まずは通知用のLogicAppを作成するのですが、中身については今回省略します。
通知先はメールやSlackなどお好みですが、重要なのはトリガーです。

トリガーの検索で「Security Center」と検索すると候補が出てくるので、「Azure Security Center のレコメンデーションが作成またはトリガーされたとき」を選択します。
※Azure Security CenterはDefender for Cloudの旧名です
※アラート、推奨事項、コンプライアンス評価でトリガーが分かれているので通知したいトリガーを選んでOKですが、今回は「推奨事項」の前提で進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/4ca9791d-2868-472b-cad3-7ea626ed5dde.png)

接続情報は自動で作成されるので、あとは後続処理を実装（割愛）

### ポリシーの定義を作成する
ポリシーの定義は管理グループの「検証グループ」に作成し、割り当てます。
スコープが「検証グループ」になっていることを確認して、「Azure Security Center 推奨事項に対してワークフローの自動化をデプロイする」を検索し、複製します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/9a373295-b19f-7fad-8151-66e419592f2e.png)

ベースとなるこのポリシーはDefender for Cloudのワークフローが配下のリソースに対して設定されているかをチェックし、なければ設定までしてくれる内容になっています。

定義の場所は「検証グループ」を選択して、名前は自由に付けます。
その後、実際のポリシーを修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/11f8cafa-94a8-e754-a385-3d890eb12192.png)

ポリシー修正箇所は以下です。
- parametersセクションのlogicAppTrigger（381行目付近）に「Azure_Security_Center_のレコメンデーションが作成またはトリガーされたとき」を追加（ManualはLogicApp側でRegacyになっていたので使わない）
```json
"logicAppTrigger": {
        "type": "String",
        "metadata": {
          "displayName": "ロジック アプリ トリガー",
          "description": "トリガーされるロジック アプリのトリガー コネクタ。使用可能な値: '手動 (着信 HTTP 要求)'、'Azure Security Center 推奨事項が作成またはトリガーされたとき'。"
        },
        "allowedValues": [
          "Manual (Incoming HTTP request)",
          "When an Azure Security Center Recommendation is created or triggered",
          "Azure_Security_Center_のレコメンデーションが作成またはトリガーされたとき"
        ]
      }
```
- 162行目triggerMapにも「Azure_Security_Center_のレコメンデーションが作成またはトリガーされたとき」を追加
```json
"triggerMap": {
        "Manual (Incoming HTTP request)": "manual",
        "When an Azure Security Center Recommendation is created or triggered": "When_an_Azure_Security_Center_Recommendation_is_created_or_triggered",
        "Azure_Security_Center_のレコメンデーションが作成またはトリガーされたとき": "Azure_Security_Center_のレコメンデーションが作成またはトリガーされたとき"
}
```

これで保存します。

### Policyの割り当て
Policyの定義ができたので管理グループに割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/c1faf7da-9e32-3788-0ec6-c4a311a64eab.png)

パラメーターは以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/f47853e9-dc76-5a05-4992-532372d33855.png)
「入力またはレビューが必要なパラメーターのみを表示する」のチェックを外すことですべてのパラメーターが確認できます。
特に推奨事項の状態はデフォルトだと全て通知対象なので絞ったほうが良いでしょう。

ロジックアプリトリガーは先程追加した「Azure_Security_Center_のレコメンデーションが作成またはトリガーされたとき」を選択しましょう。

これで作成するとポリシーが適用されます。

### 結果の確認
管理グループのポリシーからポリシーの準拠状況を確認できます。
まだ「未開始」となっており、少し時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/745ec374-86f3-28ce-8ff8-faa249e158f1.png)

配下のサブスクリプションは何も設定していないため、しばらくすると「準拠していない」と判断されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/d2f44716-4120-a889-30a6-08068db4b703.png)

ポリシーの仕様として準拠していないリソースを自動作成するのは配下に新しいリソースができた場合になります。
現在「管理グループ」配下には既存のサブスクリプションが2つ存在しますが、これら準拠するように李リソースを作成するには「修正タスク」を作成する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/1c290933-fe3b-b953-d043-3eceb150da1d.png)

修復を行うことでDefender for Cloudにワークフローが追加されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/f5cac40e-d1f0-9965-feee-d33d3f7f34c1.png)

デプロイのログは各サブスクリプションの「デプロイ」から参照できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/32878ccc-6ae3-7615-19bc-6aad38531bd7.png)

### 新しいサブスクリプションを管理グループに追加する
検証グループにサブスクリプションを追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/29144a2d-939b-8f25-98c3-7800fbc6bc90.png)

こちらもしばらくすると準拠していないと判断されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/28dc4697-d222-a552-2cb9-04201c8f15c2.png)

ただしこのパターンは配下に新しいリソースができた場合に当てはまりますので修復タスクが自動で実行され、ワークフローが自動で作成されます。
これで新規のサブスクリプションが作成された場合でも自動で必要なリソースを作成してるようになりました。

以上、参考になれば幸いです。