デフォルト暗号化された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でカスタマー管理型のキーを作成する
全てデフォルトの設定のままカスタマー管理型のキーを作成します。
キーの管理アクセス許可やキーの使用アクセス許可では何も指定せず、キーポリシーはデフォルトの設定となります。
S3バケットを暗号化する
上記で作成したカスタマー管理型のキーを用いてデフォルトの暗号化を有効にします。
EC2からS3バケットへのアクセスを試す
-
S3バケットにtest1.txtというファイルを置いてからファイル一覧を取得します。
aws s3 ls s3://[S3バケット名]
→成功 -
ホームディレクトリにファイルtest2.txtを新規作成し、CLIコマンドでS3バケットにコピーします。
aws s3 cp test2.txt s3://[S3バケット名]
→失敗
リソース名を隠しているのでわかりづらいですが、「EC2インスタンスにアタッチされたIAMロールは、カスタマー管理型のキーにおいてkms:GenerateDataKeyが許可されていません」というエラーメッセージが出ています。 -
S3バケットにあるファイルtest1.txtをホームディレクトリにコピーします。
aws s3 cp s3://[S3バケット名]/test1.txt /home/ec2-user/
→失敗
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バケット名]
→成功 -
ファイルtest2.txtをCLIコマンドでS3バケットにコピーします。
aws s3 cp test2.txt s3://[S3バケット名]
→成功 -
S3バケットにあるファイルtest1.txtをホームディレクトリにコピーします。
aws s3 cp s3://[S3バケット名]/test1.txt /home/ec2-user/
→成功
結論
S3のデフォルト暗号化に使ったCMKのキーポリシーで、EC2にアタッチしているIAMロールにKMSに対する権限を付与する必要がある。