アプリケーションサービス部の山本です。
中途社員のトレーナーをしています。どちらかというと教えられてばかりの毎日です。(助けてください!)
はじめに
EC2 インスタンスと EBS ボリュームの間でやり取りされるデータは暗号化されているのか?ふと気になって調べてみたので、その内容をまとめます。
結論から言うと、EBS 暗号化を有効にしていれば、保存時(at-rest)だけでなく転送時(in-transit)も暗号化されます。また、EBS 暗号化を有効にしていなくても、AWS インフラの物理レイヤーでの暗号化は自動的に適用されています。
EBS 暗号化を有効にしていない場合はどうなるのか
「EBS 暗号化を有効にしないと転送時のデータは丸裸なのか?」というと、実はそうでもありません。
AWS のドキュメントには以下の記載があります。
All data flowing across AWS Regions over the AWS global network is automatically encrypted at the physical layer before it leaves AWS secured facilities. All traffic between AZs is encrypted.
つまり、EBS 暗号化の有効/無効に関係なく、AWS の物理レイヤーではすべてのトラフィックが自動的に暗号化されています。AZ 間の通信も同様です。
ただし、これはあくまで AWS インフラの物理レイヤーでの保護です。EBS 暗号化を有効にすると、これに加えて Nitro ハードウェア上での AES-256 データキーによる暗号化レイヤーが追加されます。
整理すると以下のようになります。
伝送時(in-transit)の保護
EC2 と EBS の間でデータが移動する際の保護です。
| 保護レイヤー | 防御するリスク | EBS 暗号化なし | EBS 暗号化あり |
|---|---|---|---|
| 物理レイヤー暗号化(AWS インフラ自動適用) | データセンター間の物理回線の盗聴・傍受 | ✅ 自動適用 | ✅ 自動適用 |
| Nitro ハードウェア暗号化(AES-256 + KMS) | EC2 と EBS の間を流れるデータの中身の覗き見 | ❌ なし | ✅ 適用 |
保管時(at-rest)の保護
EBS ボリュームや S3 上のスナップショットに保存されたデータの保護です。
| 保護レイヤー | 防御するリスク | EBS 暗号化なし | EBS 暗号化あり |
|---|---|---|---|
| EBS ボリュームの暗号化(AES-256 + KMS) | ストレージ基盤への不正アクセスによるデータ漏洩 | ❌ なし | ✅ 適用 |
| スナップショットの暗号化 | スナップショット経由でのデータ漏洩・不正共有 | ❌ なし | ✅ 適用 |
それぞれのレイヤーが「何を守っているのか」を図にすると、以下のようになります。
graph LR
subgraph enc_on["EBS 暗号化あり"]
direction LR
A1["☁️ EC2<br/>インスタンス"]
subgraph layer1_on["Nitro 暗号化レイヤー(AES-256 + KMS)"]
subgraph layer2_on["物理レイヤー(AWS インフラ自動適用)"]
path_on["� 暗号化された通信経路"]
end
end
D1["💾 EBS<br/>ボリューム<br/>(暗号化済み)"]
A1 --> layer1_on --> D1
end
subgraph enc_off["EBS 暗号化なし"]
direction LR
A2["☁️ EC2<br/>インスタンス"]
subgraph layer2_off["物理レイヤー(AWS インフラ自動適用)"]
path_off["� 物理レイヤーのみで保護"]
end
D2["💾 EBS<br/>ボリューム<br/>(平文)"]
A2 --> layer2_off --> D2
end
ポイントは、物理レイヤーの暗号化と EBS 暗号化では守っているものが違うということです。
- 物理レイヤー暗号化(伝送時): AWS のデータセンター間を流れるデータが物理的に傍受されるリスクに対する保護。AWS が自動的に適用するもので、利用者側の設定は不要
- EBS 暗号化 — Nitro ハードウェア(伝送時): EC2 と EBS の間を流れるデータの中身を覗き見されるリスクに対する保護。物理レイヤーの暗号化とは別のレイヤーで、データそのものを暗号化する
- EBS 暗号化 — ボリューム/スナップショット(保管時): ストレージ基盤に保存されたデータへの不正アクセスに対する保護
いずれも EBS 暗号化を有効にすることで、伝送時・保管時の両方が一括で保護されます。物理レイヤーの暗号化だけでも一定の保護はありますが、コンプライアンス要件や多層防御の観点からは EBS 暗号化を有効にしておくのが望ましいです。
EBS 暗号化で保護される範囲
EBS ボリュームの暗号化を有効にすると、以下のすべてが暗号化の対象になります。
- ボリューム内の保存データ(data at rest)
- ボリュームとインスタンス間を移動するすべてのデータ(data in transit)
- そのボリュームから作成されたすべてのスナップショット
- それらのスナップショットから作成されたすべてのボリューム
つまり、EBS 暗号化を有効にするだけで、保存時も転送時もまとめて暗号化されるということです。転送時の暗号化のために別途設定が必要、ということはありません。
AWS のドキュメント(How Amazon EBS encryption works)にも、以下のように記載されています。
When you create an encrypted EBS volume and attach it to a supported instance type, the following types of data are encrypted:
- Data at rest inside the volume
- All data moving between the volume and the instance
- All snapshots created from the volume
- All volumes created from those snapshots
暗号化の仕組み
EBS 暗号化は AES-256 アルゴリズムを使用しており、鍵管理には AWS KMS が使われます。
大まかな流れは以下のとおりです(暗号化スナップショットからボリュームを作成する場合)。
- Amazon EC2 が AWS KMS に
GenerateDataKeyWithoutPlaintextリクエストを送信し、データキーを生成する - AWS KMS がデータキーを指定した KMS キーで暗号化し、Amazon EBS に送信してボリュームのメタデータとして保存する
- 暗号化ボリュームをインスタンスにアタッチすると、Amazon EC2 が AWS KMS に
CreateGrantリクエストを送信し、データキーの復号を要求する - AWS KMS が暗号化されたデータキーを復号し、平文のデータキーを Amazon EC2 に返却する
- Amazon EC2 が平文のデータキーを Nitro ハードウェア 上で使用し、ディスク I/O を暗号化する。平文のデータキーはボリュームがアタッチされている間、メモリ上に保持される
- ボリュームがデタッチされると、Amazon EBS は Nitro ハードウェアからデータキーを削除する
AWS のドキュメント(How Amazon EBS encryption works)では、以下のように説明されています。
- Amazon EC2 sends a GenerateDataKeyWithoutPlaintext request to AWS KMS, specifying the KMS key that you chose for volume encryption.
- If the volume is encrypted using the same KMS key as the snapshot, AWS KMS uses the same data key as the snapshot and encrypts it under that same KMS key. If the volume is encrypted using a different KMS key, AWS KMS generates a new data key and encrypts it under the KMS key that you specified. The encrypted data key is sent to Amazon EBS to be stored with the volume metadata.
- When you attach the encrypted volume to an instance, Amazon EC2 sends a CreateGrant request to AWS KMS so that it can decrypt the data key.
- AWS KMS decrypts the encrypted data key and sends the decrypted data key to Amazon EC2.
- Amazon EC2 uses the plaintext data key in the Nitro hardware to encrypt disk I/O to the volume. The plaintext data key persists in memory as long as the volume is attached to the instance.
デタッチ時の挙動については、同ドキュメントの「How unusable KMS keys affect data keys」セクションに以下の記載があります。
When the encrypted EBS volume is detached from the EC2 instance, Amazon EBS removes the data key from the Nitro hardware.
sequenceDiagram
participant EC2 as EC2 インスタンス
participant Nitro as Nitro ハードウェア
participant EBS as EBS ボリューム
participant KMS as AWS KMS
Note over EC2,KMS: ボリューム作成時
EC2->>KMS: データキー生成リクエスト
KMS-->>EBS: 暗号化されたデータキーを保存
Note over EC2,KMS: アタッチ時
EC2->>KMS: データキーの復号リクエスト
KMS-->>Nitro: 平文のデータキーを返却
Note over Nitro: データキーをメモリに保持
Note over EC2,KMS: I/O 処理
EC2->>Nitro: 読み書きリクエスト
Nitro->>EBS: AES-256 で暗号化して転送
EBS-->>Nitro: 暗号化データを返却
Nitro-->>EC2: 復号してデータを返却
Note over EC2,KMS: デタッチ時
EC2->>Nitro: デタッチ
Note over Nitro: データキーを削除
ポイントは、暗号化処理が EC2 インスタンスをホストするサーバー(Nitro ハードウェア)上で行われるという点です。これにより、インスタンスと EBS ストレージ間の経路上でもデータが保護されます。
暗号化に使う KMS キーの選択肢
EBS 暗号化に使う KMS キーは 2 種類から選べます。
| 種類 | エイリアス | 特徴 |
|---|---|---|
| AWS マネージドキー | aws/ebs |
デフォルトで自動作成される。追加費用なし |
| カスタマーマネージドキー | 任意 | キーの作成・ローテーション・無効化を自分で制御できる |
特別な要件がなければ AWS マネージドキー(aws/ebs)で十分ですが、キーポリシーの細かい制御やクロスアカウントでのスナップショット共有が必要な場合はカスタマーマネージドキーを使いましょう。
EBS encryption by default を有効にしよう
アカウントレベルで「EBS encryption by default」を有効にしておくと、そのリージョンで新規作成される EBS ボリュームが自動的に暗号化されます。既存のボリュームには影響しません。
マネジメントコンソールでの設定
- EC2 コンソールを開く
- ナビゲーションペインから Settings → Data protection and security タブを選択
- EBS encryption セクションで Manage をクリック
- Enable を選択し、デフォルトの KMS キーを確認
- Update EBS encryption をクリック

