AWS認定資格 WEB問題集&徹底解説

デベロッパー–アソシエイト

正解 A問題
要復習(もう一度解きたい問題) 1 2 3 4
合格に向けて、もっと深く学習する
豊富な問題と詳細なAWSサービス解説を、24時間無料でお試しいただけます
プレミアム会員機能を無料で試す ❯
問題文と選択肢
ある企業は、AWS Lambda を使用して医療データを処理し、結果を Amazon S3 バケットに JSON 形式で保存するサーバーレスアーキテクチャを構築しています。このデータは法規制の対象となる機密情報であり、S3 にアップロードされる前にアプリケーションレベルで暗号化する必要があります。

Lambda 関数のコード内でデータを暗号化してから S3 にアップロードするための、最も適切な実装方法はどれですか?
  • AWS KMS の GenerateDataKey API を呼び出してデータキーを取得し、そのデータキーを使って Lambda のコード内でデータを暗号化する
  • S3 バケットのデフォルトの暗号化設定を有効にし、バケットポリシーで暗号化されていないアップロードを拒否する
  • AWS KMS の Encrypt API を呼び出し、KMS キー(旧称 カスタマーマスターキー)でデータ全体を直接暗号化する
  • Amazon S3 マネージドキー(SSE-S3)を使用して S3 バケット側でサーバーサイド暗号化を適用する
解説 頻出度★★★★
この問題は、「Lambda のコード内で(=S3 に送る前に)暗号化する」という要件で、KMS の GenerateDataKey によるエンベロープ暗号化を選べるかがポイント
正解

A. AWS KMS の GenerateDataKey API を呼び出してデータキーを取得し、そのデータキーを使って Lambda のコード内でデータを暗号化する

GenerateDataKey は、平文のデータキーと、KMS キーで暗号化されたデータキーの 2 つを返す。Lambda はその平文キーでデータをローカル(コード内)で暗号化し、平文キーをメモリから破棄したうえで、暗号化データと暗号化済みデータキーをまとめて S3 に保存する。

これが エンベロープ暗号化で、AWS が推奨するアプリケーションレベル暗号化の定石。データサイズの制限も受けず、S3 に到達する前に暗号化が完了しているため要件を満たす。

B. S3 バケットのデフォルトの暗号化設定を有効にし、バケットポリシーで暗号化されていないアップロードを拒否する

バケットのデフォルト暗号化とバケットポリシーによる強制は、いずれもS3 側(サーバーサイド)で行う暗号化。データは平文のまま S3 へ送信され、受け取った S3 が暗号化する。

「S3 にアップロードされる前にアプリケーションレベルで暗号化する」という要件を満たさない。セキュリティ対策として有効でも、設問が要求している層が違う。

C. AWS KMS の Encrypt API を呼び出し、KMS キー(旧称 カスタマーマスターキー)でデータ全体を直接暗号化する

KMS の Encrypt API は最大 4KB(4096 バイト)までのデータしか暗号化できないため、医療データの JSON 全体を直接暗号化する用途には使えない。

また KMS を呼ぶたびに API リクエスト料金とスロットリング上限が効いてくるため、大きなデータやレコード単位の暗号化には不向き。だからこそデータキーだけを KMS で扱い、本体はローカルで暗号化するエンベロープ暗号化が用意されている。

D. Amazon S3 マネージドキー(SSE-S3)を使用して S3 バケット側でサーバーサイド暗号化を適用する

SSE-S3 は S3 がオブジェクトを受信した後にサーバー側で暗号化する方式であり、ネットワークを流れる時点のデータはアプリケーションから見て平文(TLS で保護されるのみ)。

クライアントサイド暗号化ではないため、「アップロード前にアプリケーションレベルで暗号化」という法規制上の要件を満たせない。

