[アップデート]Amazon EventBridge が API 送信先接続でカスタマー管理キー (CMK) をサポートするようになりました
お疲れさまです。とーちです。
Amazon EventBridge が API 送信先接続でカスタマーマネージドキー (CMK) をサポートするようになったというアップデートがあったので、実際に試してみました。
EventBridge API 送信先と暗号化について
Amazon EventBridge は AWS 外の SaaS などのシステムもターゲットとして呼び出すことができます。外部システムを呼び出す際は対象システムの API が使われることが多いと思いますが、パブリックに公開されている API でない限り、API キーなどによって認証・認可を行う必要があります。
EventBridge には API 送信先
という設定があり、ここに対象 API の URL や API キーなどの設定を行います。このとき、認証・認可のために使用される情報は EventBridge によりデフォルトで AWS Key Management Service (AWS KMS) を使って暗号化されるようになっています。
従来はこの AWS KMS には AWS マネージドキーしか使えませんでしたが、今回のアップデートによりユーザーが管理するキーであるカスタマーマネージドキー (CMK) が使えるようになりました。
それではさっそく試してみましょう。
やってみる
今回は、イベント送信先として SaaS の一つである Datadog を使用します。(なお、Datadog で API キーを発行する手順はこちらを参照してください)
以下のチュートリアルも参考にしながら、Amazon EC2 インスタンスで起動・停止などのイベントが発生したときに Datadog にイベントをログとして記録するという流れを実装してみます。
前提条件
- Datadog でアカウント作成済み
- Datadog で API キーを作成済み
- Amazon EC2 インスタンスを作成済み(イベントを発生させるためだけのものなのでどんな設定でも OK)
AWS KMS キーの作成
まずは AWS マネジメントコンソールの AWS KMS の画面で今回暗号化・復号に使用するカスタマーマネージドキー (CMK) を作成します。
作成する際にキーポリシーに注意してください。今回は以下のポリシーで作成しました。
{
"Version": "2012-10-17",
"Id": "key-policy-example",
"Statement": [
{
"Sid": "foreventbridge",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:root"
},
"Action": "kms:*",
"Resource": "*",
"Condition": {
"StringLike": {
"kms:ViaService": "secretsmanager.*.amazonaws.com",
"kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:*:*:secret:events!connection/*"
}
}
},
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:root"
},
"Action": "kms:*",
"Resource": "*"
}
]
}
下の部分("Sid": "Enable IAM User Permissions"
以降)は管理者が AWS KMS キーのポリシー変更等の管理を行うためのポリシーなので EventBridge とは関係がない部分です。
その他の部分について詳細に説明します。
AWS KMS キーポリシーの重要なポイント
まずPrincipal
ですが、私が調べた限りでは、"AWS": "arn:aws:iam::<account-id>:root"
にする必要がありました。
今回、この AWS KMS キーは EventBridge サービス自体が、Datadog の API キーを暗号化、復号するために使用するキーになります。そのため、Principal
の部分は"Service": "events.amazonaws.com"
でも良いのかと思いましたが、私が検証した際はこの Principal ではうまく Datadog にイベントデータを送信することはできませんでした。
EventBridge の公式ドキュメント上も"AWS": "arn:aws:iam::<account-id>:root"
としているので Principal はこのようにしたほうが良いと思います。
また、Condition
についても説明します。この部分もEventBridge の公式ドキュメントに倣った記載としています。
"kms:ViaService"
はAWS KMS の公式ドキュメントによると「AWS KMS キーの使用を、指定された AWS サービスからのリクエストに制限する」ためのものです。今回は AWS Secrets Manager サービスからのリクエストとなるようです。
また"kms:EncryptionContext:SecretARN"
については私も見慣れなかったので調べてみたのですが、EncryptionContext とは暗号化する際のリクエストの中に含める Key:Value となるようです。このリクエストに含まれる Key と Value の値を確認するのが、"kms:EncryptionContext"
Condition です。
ご参考:Encrypting EventBridge connection authorization with AWS KMS keys - Amazon EventBridge
EventBridge では API キーなどの認証情報を暗号化・復号する際に、すべての AWS KMS 暗号化のためのリクエストで同じ暗号化コンテキストを使用します。具体的には、以下の暗号化コンテキストを使います。そのため、Condition に"kms:EncryptionContext"
を含めておけば、上記の"kms:ViaService"
と合わせてセキュリティ対策として一定の効果は得られるのではないかと思います。
"encryptionContext": {
"kms:EncryptionContext:SecretARN": "secret-arn"
}
AWS KMS のその他の設定は以下のようにしました。キーポリシーの他には特に気をつけるポイントはないかと思います。
EventBridge 接続の作成
続いて Datadog の API キーを登録するために AWS マネジメントコンソールの EventBridge の画面で 接続
を作成します。
接続設定は Datadog の場合は、以下のように認証タイプとして API キーを指定し、キー名にDD-API-KEY
、値に用意した API キーの値を入力します。
また以下の部分が今回のアップデートで追加された部分です。ここで先程作成した AWS KMS キーを選択します。
「接続」設定を作成すると、下記のようにステータスが表示されるのですが、このステータスはあまり鵜呑みにしないほうが良さそうでした。というのも、明らかに EventBridge が使用できないポリシーの AWS KMS キーでもステータスとしては認証済みとなるのを確認したからです。そもそもこの接続設定の時点では API エンドポイントの URL すら指定していないので、実際に API に接続してこのステータスを返しているわけではなさそうです。
API 送信先の作成
続いて、API の送信先を作成します。以下のような設定としました。接続タイプのところで、上記で作成した接続設定を指定します。送信先エンドポイントはこちらのチュートリアルを参考にしました。
EventBridge ルールの作成
最後に EventBridge のルールを作成します。今回は Amazon EC2 インスタンスのイベントを契機に EventBridge を起動させるのでイベントパターンは以下のようにします。
{
"source": ["aws.ec2"],
"detail-type": ["EC2 Instance State-change Notification"]
}
ターゲットの指定で「EventBridge API の宛先」を選択し、上記で作成した API の送信先を指定します。
ターゲット設定の追加設定で入力トランスフォーマーを選択します。入力トランスフォーマーの設定内容については、こちらのチュートリアルを参考にしてください。
動作確認
EventBridge ルールを作成したら、Amazon EC2 インスタンスを起動・停止してみます。すると以下のように正常にイベントが配信されたことが確認できました。
AWS KMS キーポリシーの検証方法
なお AWS KMS キーのポリシーの書き方が合っているか動作確認するために、私は下記 EventBridge の接続設定画面の 認証を解除
を使いました。
以下のような手順でキーポリシーによる動作の違いを確認できました。
- AWS KMS キーポリシーの変更:様々なポリシー設定を試験的に適用
- 認証の解除:EventBridge 接続設定画面から既存の認証情報を一旦解除
- 接続設定更新:接続設定を再度編集し、認証情報を再設定
- 結果確認:更新したキーポリシーの内容に応じて、イベント送信の成功/失敗を観察
まとめ
以上、Amazon EventBridge が API 送信先接続でカスタマーマネージドキー (CMK) をサポートするようになったというアップデートを試してみました。
CMK を使えるようになったことで、組織独自のセキュリティ要件がある場合に対応しやすくなったと思います。また CMK を使うと AWS CloudTrail 等での AWS KMS キーの使用状況の追跡もできるので、よりガバナンスを効かせやすくなるのではないでしょうか。
以上、とーちでした。