AWS CLI での設定
# 現在の設定を確認 aws ec2 get-ebs-encryption-by-default --region ap-northeast-1 # 有効化 aws ec2 enable-ebs-encryption-by-default --region ap-northeast-1
注意点として、この設定はリージョン単位です。必要なリージョンすべてで有効化してください。
KMS キーが無効化された場合の影響
KMS キーが無効化・削除された場合、すでにアタッチ済みのボリュームにはすぐには影響しません。暗号化処理にはデータキーが使われており、KMS キー自体はアタッチ時の復号にのみ必要だからです。
ただし、ボリュームをデタッチした後に再アタッチしようとすると失敗します。データキーの復号ができなくなるためです。KMS キーを再度有効にすれば復旧できます。
暗号化スナップショットのクロスリージョンコピーに関する注意点
EBS 暗号化を有効にすると、DR(災害復旧)やマルチリージョン構成でスナップショットを別リージョンにコピーする際にいくつか注意が必要です。
KMS キーはリージョンごとに異なる
KMS キーはリージョンに紐づいています。暗号化されたスナップショットを別リージョンにコピーする場合、以下の流れで処理されます。
- 元のリージョンの KMS キーでデータキーを復号する
- コピー先リージョンの KMS キーでデータキーを再暗号化する
つまり、元のリージョンの KMS キーに対する復号権限と、コピー先リージョンの KMS キーに対する暗号化権限の両方が必要です。元のリージョンの KMS キーが無効化・削除されていると、復号ができずコピー自体が失敗します。
コピー先リージョンにも適切な KMS キー(AWS マネージドキーまたはカスタマーマネージドキー)が存在し、IAM ポリシーで以下の権限が付与されている必要があります。
kms:DescribeKeykms:CreateGrantkms:GenerateDataKeykms:GenerateDataKeyWithoutPlaintextkms:ReEncryptkms:Decrypt
特に kms:Decrypt は元のリージョンの KMS キーに対して、kms:ReEncrypt や kms:GenerateDataKeyWithoutPlaintext はコピー先リージョンの KMS キーに対して必要です。
フルコピーになるためコストと時間が増加する
暗号化状態の変更(別の KMS キーでの再暗号化)を伴うスナップショットコピーは、増分コピーではなくフルコピーになります。クロスリージョンコピーも同様にフルコピーです。
これにより、以下の影響があります。
- ストレージコストの増加: フルコピー分のスナップショット料金が発生する
- データ転送料金: リージョン間のデータ転送料金が発生する
- コピー時間の増加: 増分コピーに比べて時間がかかる
暗号化していないスナップショットなら問題は少ない
暗号化していないスナップショットであれば、クロスリージョンコピー時に KMS キーの制約を気にする必要はありません。コピー先で暗号化を有効にすることも、しないことも自由に選べます。
DR 構成での実践的なポイント
暗号化スナップショットのクロスリージョンコピーを運用に組み込む場合は、以下を事前に準備しておきましょう。
- コピー先リージョンの KMS キーを事前に作成しておく(カスタマーマネージドキーを使う場合)
- コピーを実行する IAM ユーザー/ロール(DLM の場合はサービスロール)に必要な KMS 権限を付与しておく
- Data Lifecycle Manager(DLM)でクロスリージョンコピーを自動化する場合は、コピー先の KMS キー ARN を指定する
- フルコピーによるコスト増を見積もりに含める
まとめ
- EBS 暗号化を有効にしていなくても、AWS 物理レイヤーでの暗号化は自動適用されている
- EBS 暗号化を有効にすれば、さらに Nitro ハードウェア上での AES-256 暗号化が追加される(保存時・転送時とも)
- 「EBS encryption by default」を有効にしておけば、暗号化の設定忘れを防げる
- ただし、暗号化スナップショットのクロスリージョンコピーでは KMS キーの制約・フルコピーによるコスト増に注意が必要
- コンプライアンス要件と運用上の制約を天秤にかけて、暗号化の方針を決めよう
セキュリティ要件への対応やコンプライアンスの観点からも、特別な理由がない限り EBS 暗号化は有効にしておくことをおすすめします。
参考
- Amazon EBS encryption - Amazon EBS
- How Amazon EBS encryption works - Amazon EBS
- Enable Amazon EBS encryption by default - Amazon EBS
- Data protection in Amazon EC2 - Amazon EC2
- Copy an Amazon EBS snapshot - Amazon EBS
余談
夜の奥多摩の山中をヘッドライトつけて走ってきました。東京の夜景が綺麗でした。
