![特定IAMロールへスイッチロールしたことを通知する](https://devio2023-media.developers.io/wp-content/uploads/2023/08/amazon-eventbridge.png)
特定IAMロールへスイッチロールしたことを通知する
「クリティカルな用途で使われるIAMロール」へスイッチロールしたことを通知して、 管理者が気付ける仕組みを作ってみます。
以降でアーキテクチャを記載します。 実際に通知リソースを作成して、通知されることまで確認します。
アーキテクチャ概要
スイッチロールを検出する EventBridgeルールを作成します。 バージニア北部(us-east-1)上で作成することに注意してください。
EventBridgeルールのターゲットとしてSNSトピックを選択します。 SNSトピックから各種通知先(メールなど)へメッセージを送信します。 メッセージ内容は EventBridgeの入力トランスフォーマーである程度整形します。
作ってみる
スイッチロール元のAWSアカウントにてリソースを作成していきます。 以降は 全てバージニア北部(us-east-1)リージョンでの作業 です。
事前準備: SNSトピックを作成、設定する
SNSトピックを作成して、 適切な通知先へのサブスクリプションを設定します。
今回は、以下のようなSNSトピック detect-switchrole
と、 Eメール サブスクリプションを作成しています。
EventBridge ルールを作成する
以下のようなパラメータの EventBridgeルールを作成します。
パラメータ | 値 |
---|---|
名前 | 任意 ( detect-switchrole など) |
イベントパターン | (後述のJSON) |
ターゲット | 先程作成したSNSトピック |
入力トランスフォーマー | (後述の入力パス/テンプレート) |
↓ イベントパターンJSON (SwitchTo部分を適宜変更ください)
{ "source": ["aws.signin"], "detail-type": ["AWS Console Sign In via CloudTrail"], "detail": { "eventSource": ["signin.amazonaws.com"], "eventName": ["SwitchRole"], "additionalEventData": { "$or": [ {"SwitchTo": [{ "suffix": "SomeImportantRole_Admin"}]}, {"SwitchTo": [{ "suffix": "SomeImportantRole_Read" }]} ] } } }
↓ 入力トランスフォーマー > 入力パス
{ "AccountID": "$.detail.userIdentity.accountId", "EventTime": "$.detail.eventTime", "UserArn": "$.detail.userIdentity.arn", "SwitchTo": "$.detail.additionalEventData.SwitchTo", "SwitchRoleResponse": "$.detail.responseElements.SwitchRole" }
↓ 入力トランスフォーマー > テンプレート
"アカウント <AccountID> からのスイッチロールを検知しました。" "・時刻: <EventTime>" "・ユーザーARN: <UserArn>" "・スイッチ先: <SwitchTo>" "・スイッチロールステータス: <SwitchRoleResponse>"
通知を確認する
実際に通知されるところまで確認します。
↓特定のIAMロールへスイッチロール
[ロールの切り替え] を行います。
↓メール通知を確認
スイッチロール後、すぐに以下のようなメールを受け取りました。
"アカウント 123456789012 からのスイッチロールを検知しました。" "・時刻: 2023-09-04T02:15:18Z" "・ユーザーARN: arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_AdministratorAccess_31example/kawahara@example.com" "・スイッチ先: arn:aws:iam::111111111111:role/SomeImportantRole_Admin" "・スイッチロールステータス: Success"
おわりに
以上、IAMスイッチロールを通知する仕組みを作ってみました。
なお、本ブログ作成は 以下サーバーワークスさんのブログに助けられました。(感謝!)
「EventBridgeルールのフィルタには AWS Console Sign In via CloudTrail
を使う必要がある」部分でハマりました。 上記ブログのおかげで早く解決できました。
参考
- AWS Management Console sign-in events - AWS CloudTrail
- Amazon EventBridge イベントパターンでのコンテンツのフィルタリング - Amazon EventBridge
- EventBridge を利用して IAM User の SwitchRole 通知を行う - サーバーワークスエンジニアブログ
補足
スイッチロールイベントのJSONサンプル
{ "version": "0", "id": "e37f7eb0-231e-2274-2722-f6example", "detail-type": "AWS Console Sign In via CloudTrail", "source": "aws.signin", "account": "123456789012", "time": "2023-09-04T01:58:50Z", "region": "us-east-1", "resources": [], "detail": { "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AROAEXAMPLE:kawahara@example.com", "arn": "arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_AdministratorAccess_31ae5bfa4c67e7f8/kawahara@example.com", "accountId": "123456789012" }, "eventTime": "2023-09-04T01:58:50Z", "eventSource": "signin.amazonaws.com", "eventName": "SwitchRole", "awsRegion": "global", "sourceIPAddress": "104.28.XX.XX", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36", "requestParameters": null, "responseElements": { "SwitchRole": "Success" }, "additionalEventData": { "RedirectTo": "https://us-east-1.console.aws.amazon.com/events/home?region=us-east-1#/", "SwitchTo": "arn:aws:iam::111111111111:role/SomeImportantRole_Admin" }, "eventID": "bf0b3284-c431-4840-9a0c-42example", "readOnly": false, "eventType": "AwsConsoleSignIn", "managementEvent": true, "recipientAccountId": "123456789012", "eventCategory": "Management", "tlsDetails": { "tlsVersion": "TLSv1.3", "cipherSuite": "TLS_AES_128_GCM_SHA256", "clientProvidedHostHeader": "signin.aws.amazon.com" } } }