暗号化(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 の暗号化も裏側ではこの仕組みです。

再生型アニメ図解

エンベロープ暗号化で大きなファイルを暗号化する

アプリ KMS KMS キー 保存先(S3 など) 🔒 暗号化データ + 🔒 データキー ① 平文のデータキー + 暗号化データキー ✕ 平文のデータキーは捨てる ✓ Decrypt で平文の鍵に戻す KMS キーは外に出ない

※簡略化しています: データキーの発行は GenerateDataKey という API です。S3 などのサービスでサーバー側の暗号化を使う場合は、この流れをサービスが自動で行うので、アプリは意識しません。

ローテーション・削除・マルチリージョンキー

機能内容
自動ローテーションカスタマーマネージドキー(KMS が生成した鍵素材を持つ対称キー)で有効にできる。間隔は既定で 365 日で、90〜2,560 日の範囲で指定できる。キー ID は変わらず、古い鍵素材も保持されるので、以前に暗号化したデータもそのまま復号できる。インポートした鍵素材・非対称キーは自動ローテーションできない
削除すぐには消えず、7〜30 日(既定 30 日)の待機期間の後に削除される。待機中は使えなくなり、取り消せる。削除すると、そのキーで暗号化したデータは復号できなくなるので、迷ったら「無効化」を選ぶ
マルチリージョンキー同じキー ID と鍵素材を持つキーを複数のリージョンに置ける。あるリージョンで暗号化したデータを、別のリージョンでそのまま復号できる(災害対策やリージョンをまたぐアプリ向け)。通常の KMS キーはリージョンの中でしか使えない
鍵素材のインポート(BYOK)自社で作った鍵素材を KMS キーに取り込める。鍵の生成を自社で行う必要がある場合に使う

S3・EBS・RDS の暗号化の選択肢

S3 のサーバー側の暗号化は、鍵の管理方法で次のように分かれます。現在は、すべての新しいオブジェクトが既定で SSE-S3 で暗号化されます。

方式鍵の管理選ぶ場面
SSE-S3S3 が管理する鍵。利用者は何もしなくてよい特別な要件がない場合(既定)
SSE-KMSKMS キー(AWS マネージドキーまたはカスタマーマネージドキー)「鍵の使用を CloudTrail で監査したい」「キーポリシーで復号できる人を制限したい」「鍵のローテーションを自分で管理したい」
DSSE-KMSKMS キーで 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 KMSAWS CloudHSM
HSM の利用形態AWS が管理する HSM を複数の利用者で共有(マルチテナント)利用者専用の HSM(シングルテナント)
鍵の管理AWS が運用し、利用者はキーポリシーで制御利用者が鍵とユーザーを完全に管理。AWS は鍵にアクセスできない
AWS サービスとの統合S3・EBS・RDS など多数と統合済みそのままでは統合されない。KMS のカスタムキーストアとして使えば、KMS 経由で統合できる
使える APIKMS の APIPKCS #11・JCE・CNG/KSP など業界標準の API
可用性AWS が管理利用者がクラスターに複数の HSM(別々の AZ)を置いて冗長化する

問題文に「シングルテナント」「専用のハードウェア」「FIPS 140 レベル 3」「鍵を AWS に管理させない」とあれば CloudHSM を選びます。それ以外の一般的な暗号化は KMS が第一候補です。

Secrets Manager と Parameter Store

DB のパスワードや外部サービスの API キーを、アプリのコードや設定ファイルに直接書くと、ソースコードの共有や流出で漏れてしまいます。そこで秘密情報は専用のサービスに保管し、アプリは実行時に API で取り出します。

観点AWS Secrets ManagerSystems 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 で確認しておくと、更新も自動で進みます。

どのサービスを選ぶか

ここまでのサービスを、「何を守りたいか」から選べるように整理します。

比較・選択フローチャート

質問に答えて鍵・秘密情報の管理サービスを選ぶ

守りたいものを思い浮かべて「はい / いいえ」で答えてください。答えた経路が上から順に表示されます。

    ※簡略化しています: 実際には 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 に届く前にデータを暗号化」クライアント側の暗号化

    引っかけポイント

    まとめ: SAA 試験で押さえるポイント

    確認問題

    参考リンク

    AWS 公式ドキュメント(外部サイトが開きます)。