🔐

AWS クロスアカウントにおけるS3サーバサイド暗号化

2021/08/21に公開

どもども
最近は会社のブログで書いたり個人のブログで書いたりなにをどこで書くか悩みがちな@ken11です。AWS大好き芸人でやらしてもらってます(?)

今日はS3の暗号化をしたいとき、クロスアカウントだとどうするんだっけみたいな話をするんですが、せっかくなので初めてZenn使ってみることにしました。

※S3バケットの作成や、クロスアカウントでのアップロードダウンロードは既にできている前提です
※もし内容に間違いがございましたらご指摘いただけますと幸いです。速やかに修正いたします。

S3のサーバサイド暗号化

S3の暗号化方式って結局どうすればいいのか迷いがちなんですが、今日話すのはSSE-KMSの話です。
AWS KMSを使ったサーバサイド暗号化ですね。
暗号化の方式についてはこちらの記事が非常にわかりやすかったので、そもそもどれ選んだらいいんだっけって思ってる方は読むことをオススメします。

KMSでキーを作成する

まずバケット所有者のAWSアカウント(以下アカウントAとします)でAWS KMSのキーを作成していきます。

※キーマテリアルオリジンってなんぞやみたいな話はこちらの記事がわかりやすかったです

S3で使う場合、ここはまずデフォルトのままで問題ないかと思います。
続いてキー管理者は適切なアカウントを選択します。


その次のアクセス許可設定ですが、ここでは一旦なにも付与せず進めます
アクセス許可はあとでJSONで編集します。

これでキーの作成は完了です。

S3バケットに暗号化設定をする

それではアカウントAのS3バケットに暗号化設定をしていきます。

SSE-KMSを選択し、使用するKMSキーに先程作成したキーを選びます。

これでS3の暗号化設定が完了します。
アカウントAのコンソールから、ファイルをアップロード・ダウンロードする分にはこのままでも利用できるはずです。
しかし今回やりたいのはクロスアカウントアクセス。
ここからはクロスアカウントアクセスするための権限設定をしていきます。

IAMポリシーを設定する

今度は先程までとは別のAWSアカウント(以下アカウントBとします)の方でIAM role(あるいはユーザ)を設定していきます。
role自体はなんでもいいので適当に作ってもらえればいいんですが(既にあるものでももちろんOK)、アカウントAのKMSキーを利用するためのポリシーを作成し設定します。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Decrypt",
      "kms:GenerateDataKey"
    ],
    "Resource": [
      "arn:aws:kms:ap-northeast-1:************:key/***************"
    ]
  }
}

こんな感じで、最初に作成したKMSキーのARNをリソースに設定し、kms:Decryptkms:GenerateDataKeyのアクションを許可してあげます。

つまりアカウントBからアカウントAのKMSキーを利用できるように設定しておく形です。

KMSキーのポリシーを設定する

戻ってアカウントAのKMSキーにポリシーを設定していきます。

右のポリシービューへの切り替えをクリックすると、見慣れたJSON形式の編集画面になります。

ここのStatementに、以下のような項目を追加します。

       {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::************:user/hoge"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:ap-northeast-1:************:key/***************"
        },

Principalにはアクセスを許可したいrole or ユーザを指定します。今回で言えばアカウントBで先ほど作成したrole or ユーザです。
また、リソースにはKMSキーのARNを指定します。
IAM同様にkms:Decryptkms:GenerateDataKeyのアクションを許可してあげます。

これにより、アカウントBからS3にアップロード/ダウンロードする際に、アカウントAのKMSキーを使用することができるようになる=アカウントBからアカウントAの暗号化されたS3バケットとやりとりが可能になる、というわけです。

まとめ

KMSキーを作成する

S3バケットの暗号化を設定する

別アカウントのIAMポリシーを作成・設定する

最初に作成したKMSキーのポリシーを設定する

大まかな流れとしてはこんな感じでしょうか。
非暗号化S3バケットのクロスアカウントアクセスもそうですが、クロスアカウントで気をつけなければならないのは、リソースに対してアクセスする/させるという双方のポリシー設定を適切に行うことが重要ですね。
ちなみに必要なKMSキーにアクセスできないなどの理由で暗号化ができない場合も、エラーメッセージは単に「Access Denied」になるので、気づかないと沼ります。

Discussion