AWSコンソールへの不正アクセスをSlackに通知する

#この記事でやること
AWSへのアクセスキーが漏れて、xlargeインスタンスが立てられてしまったというのをちらほら聞きます。
そうなってからでは遅いので、万が一、不正なアクセスがあった場合に、一早く気づけるようにするために、不正ログインをSlackに通知するようにしておきましょう。
今回説明する仕組みは、CloudTrailに記録されているAWSコンソールへのログイン情報をCloudWatchのログに記録し、CloudWatchのアラート機能を利用し、指定IPアドレス以外からのログインを抽出、Lambaを利用してSlackの通知をするというものです。

以下の順番で説明していきます

- CloudTrailとCloudwatchの統合
- LambaでSlackに通知する関数を追加
- Cloudwatchのalertを設定
- SNSを利用して、CloudwatchのalertとLamba関数を紐付ける


#CloudTrailとCloudWatchの統合
CloudTrailに記録されるログイン情報をCloudWatchのログに記録するために、まずCloudtrailに行って、証跡を作ります。

手順は、

1. [CloudTrailの証跡情報](https://ap-northeast-1.console.aws.amazon.com/cloudtrail/home?region=ap-northeast-1#/configuration)に移動
2. 「証跡の作成」をクリック、以下の情報を埋めていきます
    3. 証跡情報の作成>証跡名（slack-notifyなど）
    4. データイベント>S3パケット作成
    5. ストレージの場所>S3パケット（slack-strageなど）
3. CloudTrail一覧に戻り、証跡が作成されていることを確認し、もう一度作成した証跡の詳細に移動します
    4. 右上の「ログの記録」がONになっていることを確認
    5. Cloudwatch Logs>設定で内容を確認し「次へ」をクリック、詳細を確認し、「許可」します
4. これで、CloudTrailとCloudWatchの統合が完了です

![cloudtrail.gif](https://qiita-image-store.s3.amazonaws.com/0/101754/0c4539bf-c7a6-4381-658a-8542f156609d.gif)
![cloudtrail2.gif](https://qiita-image-store.s3.amazonaws.com/0/101754/d577e506-ec09-501b-7f21-638b72fd8074.gif)

#LambaでSlackに通知する関数を追加
Slackに不正ログインを通知するために、Lamba関数を作成します。
その前に、下記のサイトを参考にSlackのWebhook URLを取得しておいてください。
[slackのIncoming Webhookを試してみた。](https://qiita.com/kooohei/items/2d91b99a4a8125556df9)

それでは、早速、Lamba関数を作成していきます。

手順は、

1. [AWS Lamba](https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/functions)に移動
2. 「一から作成」を作成して、以下の情報を埋めて、「関数を作成」します
    3. 名前（slack-notifyなど）
    4. ランタイム（Node.jsなどお好きな言語を）
    5. ロール（既存のロールを選択）
    6. 既存のロール（先ほど作成したロールを選択します）
7. すると詳細ページに移動するので、「関数コード」にスクリプトを記載します（[こちらの方のコード](https://gist.github.com/inopinatus/2ab66a262750f0af889e)が参考になります）
8. これで、Slackに不正ログインを通知するためのLamba関数を作成が完了です

![lamba.gif](https://qiita-image-store.s3.amazonaws.com/0/101754/d17a2041-7a99-d53e-0c37-74e8dc6a3207.gif)

# CloudWatchのalertを設定
CloudWatchでAWSコンソールに不正ログインがあった際に、通知してくれるalertを作成していきます。
手順は以下です。
1. [CloudWatchのログ](https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logs:)に移動
2. 「CloudTrailとCloudWatchの統合」で作成した、ロググループのメトリクスフィルタをクリック
3. 「メトリクスフィルタの追加」をクリック、フィルタパターンに以下の関数を記載します（今回は指定したIPアドレス外からのアクセスを探知するため、***には限定するIPアドレスをご記載ください

```
{ $.responseElements.ConsoleLogin = "Success" && $.sourceIPAddress !="×××.×××.×××.×××" }
```
4.右下の「メトリクスの割り当て」をクリックし、必要な情報を記載したら、フィルタの作成をクリックします
5. フィルタが作成し終えたら、フィルタ詳細ページからアラームの作成します
6. これで、CloudWatchのalertを設定の完了です
<img width="1335" alt="alert01.png" src="https://qiita-image-store.s3.amazonaws.com/0/101754/78aaeb40-c435-ee0e-c9d7-7ca29a3f9992.png">
<img width="1196" alt="alert02.png" src="https://qiita-image-store.s3.amazonaws.com/0/101754/45736306-2169-166e-bdfe-2be39c2789ce.png">

#SNSを利用して、CloudwatchのalertとLamba関数を紐付ける
最後に、Amazon Simple Notification Service（SNS）を利用して、CloudWatchのalertがあった場合に、Lamba関数を実行するよう設定していきます。

手順は以下です。

1. [SNSのトピック](https://ap-northeast-1.console.aws.amazon.com/sns/v2/home?region=ap-northeast-1#/topics)に移動
2. 新しいトピックを作成します
3. トピックを作成できたら、詳細ページから、「サブスクリプションの作成」をクリックし、以下の情報を埋めていきます
    4. プロトコル（AWS Lamba）
    5. エンドポイント（Lambaに設定した関数）
4. これで、CloudwatchのalertとLamba関数を紐付けの完了です（アラートが発生したら、Slackに通知が来ます）

![sns.gif](https://qiita-image-store.s3.amazonaws.com/0/101754/5b382537-d54d-6514-8fa3-a6f1d4a03262.gif)
![sns-subscription.gif](https://qiita-image-store.s3.amazonaws.com/0/101754/ba54b947-b714-0afb-e6a1-2bceeac51f87.gif)

#まとめ
セキュリティ関係はインシデントが起こってからでは遅いので、AWSのセキュリティベストプラクティスを読みながら、開発の最優先事項として、取り組むことをオススメします！
[セキュリティのベストプラクティス](https://docs.aws.amazon.com/ja_jp/inspector/latest/userguide/inspector_security-best-practices.html)