暗号化されたEBSスナップショットを持つAMIを作成し他のアカウントやリージョンで共有する方法
Amazon マシンイメージ (AMI) はお客様のAWS環境にインスタンス(仮想サーバ)を起動させる為に必要な情報を提供します。お客様はパブリックAMIからインスタンスを起動し, セキュリティやビネス要求に合わせたカスタマイズを行い、カスタムAMIとして保存することができます。最近リリースされた、暗号化されたAmazon Elastic Block Store (Amazon EBS) スナップショットのアカウント間コピー機能により、AWS Key Management Service (KMS)を利用した暗号化されたスナップショットを利用したAMIの作成や、アカウントやリージョンにまたがって AMIを公開することができる様になりました。KMSを利用して暗号化されたスナップショットを持つAMIを作成し、アカウントやリージョンに跨ってAMIを共有することができるように なりました。これにより、必要なハードニングと設定を行ったAMIを作り、カスタムAMIに基づきグローバルに一貫したインスタンスを起動することができます。また、データを保護するための利用者自身によるセキュリティやコンプライアンス要求に従いながら、分散したワークロードによって、パフォーマンスと可用性を高めることができます。
このブログ記事では、パブリックAMIから暗号化されたカスタムAMIをつくり、暗号化されたEBSスナップショットによるカスタムAMIをアカウントやリージョンにまたがって共有するプロセスをウォークスルーします。このアプローチにより、同一の基礎となる暗号化されたAMIを利用して、複数アカウントでグローバルにAmazon EC2インスタンスを起動することができます。
Note: この記事は、Windows AMIやbillingProduct codeを持つAWS マーケットプレイスからの他のAMIには適用できません。
ソリューション概要
次の図は、このブログ記事で議論するソリューションを表現しています。
- ソースアカウントにて, ソースリージョンのパブリックAMIからEBS-backendのカスタムAMIを作成します。
- 暗号化されたEBSスナップショットをカスタムAMIに追加し、ターゲットアカウントにKMS暗号化鍵へのアクセス権を与えます。
- 暗号化されたスナップショットをターゲットアカウントに共有します。
- スナップショットをターゲットリージョンへコピーし、ターゲットリージョンにあるターゲットアカウントのKMS暗号化鍵で再暗号化します。
- ターゲットアカウントでターゲットリージョンにある暗号化されたEBSスナップショットを利用してAMIを作成します。
前提条件
このウォークスルーでは、2つのAWSアカウントが必要です。
- カスタムAMIをつくり、関連するEBSスナップショットを暗号化するソースアカウント
- 共有された暗号化スナップショットを持つカスタムAMIを使ってインスタンスを起動するターゲットアカウント
この例では、架空のアカウントIDである111111111111 と999999999999をそれぞれソースアカウント、ターゲットアカウントとします。この記事を読み進める際には、それらのアカウントIDを自身の環境に合う様に読み替えてください。加えて、ソースアカウントのソースリージョンにて、KMS customer master key (CMK) を作成し、同じ様にターゲットアカウントのターゲットリージョンにて、CMKを作成してください。ターゲットアカウント向けのCMKを作成する際には、カスタムAMIを利用してEC2インスタンスを起動させるリージョンを選択してください。KMSの鍵は、作成されたAWSリージョンの外に転送されるは無いことに注意が必要です。分かり易くする為に、ここでは、2つのKSM CMKを作成しました。アカウント111111111111 のus-east-1にcmkSourceを作成し、アカウント999999999999 のeu-west-1にcmkTargetを作成しています。
Note: デフォルトEBS CMKで暗号化されたスナップショットは別のアカウントに共有することはできません。サービスデフォルトCMKで暗号化されたリソースは同じアカウントでのみ共有できます。デフォルトEBS CMK (キーエリアスはaws/ebs)による暗号化されたスナップショットから始める場合は、スナップショットをコピーし、KMSで作成したカスタムCMKにて再暗号化してください。外部のアカウントIDがアクセスできるようにカスタムCMKの鍵ポリシーを変更することが出来ます。
ソースアカウントのIAMユーザやロールはカスタムAMIを作る権限とEC2 ModifySnapshotAttribute操作権限が必要となります。
上記に加え、このIAMユーザやロールは、ソースアカウントのKMS CMK(cmkSource)に対してKMS DescribeKey、CreateGrant,、GenerateDataKey、ReEncypt 操作権限も必要となります、
ソースアカウントのIAMユーザ、ロールのポリシー
次のJSONドキュメントはIAMユーザ、ロールが必要となる権限の例です。このIAMポリシー内の権限が有効になるように、cmkSourceの鍵ポリシードキュメントはソースアカウントに権限委譲しなくてはなりません。この権限委譲は、KMS鍵を作成した際に発生します。cmkSourceに対する鍵ポリシーを変更している場合には、変更を戻し、そのアカウントへの委譲を再び有効にしてください。詳細は、KMS Developer Guideを確認してください。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey*" ], "Resource": [ "arn:aws:kms:us-east-1:111111111111:key/Key-ID of cmkSource" ] }, { "Effect": "Allow", "Action": [ "kms:ListKeys", "kms:ListAliases" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "ec2:RunInstances", "ec2:StartInstances", "ec2:CreateImage", "ec2:CopyImage", "ec2:ModifySnapshotAttribute", "ec2:CreateSecurityGroup", "ec2:AuthorizeSecurityGroupIngress", "ec2:Describe*" ], "Resource": [ "*" ] } ] }
ターゲットアカウントでのIAMユーザやロールはAMIを作成する権限が必要です。共有されたAMIの暗号化されたスナップショットを復号化する為に、ターゲットアカウントでのIAMユーザやロールは、ソースアカウントのcmkSource鍵に対してKMS DescribeKey、CreateGrant、およびDecryptの権限が必要となります。加えて、ターゲットアカウントによって管理されているKMS鍵を使った新しいAMIスナップショットを作成する為に、ターゲットアカウントのcmkTarget鍵に対してKMS CreateGrant、 Encrypt、 Decrypt、 DescribeKey、GenerateDataKeyWithoutPlaintext 操作を実行できなくてはなりません。
次の手順では、cmkSourceをスナップショットの復号化に利用する権限付与を示します。ターゲットアカウントIDをcmkSource鍵ポリシーに追加する必要があります。
- 下の画像の様に、IAMコンソールから、左ペインの暗号鍵をクリックし、ソースアカウントのCMKであるcmkSourceをクリックしてください。
- 外部アカウントのサブセクションを確認し、Add External Accountをクリックしてください。フォームにターゲットアカウントIDの999999999999を入力してください。
アカウント間によるカスタム暗号化鍵の共有に関するさらなる情報は、「Share Custom Encryption Keys More Securely Between Accounts by Using AWS Key Management Service.」を参照して下さい。
ターゲットアカウントのIAMユーザ、ロールのポリシー
次のJSONドキュメントはIAMユーザ、ロールが必要となる権限の例です。このIAMポリシーのKMS権限が有効になるよう、cmkSource、cmkTargetに対する鍵ポリシードキュメントは、アカウントに権限委譲しなくてはなりません。この権限委譲は、デフォルトでKMS鍵を作成する際に発生します。cmkSourceまたは、cmkTargetに対する鍵ポリシーを変更している場合には、変更を戻し、そのアカウントへの委譲を再び有効にしてください。詳細は、KMS Developer Guideを確認してください。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:CreateGrant", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:111111111111:key/key-id of cmkSource" ] }, { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:Encrypt", "kms:Decrypt", "kms:DescribeKey", "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": [ "arn:aws:kms:eu-west-1:999999999999:key/key-id of cmkTarget" ] }, { "Effect": "Allow", "Action": [ "kms:ListKeys", "kms:ListAliases" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "ec2:ModifySnapshotAttribute", "ec2:CreateImage", "ec2:CopyImage", "ec2:RegisterImage", "ec2:CopySnapshot", "ec2:Describe*" ], "Resource": [ "*" ] } ] }
ソリューションのデプロイ
Step 1: パブリックAMIからEBS-backendのカスタムAMIの作成
パブリックAMIからEBS-backendのカスタムAMIの作成:
- 作成したいカスタムAMIに類似したパブリックEBS-backend AMIからEC2インスタンスを作成します。次のスクリーンショットで示している通り、このウォークスルーでは、 Amazon Linux AMI (HVM)を利用しています。詳しい情報については、Launching an Instanceを確認してください。
- ここで、EC2インスタンスに接続したり、ソフトウェアやアプリケーションを導入してインスタンスをカスタマイズしたり、インスタンスをハードニ ングしたり、カスタムデータをコピーしたりできます。インスタンスのカスタマイズ後、EC2コンソールからAMIを作成します。左ペインからInstancesをクリックし、カスタマイズしたEC2インスタンスを選択します。Actionsをクリックし、設定情報をカスタムAMIとして保存する為に、Create Imageを選択します。
EBS-backend AMIの作り方に関する詳しい概要は、Creating an Amazon EBS-Backed Linux AMI と Creating an Amazon EBS-Backed Windows AMI.を確認してください。
Step 2: 暗号化スナップショットによるカスタムAMIの作成
暗号化されたbootボリュームを利用したカスタムAMIの作成:
- EC2コンソールより、左ペインからAMIsをクリックし、Step1で作成したカスタムAMIを選択します、Actionsをクリックし、Copy AMIを選択します。これにより、暗号化されていないスナップショットによるAMIから、暗号化されたスナップショットによるAMIを作成します。
- 次のスクリーンショットでは、コピー先のリージョンとして、US East(N.Virginia)、スナップショットの暗号化に使うソースアカウントのKMS マスター鍵にcmkSourceを選択しています。詳しい情報については、AMIs with Encrypted Snapshotsを確認して下さい。
次のスクリーンショットの様に、暗号化スナップショットを持つカスタムAMIが作成されます。
Step 3: 暗号化スナップショッのターゲットアカウントへの共有
暗号化スナップショットによるAMIをアカウント間で直接共有することは出来ません。代わりに、AMIに紐づく化暗号化スナップショットを個別に他アカウントにコピーし、ターゲットアカウントで再作成しなくてはなりません。これは、暗号化されたスナップショットは潜在的に異なるKMSマスター鍵により暗号化され、各スナップショットのcopy/decrypt/reencrypt操作は独立して行われる為です。
暗号化されたスナップショットをターゲットアカウントに共有する:
- EC2コンソールより、左ペインのSnapshotsをクリックし、Owned By Meを選択します。AMI IDを使い(次のスクリーンショッの様に)、Step2で作成したカスタムAMIに関連付いたEBSスナップショットを検索します。
- Actionsをクリックし、Modify Permissionsを選択します。AWS Account Number boxにターゲットアカウントのIDを入力します。
Step 4: ターゲットリージョンへのスナップショッのコピーとターゲットリージョンにおけるターゲットアカウント KMS暗号化鍵による再暗号化
ターゲットリージョンへのスナップショットのコピーとターゲットリージョンにおけるターゲットアカウント KMS暗号化鍵による再暗号化
- ターゲットAWSアカウントにサインインし、EC2コンソールのSnapshotsタブから、Privat Snapshotsを選択します。スクリーンショットで示されている様に、ターゲットアカウントからコピーされたスナップショットをスナップショットIDを用いて特定します。
- Actionsをクリックし、ドロップダウンリストからCopyを選択します。次のスクリーンショットの様に、宛先リージョンにEU (Ireland) , ターゲットアカウントのマスター鍵にcmkTargetを選択します。ソースアカウントのKMS CMKであるcmkSourceから復号化し、ターゲットアカウントのKMS CMKであるcmkTargetで暗号化します。これにより、cmkSrouceの所有者が何らかの理由で鍵をrevokeした際に、ターゲットアカウントが作成したEBSボリュームへアクセス出来なくなる事を防ぎます。
Step 5: ターゲットリージョンにおける暗号化されたEBSスナップショットを使用したAMIの作成
ターゲットリージョンにおける暗号化されたEBSスナップショットを使用した、ターゲットアカウントでのAMIの作成 :
- コンソールのリージョンをターゲットリージョンに変更します。このソリューションでは、Step4でEU(Ireland)リージョンにEBSスナップショットをコピーしています。
- EC2コンソールからSnapshots tabをクリックし、Owned By Meをクリックします。スクリーンショットで示されている様に、スナップショットをSnapshot IDを用いて特定します。
- EBSスナップショットを選択し、Actionsをクリック後、Create Imageを選択します。
- Step1でカスタムAMIを作成するときに利用したパブリックAMIと同じ仮想化タイプを選びます。
- 左ペインのAMIsをクリックし、作成した暗号化されたEBSスナップショットによるカスタムAMIを特定します。
これで、ソースアカウントのus-east-1からコピーしたカスタムAMIを使って、ターゲットアカウントのeu-west-1にEC2インスタンスを起動できる様になりました。カスタムAMIは、ソースアカウントで行ったカスマイズ済みの構成を利用し、全てのデータはエンドツーエンドで暗号化されています。
まとめ
このブログ記事では、暗号化スナップショットを持つAMIをアカウント及びリージョンをまたがってコピーする方法を示しましました。
これによって、分散されたワークロードによる俊敏性と可用性を向上させながら、利用者自身のセキュリティやコンプライアンス要求に従った、承認されたAMIに基づいてグローバルで一貫性のあるインスタンスの起動を行える様にします。さらなる学習に為には、次のドキュメントも確認して下さい。
この記事に対してコメントについては、Comments欄から投稿下さい。質問、実装時における問題がある場合は、EC2フォーラムに投稿をお願いします。
- Eugene
原文:How to Create a Custom AMI with Encrypted Amazon EBS Snapshots and Share It with Other Accounts and Regions(翻訳:SA 浅野)
コメント