少し前に以下の記事を書きました
https://qiita.com/kaikusakari/items/06b47a45de30107a2ab1
単独アカウントでIAMのイベントを取得する場合のケースでしたが、クロスアカウント環境下でIAMのイベントを集約して検知したい場合の手段になります。
前の記事に記載した通り、IAMのイベントは「us-east-1」リージョンにEventBridgeを作らないと取得できません。(他にもConfigを使うなど取得する手段はありますが、EventBridgeがお勧めです)
想定環境
・「ap-northeast-1」を主に使っている
・クロスアカウント
・1つのアカウントにログやイベントを集約して監視専用のアカウントとする
準備するもの
イベント送信先
ログ集約アカウント
・「ap-northeast-1」でLambdaを作り、イベントを検知してチャットアプリに通知する
・「us-east-1」から「ap-northeast-1」のLambdaをCallするためのSNSトピックを作成する
・「us-east-1」で各アカウントからIAMのイベントを受け取る用のイベントバス+ルールを作る
イベント送信元
各アカウント
・「us-east-1」でIAMイベント取得用のルールを作る
構築(イベント送信先)
Lambda
Lambda(Node)の実装例
exports.handler = async (event) => {
const json = JSON.parse(event.Records[0].Sns.Message);
console.log("account " + json.account);
console.log("eventName " + json.detail.eventName);
const response = {
statusCode: 200,
body: JSON.stringify('account ' + event.account + ' ' + event.name),
};
return response;
};
SNSのトピックを作成
上記Lambdaの名前をサブスクライブに指定する
EventBridge(イベントバス)
送信元アカウントの12桁数字を入力する
EventBridge(ルールの作成)
イベントパターンのイベント名に「Create*」のような指定はできません。
{
"source": [
"aws.iam"
],
"detail-type": [
"AWS API Call via CloudTrail"
],
"detail": {
"eventSource": [
"iam.amazonaws.com"
],
"eventName": [
"CreateUser",
"CreatePolicy"
]
}
}
構築(イベント送信元)
EventBridge(ルールの作成)
ターゲットにイベント送信先のイベントバスを指定します
{
"source": [
"aws.iam"
],
"detail-type": [
"AWS API Call via CloudTrail"
],
"detail": {
"eventSource": [
"iam.amazonaws.com"
],
"eventName": [
"CreateUser",
"CreatePolicy"
]
}
}
結果
CreateUser、CreatePolicyのイベント発生時にLambdaが動くのでチャットアプリなりに通知して適宜監視するなど利用できるかと存じます。
(EventBridgeはCloudtrail経由のため実際の操作から10分程度遅れて通知を受け取ることになります)