見落とすとAWSアカウントが停止してしまうかも。Abuse Reportを自動で即時にSlack通知

Abuse Reportは対応を怠るとAWSアカウントが停止されてしまう可能性がある重要な通知です。 見落とさないように自動でSlackに通知を送る設定を作成しました。
2021.05.24

オペレーション部の加藤(早)です。

Abuse Reportとは?

AWSリソースをマルウェアの配布やスパム送信、その他違法行為等不正に利用していることが検知された場合、直ちに是正するようにAWSからの警告が発されます。
その警告がAbuse Reportです。

違法行為を行うつもりはなくても、以下のように意図せず抵触してしまうこともあり得ます。

  • EC2がマルウェアに感染してDoS攻撃の攻撃元となる。
  • 運用しているSMTPサーバが設定ミスでオープンリレー状態になっている。
  • AWS上で運営している掲示板サービスのエンドユーザが違法なコンテンツを投稿する。

Abuse Reportを受け取った場合、24時間以内に応答しないとAWSアカウントが停止される可能性もあり
万一通知が来た際には迅速な対応が求められます。

注意: 不正使用に関する通知に対して 24 時間以内に応答がない場合、AWS は、お客様のリソースをブロックするか、お客様の AWS アカウントを停止することがあります。

引用: AWS からリソースに関する不正使用の報告を受け取った場合、どうすればよいですか?

警告はメール(英語)およびパーソナルヘルスダッシュボード上で行われますが、うっかりスルーしてしまう場合もありそうです。
見落とさないよう、Slackへの通知を自動化してみました。

設定方法

今回操作するAWSリソースは以下の3つです。

  • Amazon EventBridge
  • Amazon SNS
  • AWS Chatbot

AWS Health Abuse Event はグローバルイベントのため、米国東部 (バージニア北部) リージョンでリソースを作成します。

SNSトピックの作成

今回はスタンダードタイプのトピックを新規に作成しました。名前/表示名以外のパラメータは全てデフォルトにしています。

Chatbotの設定

Slackワークスペースと連携を行います。

はじめにSlackのクライアントを作成します。

Slackの認証ページにジャンプするので、 ワークスペースにログインし、必要な権限を許可します。

ワークスペースがChatbotを認証したら、「新しいチャネルを設定」からチャネル設定を作成します。

  • チャネル
    • どこのチャンネルに通知を設定するかを選択してください。
  • IAMロール
    • 通知のみ設定します。
  • トピック
    • 先程作成したSNSトピックを選択します(SNSトピックにサブスクリプションが作成されます)。

結果こうなります。

EventBridgeの設定

AWS Health Abuse Eventに属する全てのissueを通知するルールを作成します。

パターン定義をGUIから作成します。

ターゲットとして、先程作成したSNSトピックを選択します。
トピックの選択以外の設定はデフォルトにしました。

結果このようになります。

イベントパターン(json)はこちらからコピペも出来ます。

{
  "source": ["aws.health"],
  "detail-type": ["AWS Health Abuse Event"],
  "detail": {
    "service": ["ABUSE"],
    "eventTypeCategory": ["issue"]
  }
}

ここまでで設定は終わりです。

確認

EventBridgeルールの確認

EventBridgeがAbuseイベントを検知できることを確認します。

本来であればEventBridgeのput-eventsAPI等でテスト用のイベントを発行したいところですが、
Chatbotで有効なテスト用のイベントを発行させることができなかったので
こちらの公式リポジトリを参考にEventBridgeのテストイベントパターンを作成しました。

aws/aws-health-tools/dos-report-notifier · GitHub

アカウント内のEC2がDoS攻撃を行っていた、という想定です。
\<\<aws_account_id>>の内部は12桁のアカウントIDに書き換えてください。

{
  "version": "0",
  "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718",
  "detail-type": "AWS Health Abuse Event",
  "source": "aws.health",
  "account": "<<aws_account_id>>",
  "time": "2017-12-22T18:43:48Z",
  "region": "us-east-1",
  "resources": [
        "arn:aws:ec2:us-east-1:<<aws_account_id>>:instance/i-1234",
        "arn:aws:ec2:us-east-1:<<aws_account_id>>:instance/i-4567"
  ],
  "detail": {
    "eventArn": "arn:aws:health:global::event/AWS_ABUSE_DOS_REPORT_3223324344_3243_234_34_34",
    "service": "ABUSE",
    "eventTypeCode": "AWS_ABUSE_DOS_REPORT",
    "eventTypeCategory": "issue",
    "startTime": "Tue, 27 Nov 2018 01:30:00 GMT",
    "eventDescription": [{
        "language": "en_US",
        "latestDescription": "Denial of Service (DOS) attack has been reported to have been caused by AWS resources in your account."
    }],
    "affectedEntities": [{
        "entityValue": "arn:aws:ec2:us-east-1:<<aws_account_id>>:instance/i-1234"
    },{
        "entityValue": "arn:aws:ec2:us-east-1:<<aws_account_id>>:instance/i-4567"
    }]
  }
}

EventBridgeのルール編集画面を開き、
「イベントパターンをテスト」のカスタムイベント欄にこちらを貼り付け、「イベントパターンをテスト」をクリックします。

左下に緑色で「イベントパターンに一致したサンプルイベント」と表示されました。
これで、今回作成したルールがこのサンプルイベントを検知できることが確認されました。

EventBridge〜SNS〜Chatbot 疎通テスト

EventBridgeでルールに合致するイベントを検知した際、SNS/Chatbot経由でSlackに通知が来ることを確認します。

EventBridgeで実際に引っかかりやすいルールを作成し、SNSトピックをターゲットに設定します。
今回はこのように、アカウント内で発生したすべてのイベントを検知して、今回作成したSNSトピックに通知するルールを作成しました。

作成を終えると、このアカウント上で発生するあらゆるイベントを検知して、Chatbotからどんどん通知が来ます。
何もイベントが起こらず通知が来ない場合は、今作ったルールをコンソールから無効/有効にするなどしてみてください。CloudTrailのイベントが発生するはずです。

これでEventBridgeでルールに合致するイベントを検知した際、SNS/Chatbot経由でSlackに通知が来ることが確認できました。

どんどん通知が来るので、確認がとれたらすぐこのルールは削除しましょう。

おわりに

通知の文面をアレンジしたかったり、テストイベントからChatbotへの通知が行われることを確認したい場合、少し手数はかかりますがSNS → Chatbot 部分を Lambda → SNS の構成に設定することもできます。

万が一Abuse Reportを受け取る事態になってしまったときに通知を見落とさないよう、設定してみてはどうでしょうか。

参考

Automating processes for handling and remediating AWS Abuse alerts | AWS Management & Governance Blog

AWSより「Abuse Report」といった件名の通知が届いたとき、対応すべきこと | DevelopersIO