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

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

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

はじめに

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

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

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

blog.serverworks.co.jp

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

AWS 環境構成図

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

今回注目したいポイントは以下の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 に記録されるためです。

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

2024年4月22日 追記(注意)

現在、AWS マネジメントコンソールのスイッチロールは「各リージョン」に履歴が保存される仕様となっています。このため us-east-1 だけを監視したとしても、他リージョンの場合に通知が来なくなりました。

repost.aws

re:Post には上記(IAM イベントの EventBridge ルールが us-east-1 リージョンでのみトリガーされるのはなぜですか?)の解説はありますが、マネジメントコンソールの場合はそのように動作しません。

ap-northeast-1.console.aws.amazon.com

AWS サポートに確認したところ、マネジメントコンソール URL にリージョンの Endpoint が含まれるよう仕様が変更された時点から各リージョンに出力されるようになった模様とのことでした。

このため、本ブログの方法では us-east-1 で行われたスイッチロールの履歴のみが通知可能であり、網羅性が失われています。

全リージョンに対応する例としては、EventBridge のイベントをクロスリージョンで1つのリージョンに集約した後、同様に通知を行う方法が考えられます。

repost.aws

docs.aws.amazon.com

今後、検証ができたタイミングで EventBridge をクロスリージョンで集約設定した場合の SwitchRole 通知について、改めてブログに記載したいと考えています。

以上が現時点における注意点でした。以下、手順に続きます。

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"
        ]
    }
}

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

不正確な設定の例

マネジメントコンソールでは「"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 通知の方が良いでしょう。

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資格全冠。2010年1月からAWSを利用してきています。2021-2022 AWS Ambassadors/2023-2024 Japan AWS Top Engineers/2020-2024 All Certifications Engineers。AWSのコスト削減、最適化を得意としています。