EventBridge を利用して IAM User の SwitchRole 通知を行う

記事タイトルとURLをコピーする

営業部 佐竹です。
本日は、EventBridge で SwitchRole の通知を行う設定方法について記載します。

はじめに

Amazon EventBridge は、サーバレス(フルマネージド)のイベントバスサービスで、この機能を起点に様々な処理をトリガーすることが可能です。

EventBridge から行われる最もシンプルな処理としては、SNS の Notification を利用した通知処理です。

今回は、以前記載した以下の記事のように、特定の処理を通知するための記事になります。

blog.serverworks.co.jp

EventBridge を利用して IAM User の SwitchRole 通知を行う

AWS 環境構成図

f:id:swx-satake:20220125144258p:plain

最初に構成図を紹介します。全体の流れはこのような構成となっています。

今回注目したいポイントは以下の3つです。

  1. AWS Console Sign In via CloudTrail の利用
  2. 踏み台 AWS アカウントでの SwitchTo 履歴
  3. スイッチ先 AWS アカウントでの SwitchFrom 履歴

具体的な EventBridge での設定方法

マネジメントコンソールから設定を行います。

まずは US East (N. Virginia) us-east-1 に表示を切り替えます。これは、スイッチロールの履歴が us-east-1 に記録されるためです。

f:id:swx-satake:20220125140746p:plain

次に、Amazon EventBridge > Rules > Create rule を押下し、「Create rule」画面を表示します。以下に、最低限必要な設定を記載します。

Name and description

Name を記載してください。シンプルに「SwitchRole」等でも良いでしょう。

Define pattern

「Event pattern」を選択します。次に Event matching pattern では「Custom pattern」を選択します。その後、右側の Event pattern に以下の JSON 定義を記載して「Save」を忘れずに押下してください。

{
    "source": [
        "aws.signin"
    ],
    "detail-type": [
        "AWS Console Sign In via CloudTrail"
    ],
    "detail": {
        "eventSource": [
            "signin.amazonaws.com"
        ],
        "eventName": [
            "SwitchRole"
        ]
    }
}

f:id:swx-satake:20220125141635p:plain

なお Pre-defined pattern by service から、AWS > AWS Console Sign-in > Sign-in Events までは設定が可能ですが、eventName を SwitchRole のみに絞ることができないため、イベントパターンは上記の内容を手で記載するしかなく、ジェネレートできません。

f:id:swx-satake:20220125141902p:plain
不正確な設定の例

マネジメントコンソールでは「"AWS API Call via CloudTrail"」を選択した場合にのみ「Specific operation(s)」を設定できますが、"detail-type" は 「"AWS Console Sign In via CloudTrail"」である必要がありますため、このような設定は正常に動作しません。

Select event bus

設定変更等は不要です。

Select targets

SNS topic を選択します。

AWS Chatbot への連携も可能ですが、以下の通りあまり有用な情報が取れないため、Email 通知の方が良いでしょう。

f:id:swx-satake:20220125142227p:plain
Chatbot の通知は SwitchRole では必要な情報が不足している

動作確認

動作確認を行うと、通知が2つ送られることがわかります。これが先に記載した「SwitchTo」と「SwitchFrom」です。

SwitchTo

踏み台となるAWSアカウント側に出るイベントであり、その履歴が「SwitchTo」です。以下の JSON の additionalEventData に「SwitchTo」が記載されており、「どの AWS アカウントのどの IAM Role にスイッチを行ったのか」が判断可能です。またこれが IAM User から実行されている場合、userIdentityType は「IAMUser」となります。

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AUUU3HVBZ2UYIOPUYTKJH",
        "arn": "arn:aws:iam::123123123123:user/administrator",
        "accountId": "123123123123",
        "userName": "administrator"
    },
    "eventTime": "2022-01-25T01:31:28Z",
    "eventSource": "signin.amazonaws.com",
    "eventName": "SwitchRole",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "133.199.99.99",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36",
    "requestParameters": null,
    "responseElements": {
        "SwitchRole": "Success"
    },
    "additionalEventData": {
        "RedirectTo": "https://console.aws.amazon.com/support/home#/",
        "SwitchTo": "arn:aws:iam::123123123123:role/SwitchRoleTestPU"
    },
    "eventID": "7aa7869768907689076890789dd7360783f1",
    "readOnly": false,
    "eventType": "AwsConsoleSignIn",
    "managementEvent": true,
    "recipientAccountId": "123123123123",
    "eventCategory": "Management"
}

SwitchFrom

スイッチ先のAWSアカウント側に出るイベントであり、その履歴が「SwitchFrom」です。以下の JSON の additionalEventData に「SwitchFrom」が記載されており、「どの AWS アカウントのどの IAM User がスイッチを行ったのか」が判断可能です。userIdentityType は「AssumeRole」となります。

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA3HV6789798798LOCO:administrator",
        "arn": "arn:aws:sts::123123123123:assumed-role/SwitchRoleTestPU/administrator",
        "accountId": "123123123123"
    },
    "eventTime": "2022-01-25T01:31:28Z",
    "eventSource": "signin.amazonaws.com",
    "eventName": "SwitchRole",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "133.199.99.99",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36",
    "requestParameters": null,
    "responseElements": {
        "SwitchRole": "Success"
    },
    "additionalEventData": {
        "SwitchFrom": "arn:aws:iam::123123123123:user/administrator",
        "RedirectTo": "https://console.aws.amazon.com/support/home#/"
    },
    "eventID": "3d1be987657890876899879dyfas9adff1bb",
    "readOnly": false,
    "eventType": "AwsConsoleSignIn",
    "managementEvent": true,
    "recipientAccountId": "123123123123",
    "eventCategory": "Management"
}

上記の通りのため、同じ AWS アカウント内でスイッチロールを行った場合は、2通の通知が同時に通知されることとなります。

また、作業の手間から踏み台アカウント側にのみ本通知設定を行う場合には、2つのうちの1つ「SwitchTo」のみフックすることとなり、「SwitchFrom」の通知は行われない点に注意が必要です。ただし、基本的には踏み台アカウント側に設定があれば通知としては十分に役立つ設定と考えます。

ExitRole

スイッチロールを行った後、さらに別の AWS アカウントにスイッチを行ったり、また踏み台アカウントにスイッチバックをしたりする場合には「ExitRole」というイベントが発生します。

もし「ExitRole」も合わせて通知を行いたい場合は、EventBridge の定義 JSON の「eventName」の箇所に追記を行ってください。

まとめ

本日は、EventBridge で SwitchRole の通知を行う設定方法について記載しました。また「SwitchTo」と「SwitchFrom」についてもその違いを記載し、通知が2通届くことも説明いたしました。

個人的には AWS Console Sign In via CloudTrail を利用するという部分に気付かず長らくハマってしまいました。同じように、AWS Console Sign In via CloudTrail に気付かずハマってしまった方の参考になれば幸いです。

では、またお会いしましょう。

佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ

営業部カスタマーサクセス課所属。AWS資格12冠。2010年1月からAWSを利用してきました。2021 Japan APN Ambassador /2020-2021 APN ALL AWS Certifications Engineer。AWSのコスト削減、最適化を得意としています。