[アップデート]EventBridgeのEvent Busがリソースベースポリシーをサポートしてクロスアカウント連携がやりやすくなったのでGuardDutyイベントのフィルターを試したらうまく行かなかった話

Event Busがリソースベースポリシーをサポートしてクロスアカウントのイベント転送がやりやすくなりました!ただし私はAWSイベント転送を試そうとしてハマったので共有します。
2020.12.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

みなさん、イベント管理してますか?(挨拶

今回はAmazon EventBridgeのEvent Busがリソースベースポリシーをサポートしたりして使いやすくなりましたので紹介します。

Amazon EventBridge announces improved resource policies for event buses

ついでにGuardDutyのイベントをリソースベースポリシーでフィルターしてみたらうまく行かなかったのでそれを共有します。

なにが変わったのか

EventBridgeは元々CloudWatch Eventsと呼ばれていたサービスで、AWS上のAPIイベントやcron式によるスケジュールなどをトリガーに次のアクションにつなげる役割を持っています。EventBridgeとなってからはよりサーバーレスアーキテクチャーでのイベント転送の役割も強くなっています。

アプリケーションからクロスアカウントでイベントを送る場合には、送信先のアカウントへAssumeRoleしてからそのEvent BusにPutEventを行う必要がありました。

今回Event Busがリソースベースポリシーをサポートしたので、AssumeRoleせずにアプリケーションから直接イベントを送れるようになりました。例えばPrincipalで送信元のIAM Roleを指定したり、Conditionにてイベントソースやイベントタイプを限定したりできます。

また、リソースベースポリシーをサポートしたことによりEvent Bus配下の操作を行う各種API(PutRule, PutTargets, DeleteRule, RemoveTargets, DisableRule,EnableRule)にてEvent Bus ARNを指定して操作することができるようになりました。これはどういうことかというと、元々はクロスアカウントで別アカウントのEvent Busを操作するにはそのアカウントのIAM Roleを経由して行う必要がありましたが、受け取る側のEvent Busがリソースベースポリシーで許可すればルールの作成などの操作をIAMの変更なしに行うことができるようになったのです。

これはよりサーバーレスのシステムでイベントを扱う際に便利で以下のようなサンプル構成と供にチュートリアルのブログも上がっています。詳細が気になる場合はこちらも見てみてください。(今回はこちらは深く触れません)

Simplifying cross-account access with Amazon EventBridge resource policies | AWS Compute Blog

GuardDutyのイベントフィルターをやってみた

私は普段GuardDutyのイベント転送をクロスアカウントで行っているので、これをリソースベースポリシーを使いながら必要以上のイベントが飛んでこないようにフィルターできるのではと考えてやってみました。

結論から言うとこれはうまくいきません。理由は後述します。

構成はこんな感じ。Event Bus側でリソースベースポリシーを記述します。

試したリソースベースポリシー

以下を適用してみました。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "AllowGuarddutyEvents",
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::[送信側アカウントID]:root"
    },
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:ap-northeast-1:[受信側アカウントID]:event-bus/default",
    "Condition": {
      "StringEquals": {
        "events:source": "aws.guardduty"
      }
    }
  }]
}

しかしこれはうまくいきませんでした。

ポリシーを変更しながら切り分けをしていくと、Conditionの部分が正しく評価されていないように感じられました。しかしドキュメントには以下のような書き方があり、上記が正しく思えました。

      "Condition": {
        "StringEquals": {
          "events:detail-type": "newOrderCreated",
          "events:source": "com.exampleCorp.webStore"
        }
      }

そこでこの内容をもとにサポートへ問い合わせました。

その結果、このリソースベースポリシーではAWSのイベントをEvent Ruleでイベント転送した場合にはevents:sourceなどのキーが存在しないためマッチしないとのことでした。

あくまでこのリソースベースポリシーで利用するConditionは個別のアプリケーションからPutEventを行う場合で利用するもので、AWSイベントを転送する場合には利用できないということでした。

皆様も気をつけましょう。

まとめ

Event Busがリソースベースポリシーをサポートしたので、アプリケーションからクロスアカウントのイベント転送がやりやすくなりました。

しかしながらAWSのイベント転送はリソースベースポリシー内でConditionのevent:sourceにかけることはできないので注意しましょう!