営業部 佐竹です。
本日は、EventBridge で SwitchRole の通知を行う設定方法について記載します。
はじめに
Amazon EventBridge は、サーバレス(フルマネージド)のイベントバスサービスで、この機能を起点に様々な処理をトリガーすることが可能です。
EventBridge から行われる最もシンプルな処理としては、SNS の Notification を利用した通知処理です。
今回は、以前記載した以下の記事のように、特定の処理を通知するための記事になります。
EventBridge を利用して IAM User の SwitchRole 通知を行う
AWS 環境構成図

最初に構成図を紹介します。全体の流れはこのような構成となっています。
今回注目したいポイントは以下の3つです。
AWS Console Sign In via CloudTrailの利用- 踏み台 AWS アカウントでの
SwitchTo履歴 - スイッチ先 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 だけを監視したとしても、他リージョンの場合に通知が来なくなりました。
re:Post には上記(IAM イベントの EventBridge ルールが us-east-1 リージョンでのみトリガーされるのはなぜですか?)の解説はありますが、マネジメントコンソールの場合はそのように動作しません。

AWS サポートに確認したところ、マネジメントコンソール URL にリージョンの Endpoint が含まれるよう仕様が変更された時点から各リージョンに出力されるようになった模様とのことでした。
このため、本ブログの方法では us-east-1 で行われたスイッチロールの履歴のみが通知可能であり、網羅性が失われています。
全リージョンに対応する例としては、EventBridge のイベントをクロスリージョンで1つのリージョンに集約した後、同様に通知を行う方法が考えられます。
今後、検証ができたタイミングで 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 通知の方が良いでしょう。

動作確認
動作確認を行うと、通知が2つ送られることがわかります。これが先に記載した「SwitchTo」と「SwitchFrom」です。
SwitchTo
踏み台となるAWSアカウント側に出るイベントであり、その履歴が「SwitchTo」です。以下の JSON の additionalEventData に「SwitchTo」が記載されており、「どの AWS アカウントのどの IAM Role にスイッチを行ったのか」が判断可能です。またこれが IAM User から実行されている場合、userIdentity の Type は「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 がスイッチを行ったのか」が判断可能です。userIdentity の Type は「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/2020-2025 Japan AWS Top Engineers/2020-2025 All Certifications Engineers。AWSのコスト削減やマルチアカウント管理と運用を得意としています。