CloudTrail使ってますか、CloudTrail。
最近CloudTrailのhttps://www.slideshare.net/AmazonWebServicesJapan/20210119-aws-black-belt-online-seminar-aws-cloudtrailに目を通しました。
このスライドのように、CloudTrailのイベントをモニタリングする、ということをやってみたいと思います。
本記事の対象
- Lakeや証跡などを能動的に解析する❌ -> 別の記事で書くかも?
- イベントを通知して気付けるようにする✅
CloudTrailは進化している
この資料は2021年のものですが、2022年にCloudTrailLakeがサービスインしたり、証跡を通知するのであればEventBridgeが使いものになるようになったり、現在の環境はこのスライドの当時とはちょっと異なっているのかなと思っています。
なので、通知の構成としては、
- CloudTrail -> (証跡があれば自動、証跡が1つもないと発行されない) -> EventBridge -> SNS -> AWS Chatbot
でやっていこうと思います。
なお他の実装パターンでは
- CloudTrail -> 証跡のCloudWatch Logs出力オプション -> Subscription Filter -> SNS -> Lambda
などが考えられると思いますが、EventBridgeの方はCloudWatchへの連携が必要なくイベントのフィルターも簡単で、SNSとも連携できるので、シンプルにいくと思いました。証跡が必要であれば、逆にLakeを有効化するのがいいのかなと思います。証跡を保存するということは分析がしたいということになるでしょうしね。
IAMなどのグローバルサービスのイベントについて
知らなかったのですが、IAMはグローバルサービスなので、全てのイベントがus-east-1に出力されるようです。
通知の設定などを東京に置いている場合の設定について、二通りの方法を思いつきましたが、後述の通り、実際は一択でした。
マルチリージョンの証跡を使ってus-east-1のイベントを東京でもみれるようにする- EventBridgeでus-east-1のイベントを東京に転送する✅
1つめのものは勘違いでした。グローバルサービスであれば、必ずイベントがus-east-1に発行されます。マルチリージョンの証跡というのは、「全てのリージョンで証跡を有効にする」という意味であって、「全てのリージョンの証跡を集約する」という意味ではないようで。
逆に昔は全てのリージョンで1こ1こぽちぽち有効化する必要があったようですね、そういった歴史を知るとこの意味にも納得します。
やること
やること個別に関しては、それぞれ詳しい記事がありますので省略しますが、以下の手順がいいと思います。
-
AWS ChatbotとSNSの設定
https://techblog.cartaholdings.co.jp/entry/archives/6411 を参考に -
CloudTrailの証跡の作成(CloudWatchへの連携をONにする必要はありませんが、証跡自体がないとEventBridgeにもデータが飛んでいきません。)
-
EventBridgeのus-east-1からap-northeast-1への転送設定
https://dev.classmethod.jp/articles/eventbridge-cross-region-expands/
が参考になります。この設定はus-east-1のEventBridgeの「ルール」で行います。
通知だけであれば無限ループの可能性もなく、イベントパターンは全てで大丈夫だと思います。{ "account": ["123456789012"] }
ターゲットは別リージョンへの転送になるので「別のアカウントまたはリージョンのイベントバス」とした上でにap-northeast-1のdefaultバスを選びます。選ぶと言いましたがUI上では選択肢に出てこないのでARNをコピペします。
なお、この設定を行うと、ap-northeast-1のdefaultバスにus-east-1のイベントが混ざりますので、それが嫌な場合バスを分けたりしたほうがいいです。今回の用途だとdefaultバスを本通知以外に利用していないのもありあえて混ぜます。
-
EventBridgeのap-northeast-1側の通知設定
最後にap-northeast-1側のルールで、SNSへの連携を行います。その際、通知対象のイベントを絞るのですが、JSONで書きます。冒頭の図の「IAMポリシーの削除、付与」のDeleteRoleを通知したければ{ "source": ["aws.iam"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["iam.amazonaws.com"], "eventName": ["DeleteRole"] } }
PutUserPolicyも通知したいなーと思ったらeventNameに追記したらいいですが、冒頭の図の「ルートアカウントでの操作」も通知したいなーと思ったら、別のルールを新規で作りましょう。
図の中でいうと箱の単位がルールの単位にするとよさそうです。
このEventBridgeのルール設定についてる対象のイベントを絞る機能は強力で、CloudWatchからの通知だとSubscriptionFilterの後にLambdaを噛ませてフィルタリングしたりしないといけないかもしれません。
以上
間違っているところがあればコメントください、検証の上訂正したいと思います。