暗号化オブジェクトのS3レプリケーション設定

GuardDutyの検出結果をS3に出力し、さらにその内容を
集約用のアカウントにレプリケーションする仕組みを構築したのだが、
その時にかなりハマった内容を備忘録として記録する。

やりたいこと

①送信元アカウントのGuardDutyの検出結果をS3に出力する設定をしたい。
②①の結果を集約用の別AWSアカウント上のS3バケットにレプリケーションしたい。

必要なもの

(A) 送信元アカウント S3バケット
(B) 送信元アカウント IAMロール(レプリケーション用)
(C) 送信元アカウント KMSキー
(D) 送信先アカウント S3バケット
(E) 送信先アカウント KMSキー

当初、(A)と(D)は別要件にてレプリケーション設定は施されていた。
SecurityHubの結果やVPCフローログなどを(A)に出力していて、
その内容は(D)に伝播されている事は確認できていた。

なので、GuardDutyの検出結果も(A)に出力できさえすれば、勝手に(D)に伝播されるもんだと
タカをくくっていたのが大きな間違いであった。

GuardDutyの検出結果は、出力設定の際にKMSキーのARNを求められる。
つまり、暗号化された形で(A)に出力されるのであった。
暗号化されているオブジェクトは待てど暮らせど(D)にレプリケーションされない。

原因①

S3バケットのレプリケーション設定の「暗号化」設定。
KMSで暗号化されたオブジェクトは、この設定が「ON」になっていないと
レプリケーションされない。

ところが、この設定をONにしただけでは、暗号化オブジェクトはレプリケーションされない。

原因②

送信元アカウントのKMSキーだけではなく、送信先アカウントにもKMSキーが必要。
さらに、(B)のIAMロールのカスタムポリシーに、
・送信元KMSのDecryptアクションの許可
・送信先KMSのEncryptアクションの許可
の両方が必要との事。これがなかなか想像できずにハマった。

原因③

送信先のKMSのキーポリシーには
・送信元のAWSアカウントIDからのアクセス許可
が必要

まとめ

上記を施し、ようやくGuardDutyの検出結果がレプリケーションできるようになった。
ここに至るまで、AWSサポートを利用したのだが、クロスアカウント案件なので、
どちらのアカウントに質問すべきかが不明瞭で、かなり手こずった。

結果的には送信元アカウント側にて回答を頂けたのだが、
暗号化オブジェクトのレプリケーション、なかなか手強い。