Microsoft Defender Antivirusイベントログをメール通知させる方法

## はじめに
<!-- 
記事の内容がひと目で分かる具体的なタイトルにしましょう。  
例：「Reactでフォームを実装する方法」や「AWS CLIを使ったS3操作入門」など 
-->
業務でMicrosoft Defender Antivirusがメール通知できるかを調査するタスクがあったため、内容を備忘録的にまとめてみました。

## 概要
<!-- 
読者がこの記事を理解・再現するために必要な前提知識や実行環境（OS、言語、ライブラリのバージョンなど）を記載します。 
例：
- Node.js v18.17.0
- npm v9.6.7
- Terraform v1.6.3
- AWS CLI v2.13.14
- macOS Ventura 13.5.2
-->
Microsoft Defender Antivirusとは、Windows OSに標準搭載されているウイルス・マルウェア対策ソフトウェアです。
リアルタイムで脅威を検出し、ウイルスやスパイウェアなどからシステムを保護する機能を備えています。
今回、Microsoft Defender Antivirusを利用してウイルス検知時にアラートを受信する仕組みを検討しましたが、標準機能だけでは直接メール通知を行う方法が存在しないことが分かりました。
そのため、AWSのCloudWatchとSNS（Simple Notification Service）を活用して、Microsoft Defender Antivirusが出力するイベントログをもとにメール通知する方法について調査・整理を行いました。

## 実施手順
<!--
実施した作業や試した内容の概要をリスト形式などでまとめます。  
その下の各「実施内容」で詳細に説明します。
-->
#### 1.EC2インスタンスを起動する
適当なEC2(WindowsServer)を起動します。
`test`という名前でEC2を作成しました。
AMIはWindowsなら何でもいいのですが、業務で使用するWindows Server 2019を選択します。

#### 2.IAMロール作成
CloudWatchのロググループへの書き込み権限を付与したIAMロールを作成します。
`CloudWatchLogsFullAccess`のポリシーを付与したIAMロールを作成し、EC2にアタッチします。
これをやらないとMicrosoft Defender Antivirusイベントログがロググループに書き込まれません。

#### 3.ロググループ作成
事前にロググループを作成しておきます。
名前は適当に`test-loggroup`としておきます。
後でMicrosoft Defender Antivirusのイベントログがこのロググループに書き込まれるようにします。

#### 4.CloudWatch Agentをインストール
EC2にリモートデスクトップ接続します。
Windows PowerShellを起動後、以下のコマンドを実行し、CloudWatch Agentのインストールを行います。
※インターネット接続できるようにしておかないとコマンドを使用できないため注意
```
Invoke-WebRequest -Uri "https://amazoncloudwatch-agent.s3.amazonaws.com/windows/amd64/latest/amazon-cloudwatch-agent.msi" -OutFile "amazon-cloudwatch-agent.msi"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929650/3ec3519d-389d-4743-a581-7117bd66a0e7.png)

パッケージがあるディレクトリに移動し、以下のコマンドを実行します。
```
msiexec /i amazon-cloudwatch-agent.msi
```
インストールに成功するとAmazonCloudWatchAgentのフォルダが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929650/ea837d75-cd68-4993-a30f-5f605bbb38fc.png)

amazon-cloudwatch-agent.jsonをAmazonCloudWatchAgentフォルダ内に作成します。
"log_group_name"に事前作成したロググループ`test-loggroup`を記述
"log_stream_name"にWindows ServerのインスタンスIDを記述
```json:amazon-cloudwatch-agent.json
{
  "logs": {
    "logs_collected": {
      "windows_events": {
        "collect_list": [
          {
            "event_name": "Microsoft-Windows-Windows Defender/Operational",
            "event_levels": ["ERROR", "WARNING", "INFORMATION"],
            "log_group_name": "test-loggroup",
            "log_stream_name": "{instance_id}"
          }
        ]
      }
    }
  }
}

```
amazon-cloudwatch-agent.jsonを作成したらAmazonCloudWatchAgentフォルダに移動します。
```
cd "C:\Program Files\Amazon\AmazonCloudWatchAgent"
```
以下のコマンドを実行し、設定を反映させます。
```
.\amazon-cloudwatch-agent-ctl.ps1 -a fetch-config -m ec2 -c file:"amazon-cloudwatch-agent.json" -s
```
CloudWatch Agentが起動しているか確認し、Runningになっていれば起動しています。
```
Get-Service AmazonCloudWatchAgent
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929650/d48bebd2-d1ee-4797-a58c-dabf79d321db.png)

#### 5.Microsoft Defender Antivirusイベントログがロググループに書き込まれるか確認します。
EICARテストファイルというものを作成し、意図的にMicrosoft Defender Antivirusのイベントを発生させます。
メモ帳を開き以下の文字列を`eicar.txt`というテキスト名でデスクトップに保存します
```
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
```

メモ帳保存後にMicrosoft Defender Antivirusのイベントが発生し、test-loggroupにログが書き込まれれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929650/1cd62cb5-b94b-4f2b-b236-787ec30fbf61.png)

#### 6.メトリクスフィルター作成
ロググループでメトリクスフィルターを作成します。
マルウェア検知の場合のメトリクスを取得したいので、ログ内の`Microsoft Defender Antivirus has detected malware`をフィルターパターンとします。
フィルターパターンとメトリクス値以外は適当で大丈夫です。

フィルター名：`test-filter`
フィルターパターン：`Microsoft Defender Antivirus has detected malware`
メトリクス名前空間：`Custom/Defender`
メトリクス名：`Malware`
メトリクス値：`1`

これでマルウェア検知イベントのメトリクスを取得することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929650/bf2f8fe3-c964-41bc-8e16-f75c7446781e.png)

#### 7.SNS作成
SNSトピックとサブスクリプションを作成し、CloudWatch Alarmに設定します。
※サブスクリプションを作成するとAWSから認証メールが届くため、メール内のリンクを踏んで事前に認証しておきます。

#### 8.CloudWatch Alarm作成
CloudWatch Alarmを作成します。
メトリクスフィルター作成後、もう一度Microsoft Defender Antivirusイベントを発生させると以下画像のように名前空間が作成されその中にメトリクスが作成されるのでこれを利用してアラームを作成します。
SNSトピックに先ほど作成したものを設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929650/f2729078-7b29-4247-a84e-b833e45cb26d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929650/069280a4-10a0-43e3-816e-f46308ada7d6.png)

## 結果
<!-- 
実施の結果、どうなったかを書きます。  
うまくいった／いかなかった理由や、得られた知見があれば記載すると読み応えが出ます。 
-->
アラームが発報された場合にSNS通知がされるか確認します。
もう一度Microsoft Defender Antivirusイベントを発生させて、設定したアドレスにメールが通知されたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929650/d9f55bc7-d5cc-4acf-a640-dc3f5ba4bec6.png)


## まとめ
<!--
記事全体の要点を振り返ります。  
読者に伝えたいこと、今後の課題、学びなどを簡潔にまとめましょう。 
-->
Microsoft Defender Antivirusのメール通知方法に関しては他にも色々な方法があるみたいですが、今回はAWSを使用したメール通知についてまとめました。
今回の例だとCloudWatchでMicrosoft Defender Antivirusイベントログを取得できる点がメリットだと思いました。

## 参考
https://dev.classmethod.jp/articles/microsoft-defender-event-notify/

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html

https://subro.mokuren.ne.jp/1100.html