0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

デフォルト暗号化したS3バケットのファイルをコピーできなかった

Last updated at Posted at 2022-05-01

デフォルト暗号化されたS3バケットに対してEC2インスタンスからファイルをコピーしたり、S3バケットにあるファイルを取得をしようとしたりとするとエラーになったので、対応策を記載します。

前提条件

  • EC2はAmazon Linux2
  • EC2にはS3バケットへのフルアクセス権限を許可するIAMロールをアタッチする
  • S3バケットはデフォルト暗号化を有効にする
  • デフォルトの暗号化はSSE-KMSを利用する
  • KMSキーは新規作成したデフォルト設定のCMKを利用する

検証環境で問題を再現させる

S3バケットを新規作成する

デフォルト設定でS3バケットを新規作成します。

EC2用IAMロールを作成する

今回マウントするS3バケットに対するS3のフルアクセス権限を持ったIAMポリシーを作成し、IAMロールにアタッチします。
IAMポリシーは以下のようにしました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::[S3バケット名]",
                "arn:aws:s3:::[S3バケット名]/*"
            ]
        }
    ]
}

EC2を新規作成する

一般的な手順でEC2を構築します。
構築時に上記で作成したIAMロールを選択します。

KMSでカスタマー管理型のキーを作成する

全てデフォルトの設定のままカスタマー管理型のキーを作成します。
キーの管理アクセス許可やキーの使用アクセス許可では何も指定せず、キーポリシーはデフォルトの設定となります。

作成したキーの暗号化設定は以下の通りです。
1.png

S3バケットを暗号化する

上記で作成したカスタマー管理型のキーを用いてデフォルトの暗号化を有効にします。
2.png

EC2からS3バケットへのアクセスを試す

  • S3バケットにtest1.txtというファイルを置いてからファイル一覧を取得します。
    aws s3 ls s3://[S3バケット名]
    3.png
    →成功

  • ホームディレクトリにファイルtest2.txtを新規作成し、CLIコマンドでS3バケットにコピーします。
    aws s3 cp test2.txt s3://[S3バケット名]
    4.png
    →失敗
    リソース名を隠しているのでわかりづらいですが、「EC2インスタンスにアタッチされたIAMロールは、カスタマー管理型のキーにおいてkms:GenerateDataKeyが許可されていません」というエラーメッセージが出ています。

  • S3バケットにあるファイルtest1.txtをホームディレクトリにコピーします。
    aws s3 cp s3://[S3バケット名]/test1.txt /home/ec2-user/
    5.png
    →失敗

KMSのキーポリシーを編集する

どうやらEC2にアタッチしたIAMロールが、KMSのキーポリシーでアクションを許可されていないのが原因のようです。
キーポリシーはデフォルトのままになっていますので、KMSのキーポリシーを編集してIAMロールにKMSのフルアクセス権限を付与してみます。
※今回は検証のためにざっくりフルアクセス権限を付与しますが、実際利用する場合は権限を制限します。

{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[AWSアカウントID]:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[AWSアカウントID]:role/[IAMロール名]"
            },
            "Action": "kms:*",
            "Resource": "*"
        }
    ]
}

動作確認

先ほどのコマンドをもう一度試してみます。

  • S3バケットにtest1.txtというファイルを置いてからファイル一覧を取得します。
    aws s3 ls s3://[S3バケット名]
    8.png
    →成功

  • ファイルtest2.txtをCLIコマンドでS3バケットにコピーします。
    aws s3 cp test2.txt s3://[S3バケット名]
    6.png
    →成功

  • S3バケットにあるファイルtest1.txtをホームディレクトリにコピーします。
    aws s3 cp s3://[S3バケット名]/test1.txt /home/ec2-user/
    7.png
    →成功

結論

S3のデフォルト暗号化に使ったCMKのキーポリシーで、EC2にアタッチしているIAMロールにKMSに対する権限を付与する必要がある。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?