AWS CloudTrailとメトリクスフィルタでセキュリティ監視をしている人に向けたTips

<h2>はじめに</h2>

こんにちは、クマ松です。

不正なログインや異常なアクティビティを即座に検知することは、AWSアカウントのセキュリティを確保するためには重要ですよね。

<font color="deeppink">AWS CloudTrail</font>と<font color="deeppink">Amazon CloudWatch Logs</font>、そして<font color="deeppink">Amazon SNS</font>を組み合わせて、不正なAPIコールを監視している人も居るのではないでしょうか。今回はこの構成の注意点と、代替案をご紹介します。

<h2>結論</h2>

- <font color="deeppink">AWS CloudTrail</font>の操作ログが<font color="deeppink">Amazon CloudWatch Logs</font>に出力されるまでに**15分かかることがある**ため、**迅速に**何らかの異常操作を検知したい場合には不向きな構成
- 不正な操作を迅速に検知したい場合は<font color="deeppink">Amazon EventBridge</font>または<font color="red">Amazon GuardDuty</font>を利用するのがおススメ

<h2>AWS CloudTrailとAmazon CloudWatch Logsを組み合わせた監視の仕組み</h2>
<h3>AWS CloudTrail→Amazon CloudWatch Logsへのログ配信</h3>
<font color="deeppink">AWS CloudTrail</font>を使えば、AWSサービスの操作履歴を証跡として残すことができます。
<font color="deeppink">AWS CloudTrail</font>は<font color="green">Amazon S3</font>や<font color="deeppink">Amazon CloudWatch Logs</font>への出力をサポートしており、証跡ログのモニタリングをすることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/9f87ce98-7568-8cd4-69f5-40ee908621f4.png)
（引用元：[20210119 AWS Black Belt Online Seminar AWS CloudTrail](https://www.slideshare.net/AmazonWebServicesJapan/20210119-aws-black-belt-online-seminar-aws-cloudtrail#18))

<h3>ログ上に特定の文字列が出力されたらメールを配信</h3>

<font color="deeppink">Amazon CloudWatch Logs</font>のメトリクスフィルタという機能を使うことで、ログに特定の文字列が検知されたら<font color="deeppink">Amazon SNS</font>でユーザにメールを配信することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/8b1cf2d4-7cf3-6863-ba60-8d98d83b0415.png)
（引用元：[20210119 AWS Black Belt Online Seminar AWS CloudTrail](https://www.slideshare.net/AmazonWebServicesJapan/20210119-aws-black-belt-online-seminar-aws-cloudtrail#55))

<h3>アカウントアクティビティ発生からアラート配信まで最大15分かかることも・・・</h3>

<font color="deeppink">AWS CloudTrail</font>の証跡ログの出力は通常15分以内に配信する仕様です。
前述の「モニタリング例」の①の時点で15分かかった場合、当然ユーザがメールを受け取るまで15分かかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/7ae1fc5b-1b40-3fb7-cb58-4056d4f52d4b.png)
（引用元：[20210119 AWS Black Belt Online Seminar AWS CloudTrail](https://www.slideshare.net/AmazonWebServicesJapan/20210119-aws-black-belt-online-seminar-aws-cloudtrail#13))

「不正なAPI呼び出し」や「MFAなしでのコンソールへのサインイン」、「ルートアカウントの使用」等、すぐにでも検知したいようなアカウント操作を監視する場合はこの設定では遅すぎるかもしれません。

<h2>Amazon EventBridgeによるアラート通知</h2>

<font color="green">Amazon EventBridge</font>を使うことで、AWS APIコールが発生した瞬間にイベントを検知し、指定したアクションを実行することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/acb9d31b-7e97-9d34-8ce1-8c68781e6f6a.png)
（引用元：[20200122 AWS Black Belt Online Seminar Amazon EventBridge](https://www.slideshare.net/AmazonWebServicesJapan/20200122-aws-black-belt-online-seminar-amazon-eventbridge))

<h2>例：MFAを使わずにログインしたアカウントの検知 例</h2>

一つ、試しに<font color="green">Amazon EventBridge</font>でイベントを検知してみましょう。

<font color="green">Amazon EventBridge</font>の画面から **[バス]** を選択し、イベントバスで[default]が選択されていることを確認のうえ、 **[ルールを作成]** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/079e2f5b-67e5-dc08-c251-355add88f83b.png)

