暗号化(KMS / CloudHSM / Secrets Manager / ACM)
データを暗号化するには「鍵」が必要で、鍵やパスワード、証明書をどう安全に管理するかが設計の要になります。SAA では、保管中のデータの暗号化(AWS KMS)、転送中のデータの暗号化(ACM の証明書と TLS)、パスワードなどの秘密情報の管理(Secrets Manager)を、要件に合わせて選ぶ問題が出ます。
ひとことで言うと: KMS は「鍵の貸金庫」、CloudHSM は「自分専用の金庫室」、Secrets Manager は「パスワードの保管庫(定期的に自動で付け替えてくれる)」、ACM は「Web サイトの身分証明書の発行窓口」です。
たとえるなら、KMS では大事な親鍵は貸金庫から一度も出さず、実際の荷物は親鍵で封をした小さな鍵(データキー)でしまいます。
このページで押さえる論点
保管中と転送中の暗号化
暗号化は、データを鍵がないと読めない形に変えることです。守る場面によって 2 つに分けます。
| 種類 | 守るもの | AWS での主な手段 |
|---|---|---|
| 保管中のデータの暗号化(at rest) | ディスクや S3 に保存されたデータ。盗まれたり誤って公開されたりしても読めないようにする | AWS KMS の鍵を使った S3・EBS・RDS・DynamoDB などの暗号化、CloudHSM |
| 転送中のデータの暗号化(in transit) | ネットワークを流れるデータ。途中で盗み見られないようにする | TLS(HTTPS)。証明書は ACM で発行して ELB・CloudFront・API Gateway に付ける。VPN も通信を暗号化する |
保管中の暗号化には、AWS のサービス側で暗号化するサーバー側の暗号化と、アプリがデータを暗号化してから AWS に送るクライアント側の暗号化があります。「AWS に届く前に暗号化しておく」「AWS 側では平文を一切扱わせない」という要件ならクライアント側の暗号化を選びます。
暗号化の責任は 責任共有モデル(AWS と利用者の責任の分担)で利用者側にあります。どのデータを暗号化するか、鍵を誰に使わせるかは利用者が決めます。
AWS KMS
AWS KMS(Key Management Service)は、暗号鍵を作って保管し、使える人を管理するマネージドサービスです。KMS の鍵(KMS キー)は、AWS が管理する HSM(ハードウェアセキュリティモジュール = 鍵を安全に保管・計算する専用の機器)の中にあり、平文のまま外へ持ち出せません。すべての利用は CloudTrail に記録されるので、「いつ誰が鍵を使ったか」を監査できます。
キーの種類
| 種類 | 作る人・管理する人 | ポイント |
|---|---|---|
| カスタマーマネージドキー | 利用者が作り、管理する | キーポリシー(誰が使えるか)、ローテーション、無効化・削除を自分で決められる。別アカウントと共有できる |
| AWS マネージドキー | AWS のサービス(S3 や EBS など)が利用者のアカウントに自動で作る(aws/s3 など) | キーポリシーは変更できず、ローテーションは AWS が行う。細かい制御や他アカウントとの共有が必要なら使えない |
| AWS 所有のキー | AWS がサービス内部で使う | 利用者のアカウントには表示されず、利用者は管理も監査もできない |
キーポリシー
KMS キーには必ずキーポリシー(リソースベースポリシーの一種)が付きます。キーを使えるかどうかは、まずキーポリシーで決まります。キーポリシーでアカウントに権限を委ねている場合に限り、IAM ポリシーでも使える人を追加できます。キーを管理する人(削除や設定変更ができる)とキーを使う人(暗号化・復号ができる)を分けて書けるので、「管理者でもデータは復号できない」といった職務分離ができます。別アカウントに使わせるときは、キーポリシーで相手のアカウントを許可し、相手側でも IAM ポリシーで許可します(両側での許可)。
エンベロープ暗号化
KMS の Encrypt API に直接渡せるデータは、対称キーで最大 4,096 バイト(4 KB)までです。大きなデータはエンベロープ暗号化で暗号化します。KMS キーからデータキー(実際にデータを暗号化する使い捨ての鍵)を発行してもらい、データキーでデータを暗号化し、データキー自体は KMS キーで暗号化して一緒に保存します。S3 や EBS の暗号化も裏側ではこの仕組みです。
エンベロープ暗号化で大きなファイルを暗号化する
※簡略化しています: データキーの発行は GenerateDataKey という API です。S3 などのサービスでサーバー側の暗号化を使う場合は、この流れをサービスが自動で行うので、アプリは意識しません。
ローテーション・削除・マルチリージョンキー
| 機能 | 内容 |
|---|---|
| 自動ローテーション | カスタマーマネージドキー(KMS が生成した鍵素材を持つ対称キー)で有効にできる。間隔は既定で 365 日で、90〜2,560 日の範囲で指定できる。キー ID は変わらず、古い鍵素材も保持されるので、以前に暗号化したデータもそのまま復号できる。インポートした鍵素材・非対称キーは自動ローテーションできない |
| 削除 | すぐには消えず、7〜30 日(既定 30 日)の待機期間の後に削除される。待機中は使えなくなり、取り消せる。削除すると、そのキーで暗号化したデータは復号できなくなるので、迷ったら「無効化」を選ぶ |
| マルチリージョンキー | 同じキー ID と鍵素材を持つキーを複数のリージョンに置ける。あるリージョンで暗号化したデータを、別のリージョンでそのまま復号できる(災害対策やリージョンをまたぐアプリ向け)。通常の KMS キーはリージョンの中でしか使えない |
| 鍵素材のインポート(BYOK) | 自社で作った鍵素材を KMS キーに取り込める。鍵の生成を自社で行う必要がある場合に使う |
S3・EBS・RDS の暗号化の選択肢
S3 のサーバー側の暗号化は、鍵の管理方法で次のように分かれます。現在は、すべての新しいオブジェクトが既定で SSE-S3 で暗号化されます。
| 方式 | 鍵の管理 | 選ぶ場面 |
|---|---|---|
| SSE-S3 | S3 が管理する鍵。利用者は何もしなくてよい | 特別な要件がない場合(既定) |
| SSE-KMS | KMS キー(AWS マネージドキーまたはカスタマーマネージドキー) | 「鍵の使用を CloudTrail で監査したい」「キーポリシーで復号できる人を制限したい」「鍵のローテーションを自分で管理したい」 |
| DSSE-KMS | KMS キーで 2 層の暗号化を行う | 規制などで 2 層の暗号化が求められる場合 |
| SSE-C | 利用者が用意した鍵をリクエストごとに渡す。AWS は鍵を保存しない | 「鍵は自社で持ち、AWS に保存させない」がサーバー側で暗号化してほしい場合 |
SSE-KMS はオブジェクトの読み書きのたびに KMS を呼ぶため、大量のリクエストがあると KMS の API のリクエスト数の上限(クォータ)や料金が問題になります。S3 バケットキーを有効にすると、KMS への呼び出しを減らせます。
EBS と RDS は、ボリュームや DB インスタンスを作るときに KMS キーで暗号化します。暗号化されていない既存の RDS インスタンスや EBS ボリュームは、後から暗号化を有効にできません。スナップショットを作り、暗号化を指定してスナップショットをコピーし、そこから復元します。暗号化されたスナップショットを別のリージョンにコピーするときは、コピー先のリージョンの KMS キーを指定します。
AWS CloudHSM
AWS CloudHSM は、利用者専用(シングルテナント)の HSM を AWS 上で使えるサービスです。FIPS 140-2 レベル 3 または FIPS 140-3 レベル 3 の検証を受けた機器で、鍵は利用者だけが管理し、AWS からは見えません。
| 観点 | AWS KMS | AWS CloudHSM |
|---|---|---|
| HSM の利用形態 | AWS が管理する HSM を複数の利用者で共有(マルチテナント) | 利用者専用の HSM(シングルテナント) |
| 鍵の管理 | AWS が運用し、利用者はキーポリシーで制御 | 利用者が鍵とユーザーを完全に管理。AWS は鍵にアクセスできない |
| AWS サービスとの統合 | S3・EBS・RDS など多数と統合済み | そのままでは統合されない。KMS のカスタムキーストアとして使えば、KMS 経由で統合できる |
| 使える API | KMS の API | PKCS #11・JCE・CNG/KSP など業界標準の API |
| 可用性 | AWS が管理 | 利用者がクラスターに複数の HSM(別々の AZ)を置いて冗長化する |
問題文に「シングルテナント」「専用のハードウェア」「FIPS 140 レベル 3」「鍵を AWS に管理させない」とあれば CloudHSM を選びます。それ以外の一般的な暗号化は KMS が第一候補です。
Secrets Manager と Parameter Store
DB のパスワードや外部サービスの API キーを、アプリのコードや設定ファイルに直接書くと、ソースコードの共有や流出で漏れてしまいます。そこで秘密情報は専用のサービスに保管し、アプリは実行時に API で取り出します。
| 観点 | AWS Secrets Manager | Systems Manager Parameter Store |
|---|---|---|
| 主な用途 | DB の認証情報・API キーなどの秘密情報 | 設定値全般。SecureString 型で秘密情報も KMS で暗号化して保存できる |
| 自動ローテーション | あり。RDS などはマネージドローテーション、それ以外は Lambda 関数で定期的にパスワードを変更し、DB 側とシークレットの両方を更新する | 組み込みの自動ローテーションはない |
| 暗号化 | KMS で暗号化 | SecureString は KMS で暗号化 |
| 複数リージョン | シークレットを別のリージョンにレプリケートできる | — |
| 削除 | 7〜30 日(既定 30 日)の復旧期間の後に削除 | — |
| 料金の考え方 | シークレットの数と API 呼び出し数に応じて課金 | 標準パラメータは追加料金なし |
「パスワードを定期的に自動で変更したい」なら Secrets Manager、「ローテーションは不要で、設定値を低コストで一元管理したい」なら Parameter Store です。EC2 や Lambda からは、IAM ロールで取り出す権限を渡します。
ACM(AWS Certificate Manager)
ACM は、HTTPS 通信に使う SSL/TLS 証明書(Web サイトの身分証明書)を発行・管理するサービスです。ACM が発行するパブリック証明書は、ELB・CloudFront・API Gateway などの統合されたサービスに付けると、期限が切れる前に自動で更新されます。証明書を発行するときは、ドメインを持っていることを DNS(Route 53 などにレコードを追加)かメールで確認します。DNS で確認しておくと、更新も自動で進みます。
- リージョンの注意点: 証明書はリージョンごとのリソースです。ALB などに付ける証明書は、そのロードバランサーと同じリージョンで発行します。CloudFront に付ける証明書は、米国東部(バージニア北部)リージョン(us-east-1)で発行(またはインポート)する必要があります。
- インポートした証明書: 他の認証局で取得した証明書も ACM にインポートできますが、自動更新はされません。期限の管理は利用者が行います。
- TLS の終端: ALB に証明書を付けると、ALB で HTTPS を復号(TLS 終端)し、背後の EC2 の負荷を減らせます。背後まで暗号化が必要なら、ALB からターゲットへの通信も HTTPS にします。
どのサービスを選ぶか
ここまでのサービスを、「何を守りたいか」から選べるように整理します。
質問に答えて鍵・秘密情報の管理サービスを選ぶ
守りたいものを思い浮かべて「はい / いいえ」で答えてください。答えた経路が上から順に表示されます。
※簡略化しています: 実際には KMS のカスタムキーストアで CloudHSM を使うなど、複数のサービスを組み合わせることもあります。証明書の分岐は、パブリック証明書を ELB・CloudFront などで使う場合を想定しています。
問題文のキーワード → 選ぶべき答え
| 問題文の言い回し | 答えと理由 |
|---|---|
| 「保管中のデータを暗号化し、鍵の使用を監査したい」 | SSE-KMS(カスタマーマネージドキー)。キーの利用が CloudTrail に記録される |
| 「鍵を年に 1 回自動でローテーション」 | KMS のカスタマーマネージドキーの自動ローテーション |
| 「シングルテナントの HSM」「FIPS 140 レベル 3」「鍵を完全に自社で管理」 | AWS CloudHSM |
| 「DB のパスワードを自動でローテーション」「コードに認証情報を書かない」 | AWS Secrets Manager |
| 「設定値を一元管理。ローテーション不要で低コスト」 | Systems Manager Parameter Store(SecureString) |
| 「HTTPS 化。証明書の更新の手間をなくしたい」 | ACM の証明書を ALB・CloudFront に付ける(自動更新) |
| 「CloudFront で独自ドメインの HTTPS」 | us-east-1 で ACM の証明書を発行する |
| 「暗号化されていない RDS を暗号化したい」 | スナップショット → 暗号化してコピー → 復元 |
| 「別リージョンでも同じ鍵で復号したい(DR)」 | KMS のマルチリージョンキー |
| 「SSE-KMS で KMS のリクエスト数の上限に達する・コストを下げたい」 | S3 バケットキーを有効にする |
| 「AWS に届く前にデータを暗号化」 | クライアント側の暗号化 |
引っかけポイント
- 「AWS マネージドキーのキーポリシーを編集して、別アカウントに使わせる」→ ✕。AWS マネージドキーのキーポリシーは変更できない。共有するならカスタマーマネージドキー
- 「KMS キーをすぐ削除できる」→ ✕。7〜30 日の待機期間がある。削除すると暗号化したデータは復号できなくなる
- 「既存の暗号化されていない RDS インスタンスで、設定から暗号化を有効にする」→ ✕。スナップショットを暗号化してコピーし、復元する
- 「CloudFront 用の証明書を、オリジンと同じ東京リージョンで発行する」→ ✕。CloudFront は us-east-1 の証明書を使う
- 「Parameter Store でパスワードの自動ローテーション」→ ✕。自動ローテーションは Secrets Manager
- 「インポートした証明書も ACM が自動更新する」→ ✕。自動更新されるのは ACM が発行した証明書
- 「CloudHSM を使えば S3 の暗号化にそのまま使える」→ ✕。AWS サービスと統合するには KMS のカスタムキーストアを経由する
まとめ: SAA 試験で押さえるポイント
- 保管中の暗号化は KMS、転送中の暗号化は TLS(ACM の証明書)が基本
- KMS キーはキーポリシーで使える人を決める。細かい制御・共有・監査が必要ならカスタマーマネージドキー
- 大きなデータはエンベロープ暗号化(データキーで暗号化し、データキーを KMS キーで暗号化)。KMS キー自体は外に出ない
- KMS キーの削除は 7〜30 日の待機期間つき。自動ローテーションの既定は 365 日
- 専用 HSM・FIPS 140 レベル 3 が必要なら CloudHSM
- 秘密情報の自動ローテーションは Secrets Manager、ローテーション不要の設定値は Parameter Store
- ACM の証明書は統合サービスで自動更新。CloudFront 用は us-east-1
確認問題
参考リンク
AWS 公式ドキュメント(外部サイトが開きます)。
- AWS KMS とは
- AWS KMS の概念(カスタマーマネージドキー・AWS マネージドキー・エンベロープ暗号化)
- AWS KMS のキーポリシー
- Encrypt(API リファレンス。対称キーで最大 4,096 バイト)
- KMS キーのローテーション
- EnableKeyRotation(API リファレンス。90〜2,560 日、既定 365 日)
- KMS キーの削除(待機期間 7〜30 日、既定 30 日)
- マルチリージョンキー
- S3 のサーバー側の暗号化によるデータの保護
- S3 バケットキー
- Amazon RDS リソースの暗号化
- AWS CloudHSM とは(FIPS 140-2 / 140-3 レベル 3)
- Secrets Manager のシークレットのローテーション
- DeleteSecret(API リファレンス。復旧期間 7〜30 日、既定 30 日)
- AWS Systems Manager Parameter Store
- AWS Certificate Manager とは
- ACM と統合されたサービス(CloudFront は米国東部(バージニア北部)の証明書)