🔔

AWS ルートユーザーのログインをSlackに通知してみた

に公開

はじめに

AWS ルートユーザーのログインはセキュリティ上、最も警戒すべきイベントの一つです。
というわけで、マルチアカウント環境においてルートユーザーのログインを検知し、Slack に通知する仕組みを構築してみました。

構築手順

構成は以下の通りです。
通知機構をアカウント毎に作りたくなかったので、
通知を1つのアカウントに集約する形をとっています。

1. 集約先アカウントで通知機構を作る

先に、集約先アカウントで外部からのイベントを受け取りSlackに通知する機構を作ります。
SNS -> Amazon Q Developer in chat applications -> Slack通知の構築手順を書いた記事は世にいっぱい書いてあるので、今回は省略します。

1. EventBridge カスタムイベントバスを作成する

任意の名前のカスタムイベントバスを作成します。
名前以外の設定はデフォルトでOKです。

2. EventBridge ルールを作成する

外部からのイベントを受け取ってSNSにデータを流すルールを作成します。
1で作ったカスタムイベントバスに紐づく形にするために、イベントバスは1で作ったカスタムイベントバスを選択します。

トリガーイベントは「AWS Console Sign in via CloudTrail」を選択します。

ターゲットは「SNS トピック」を選択します。

  • ターゲットの場所:このアカウントのターゲット
  • トピック:Slackに通知するSNSトピック名
  • 許可 実行ロールを使用:True
  • 実行ロール:この特定のリソースのために新しいロールを作成

上記設定が終わったら任意の名前をつけて作成ボタンを押します。

おまけ

Slackに通知する内容をカスタマイズしたい場合は、ターゲットの「入力変換」を使います。
例として、入力トランスフォーマーを選択し、下記を入力すると、こんな感じの通知が届きます。

入力パス
{
  "MFAUsed": "$.detail.additionalEventData.MFAUsed",
  "account": "$.account",
  "login_result": "$.detail.responseElements.ConsoleLogin",
  "sourceIPAddress": "$.detail.sourceIPAddress",
  "time": "$.time"
}
テンプレート
{
  "version": "1.0",
  "source": "custom",
  "content": {
    "title": "Rootログインを検知しました",
    "description": "@security \nAccount: <account>\nIP: <sourceIPAddress>\nMFA: <MFAUsed>\nResult: <login_result>\nTime: <time>"
  },
  "time": "<time>"
}

2. ルートユーザーのログインを検知してイベントを投げる

次に、ルートユーザーのログインをEvent Bridgeを使って検知し、集約先アカウントにイベントを投げるところを作ります。

1. リージョンを us-east-1 に切り替える

2. EventBridge ルールを作成する

トリガーイベントは「AWS Console Sign in via CloudTrail」を選択します。
今回は、ログインの中でもルートユーザーのログインを検知したいので、イベントパターン (フィルター) を下記に書き換えます。

イベントパターン (フィルター)
{
  "source": ["aws.signin"],
  "detail-type": ["AWS Console Sign In via CloudTrail"],
  "detail": {
    "userIdentity": {
      "type": ["Root"]
    }
  }
}

ターゲットは「EventBridge イベントバス」を選択します。

  • ターゲットの場所:別の AWS アカウントのターゲット
  • イベントバスの ARN:手順1-1で作成した集約先アカウントにあるカスタムイベントバスの ARN を指定
  • 実行ロール:この特定のリソースのために新しいロールを作成

上記設定が終わったら任意の名前をつけて作成ボタンを押します。

3. テストしてみる

手順2の設定を行ったAWSアカウントのルートユーザーでログインを試してみます。
しばらくすると、Slackに通知が送信されてきます。

さいごに

今回、一見シンプルに見える「ログイン通知」でも、リージョン制約やイベントソースの仕様、Amazon Q 特有のスキーマなど「ハマりどころ」が多くありました。

マルチアカウント運用において「集約」は運用の負荷を下げる重要な鍵です。
本記事の内容が誰かの助けになれば幸いです。

Atrae Tech

Discussion