これだけ覚える(記憶フック)
大きなデータは GenerateDataKey でエンベロープ暗号化。KMS の直接 Encrypt は4KB まで、SSE は「送った後」の暗号化。
正解への思考ルート 問題文から要件を抽出し、選択肢の適否を判断するのがポイントです。
要件 判断ポイント
S3 にアップロードされる「前に」暗号化する必要がある サーバーサイド暗号化(SSE-S3・デフォルト暗号化)はS3 到達後の暗号化。層が違う
→選択肢(B・D)を消す
Lambda 関数のコード内で暗号化する クライアントサイド暗号化。鍵は KMS から取得し、暗号化処理自体はコードで行う
→選択肢(A・C)は候補
対象は医療データの JSON(4KB を超え得るサイズ) KMS の Encrypt API は最大 4KB。データ本体を直接投げる設計は破綻する
→選択肢(C)を消す
法規制対象データを安全かつ拡張性ある方式で暗号化 GenerateDataKey で得たデータキーで本体を暗号化するエンベロープ暗号化が定石
→選択肢(A)が正解
ひっかけポイント
  • 選択肢 B・D は「暗号化している」ので正しく見えるが、設問は「S3 にアップロードされる前に」と明記。SSE=サーバーサイド=送った後という時系列で切る
  • 選択肢 C も「コード内で KMS を使って暗号化」なので一見要件を満たすが、KMS の Encrypt は 4KB 上限。KMS で直接暗号化してよいのは鍵やパスワードなど小さなデータだけ
  • エンベロープ暗号化では 平文データキーは使用後に必ず破棄し、暗号化済みデータキーを暗号文と一緒に保存する。復号時は Decrypt でデータキーを戻す
  • 実装を自前で書かず AWS Encryption SDK / Amazon S3 Encryption Client を使うのが実務の定石。DVA では「GenerateDataKey=エンベロープ暗号化」の紐付けが問われる
出題バリエーション 同じ知識が本番では条件を変えて出題されます。
問題文がこう変わったら 正解はこう変わる
4KB 未満の小さなシークレット(API キー等)を暗号化したい」 KMS の Encrypt API を直接呼ぶ方式でよい(あるいは Secrets Manager / SSM SecureString)。
「暗号化は S3 側に任せてよいが、キーは自社で管理・監査したい」 SSE-KMS(カスタマー管理キー)が正解軸に。CloudTrail でキー利用も追跡できる。
暗号化されていないアップロードを拒否したい」 バケットポリシーで s3:x-amz-server-side-encryption を条件に Deny が正解軸に。
「Lambda 環境変数に入れたDB 接続情報を保護したい」 環境変数の KMS による暗号化、または Secrets Manager からの取得が正解軸に。
関連サービスの解説 Amazon Simple Storage Service (Amazon S3)
AWS Key Management Service (AWS KMS)
AWS Lambda
+ 質問 / コメント
解答・解説に疑問がある場合や、よりよい解説がある場合など、お気軽にコメントください。ただし、短文コメントは表示されません。また、中傷などコメントの内容によっては、会員機能を停止させて頂きます。教え学び合える場になれば嬉しいです。(コメント投稿にはログインが必要です)
正答率 81%
No.12 解説
ある企業は、AWS Lambda を使用して医療データを処理し、結果を Amazon S3 バケットに JSON 形式で保存するサーバーレスアーキテクチャを構築しています。このデータは法規制の対象となる機密情報であり、S3 にアップロードされる前にアプリケーションレベルで暗号化する必要があります。

Lambda 関数のコード内でデータを暗号化してから S3 にアップロードするための、最も適切な実装方法はどれですか?
  • AWS KMS の GenerateDataKey API を呼び出してデータキーを取得し、そのデータキーを使って Lambda のコード内でデータを暗号化する
  • S3 バケットのデフォルトの暗号化設定を有効にし、バケットポリシーで暗号化されていないアップロードを拒否する
  • AWS KMS の Encrypt API を呼び出し、KMS キー(旧称 カスタマーマスターキー)でデータ全体を直接暗号化する
  • Amazon S3 マネージドキー(SSE-S3)を使用して S3 バケット側でサーバーサイド暗号化を適用する

(会員限定)当問題の評価をお願いします。改善に活用します。