ルールの詳細を定義では **[イベントバターンを持つルール]** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/681c2b56-3c8f-1f60-d472-9d78982caba9.png)

イベントパターンに以下のJSONを挿入し、「次へ」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/3b9748e2-4832-7e7b-6ea0-7bbdfebb858e.png)

```json:Event Patern of SignInn Without MFA
{
  "detail-type": ["AWS Console Sign In via CloudTrail"],
  "detail": {
    "eventName": ["ConsoleLogin"],
    "additionalEventData": {
      "MFAUsed": ["No"]
    }
  }
}
```

ターゲットには<font color="deeppink">Amazon SNS</font>を追加します。
※事前にメール配信用のSNSトピックを準備しておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/c48cad3a-f204-651b-3535-a82fe505c829.png)

次ページのタグの設定は不要ですので、「ルールの作成」を押します。

その後、MFAを利用していないユーザでログインをすると、10秒以内にメールが飛んできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/f075045c-4eb0-d944-8c53-605237f5e7ca.png)

<h3>Amazon EventBridgeによる監視のデメリット</h3>

AWSサービスのイベントが発生したことを<font color="green">Amazon EventBridge</font>と<font color="deeppink">Amazon SNS</font>で検知したい場合、前述のとおり監視をしたい内容をイベントパターンでどのように定義するか、調査しなくてはいけません。

これは面倒ですね。

<h2>GuardDutyによる検知</h2>
<font color="red">Amazon GuardDuty</font>を使えば、AWSアカウントへの脅威の検知を簡単に設定できます。<font color="green">Amazon EventBridge</font>のイベントパターンに詳しくなる必要はありません。

<font color="red">Amazon GuardDuty</font>を有効化すると、セキュリティ上の脅威を検出してくれます。
脅威の検出結果は上記と同じく<font color="green">Amazon EventBridge</font>と<font color="deeppink">Amazon SNS</font>でアラートの配信をすることができます。

<h3>Amazon GuardDutyにより検出された脅威をメールで確認するための設定</h3>
<font color="red">Amazon GuardDuty</font>では、検出された脅威（Fingings）を重要度「高／中／低」に応じて分類してくれるため、<font color="green">Amazon EventBridge</font>側で「重要度 中以上の脅威が検出された場合のみアラートを配信する」という設定をすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/bf846899-4318-c590-f789-adfe31d21686.png)
（引用元：[【AWS Black Belt Online Seminar】Amazon GuardDuty](https://d1.awsstatic.com/webinars/jp/pdf/services/20180509_AWS-BlackBelt_Amazon-GuardDuty.pdf))

```json:Event Patern of Severity High - GuardDuty Findings
{
  "source": ["aws.guardduty"],
  "detail-type": ["GuardDuty Finding"],
  "detail": {
    "severity": [{
      "numeric": [">=", 7.0]
    }]
  }
}
```

この機能を使えば、一つ一つの脅威に対して<font color="green">Amazon EventBridge</font>を作成する必要がなくなりますね。
<font color="green">Amazon EventBridge</font>では、特定のAWS APIが操作された場合のみネクストアクションを起こすことができますが、<font color="red">Amazon GuardDuty</font>は「悪意のあるIPアドレス、通常操作とは異なる何らかの異常の検出、機械学習などの統合脅威インテリジェンス」を使用した脅威検出をしてくれるため、「どのような脅威を検知したい」とユーザが事前に具体的に定義する必要がないところも良い点です。

もちろん、特定の検出結果だけアラートを配信する設定を入れることもできます。
```json:Event Patern of Root User Usage - GuardDuty Findings 
{
  "source": ["aws.guardduty"],
  "detail-type": ["GuardDuty Finding"],
  "detail": {
    "type": ["UnauthorizedAccess:IAMUser/RootCredentialUsage"]
  }
}
```

<h2>おわりに</h2>

いかがでしたでしょうか。
<font color="deeppink">AWS CloudTrail</font>のメトリクスフィルタを使った監視を利用しているユーザの皆さんの参考になりますと嬉しいです。