特定IAMロールへスイッチロールしたことを通知する

2023.09.04

「クリティカルな用途で使われるIAMロール」へスイッチロールしたことを通知して、 管理者が気付ける仕組みを作ってみます。

以降でアーキテクチャを記載します。 実際に通知リソースを作成して、通知されることまで確認します。

アーキテクチャ概要

img

スイッチロールを検出する EventBridgeルールを作成します。 バージニア北部(us-east-1)上で作成することに注意してください。

EventBridgeルールのターゲットとしてSNSトピックを選択します。 SNSトピックから各種通知先(メールなど)へメッセージを送信します。 メッセージ内容は EventBridgeの入力トランスフォーマーである程度整形します。

作ってみる

スイッチロール元のAWSアカウントにてリソースを作成していきます。 以降は 全てバージニア北部(us-east-1)リージョンでの作業 です。

事前準備: SNSトピックを作成、設定する

SNSトピックを作成して、 適切な通知先へのサブスクリプションを設定します。

今回は、以下のようなSNSトピック detect-switchrole と、 Eメール サブスクリプションを作成しています。

img

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ロールへスイッチロール

[ロールの切り替え] を行います。

img

↓メール通知を確認

スイッチロール後、すぐに以下のようなメールを受け取りました。

img

"アカウント 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 を使う必要がある」部分でハマりました。 上記ブログのおかげで早く解決できました。

参考

補足

スイッチロールイベントの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"
    }
  }
}