CMK暗号されたAMIをクロスアカウント共有してみた

暗号化されたEBSのAMIをアカウント共有する場合、AMIそのものの共有だけでなく、暗号鍵(CMK)も共有します。
2021.04.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

セキュリティ要件のために、Amazon EBSをAWS Key Management Service (AWS KMS) のカスタマーマスターキー(CMK)で暗号化することがあります。

そのようなEBSを含むEC2インスタンスをAMI経由でアカウント間共有する方法についてご紹介します。

ポイント

CMK暗号されたEBSを含むAMIをアカウント間共有する際のポイントは次の3点です。

1. AMIとEBSの関係

AMIはEBSボリュームのスナップショットとインスタンスを構成する管理情報を含む起動テンプレートのようなものです。

EBSがCMKで暗号化されている場合、同スナップショットも同じ鍵で暗号化されています。

この場合、AMIを共有するだけでなく、暗号化されたEBSスナップショットをどうやってクロスアカウント共有させるかがポイントとなります。

2. EBS スナップショットを再暗号化するタイミング

CMK 暗号された EBS は別の CMK で再暗号できます。

この操作は

  • スナップショットのコピー(AMI のコピー時)
  • スナップショットからボリュームの作成(AMI からの起動時)

などのタイミングで可能です。

3. AWS管理型CMKで暗号化されたEBSはアカウント共有できない

EBS が AWS管理のCMK で暗号化されている場合、キーポリシーをカスタマイズできないため、CMKをクロスアカウント共有できません。 そのため、カスタマー管理型CMKで再暗号してクロスアカウント共有します。

やってみる

以上を踏まえ、CMK で暗号化された EBS を含むEC2を別アカウントで起動する方法を紹介します。 EBS の暗号化には AWS 管理型 CMK を利用するものとします。

全体の流れ

  1. ソースアカウントでカスタマー管理型 CMK を作成
  2. ソースアカウントで AMI を作成
  3. ターゲットアカウントで AMI から EC2 起動

1. ソースアカウントでカスタマー管理型 CMK を作成

AMI を共有できるように、カスタマー管理型 CMK を作成します。

次に、ターゲットアカウントがこのCMKをAMIコピー時に利用できるように、キーポリシーに以下の様なポリシーを追加します。

{
    "Sid": "Allow use of the key with target account",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::TARGET-ACCOUNT-ID:role/Target-Account-Role"
    },
    "Action": [
        "kms:DescribeKey",
        "kms:CreateGrant",
        "kms:ReEncryptFrom"
    ],
    "Resource": "*"
}

2. ソースアカウントで AMI を作成

EC2 インスタンスを停止し、AMI を作成します。

次に、このAMIをコピーし、作成したカスタマー管理型CMKで再暗号化します。

AMIコピー完了後、AMIをターゲットアカウントと共有します。

後述のように、ターゲットアカウントで共有された AMI をコピーする場合、ボリューム作成も許可します。

3. ターゲットアカウントで AMI から EC2 起動

EC2 コンソールの AMI 一覧画面に移動します。

「プライベートイメージ」に、アカウント共有された AMI が表示されているはずです。

このAMIを選択し、EC2を起動します。

「ステップ 4: ストレージの追加」でEBSの暗号化鍵にAWS管理型CMK(デフォルトキー)を指定します。

(オプション)ソースアカウント内に閉じて暗号化

  • カスタマー管理型CMKの削除
  • カスタマー管理型CMKのキーポリシーの変更

が発生すると、将来的に共有されたAMIを利用できなくなる可能性があります。

ターゲットアカウントでEC2を起動後、AMIを取得しましょう。

共有されたAMIに対して直接AMIコピーを実行してCMKを変更する場合、一工夫必要です。

AMIコピーに伴うEBSの再暗号化は、新しいEBSボリュームを作ることに等しいため、AMIの共有時にボリューム作成を許可する必要があります。

このチェックを忘れると、AMI コピー時に "You do not have permission to access the storage of this ami" というエラーが発生します。

You do not need to share the Amazon EBS snapshots that an AMI references in order to share the AMI. Only the AMI itself needs to be shared; the system automatically provides the instance access to the referenced Amazon EBS snapshots for the launch. However, you do need to share any CMKs used to encrypt snapshots that the AMI references. For more information, see Share an Amazon EBS snapshot.

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sharingamis-explicit.html

(オプション)ターゲットアカウントのカスタマー管理型CMKで暗号化して共有

先の例では、EBSスナップショットをAWS管理型CMKからソースアカウントのカスタマー管理型CMKで再暗号しました。

再暗号時にターゲットアカウントのカスタマー管理型CMKを利用することもできます。

この方法を紹介します。

ターゲットアカウントでの操作

ターゲットアカウントでカスタマー管理型CMKを作成します。

ソースアカウントがこのCMKをAMIコピー時に利用できるように、キーポリシーを調整します。

{
    "Sid": "Allow use of the key with source account",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::SOURCE-ACCOUNT-ID:role/Source-Account-Role"
    },
    "Action": [
        "kms:DescribeKey",
        "kms:CreateGrant",
        "kms:ReEncryptFrom"
    ],
    "Resource": "*"
}

ソースアカウントでの操作

次に、ソースアカウントにおいて、AMI コピーでターゲットアカウントのカスタマー管理型CMKを指定して再暗号します。

このような鍵指定はコンソールからは行えないため、 CLI から行います。

# 呼び出しもとはソースアカウント
$ aws ec2 copy-image \
  --source-image-id ami-123 \
  --name encrypted-with-target-customer-cmk  \
  --source-region ap-northeast-1 \
  --encrypted \
  --kms-key-id arn:aws:kms:ap-northeast-1:TARGET-ACCOUNT-ID:alias/ebs-cmk
{
  "ImageId": "ami-456"
}

AMIコピー後の手順は同じです。

まとめ

CMK暗号されたEC2インスタンスをクロスアカウントコピーする際のポイントは以下です。

  • EC2インスタンスをAMI共有して別アカウントで起動
  • 暗号化されたEBSスナップショットの共有方法が肝
  • EBSスナップショットのコピー(AMIコピー)時、スナップショットからのボリューム作成(AMIからのインスタンス起動)時にCMKを変更可能
  • AWS管理型CMKは鍵を共有できないため、カスタマー管理型CMKで再暗号したAMIを共有

暗号化されたAMIをクロスリージョンコピーする際も、クロスアカウントと同じ考え方を適用できます。

それでは。

参考