SAA-034
監査要件により、あるS3バケットへのアクセスがすべて暗号化された通信路で行われることを保証しなければなりません。暗号化されていないHTTPでのリクエストを構造的に拒否する方法として、最も適したものはどれですか?
選択肢
解説と正解
解説と正解を読む(先に自分で回答してから開くのがおすすめです)
正解:B. バケットポリシーで、条件キーaws:SecureTransportがfalseの場合にs3:*をDenyするステートメントを追加する
解説
転送時の暗号化を強制するには、バケットポリシーでaws:SecureTransportがfalseのリクエストを明示的にDenyします。IAMの評価では明示的なDenyが常に優先されるため、HTTPでのアクセスは他の許可があっても必ず拒否されます。
選択肢ごとの解説
A. バケットのデフォルト暗号化としてSSE-S3を有効化する
SSE-S3はS3に保存されたデータ(保管時)の暗号化であり、クライアントとS3の間の通信路には関与しません。要件は転送時の暗号化なので満たしません。
B. バケットポリシーで、条件キーaws:SecureTransportがfalseの場合にs3:*をDenyするステートメントを追加する
正解です。明示的Denyは他のAllowより優先されるため、HTTPリクエストを構造的に遮断できます。
C. バケットのブロックパブリックアクセスをすべて有効化する
ブロックパブリックアクセスは、パブリック公開につながるACLやバケットポリシーを無効化する機能で、通信路が暗号化されているかどうかは判定しません。
D. AWS Certificate Managerで証明書を発行し、S3バケットに割り当てる
S3バケットにACM証明書を直接割り当てることはできません。独自ドメインでのHTTPS配信が必要な場合は、CloudFrontディストリビューションにACM証明書を関連付けます。
実務での使いどころ
S3 の暗号化には「保管時(at rest)」と「転送時(in transit)」の 2 つの軸があり、設定箇所がまったく異なる。保管時は SSE-S3 / SSE-KMS / DSSE-KMS / SSE-C といった暗号化方式をバケットのデフォルト暗号化やリクエストヘッダーで指定する。一方、転送時は TLS を使うかどうかの話であり、S3 のエンドポイントはもともと HTTPS と HTTP の両方を受け付けるため、HTTP を「使わせない」ためにはポリシーによる強制が必要になる。この強制に使うのが AWS グローバル条件コンテキストキーの aws:SecureTransport で、リクエストが TLS 経由なら true になる。 実装は、バケットポリシーに Effect: Deny / Action: s3:* / Resource にバケット ARN とオブジェクト ARN の両方 / Condition に Bool の aws:SecureTransport false を書く。ここで Resource にバケット ARN(arn:aws:s3:::bucket)とオブジェクト ARN(arn:aws:s3:::bucket/*)の 2 つを列挙し忘れると、ListBucket など一部の操作が素通りするので注意する。IAM のポリシー評価では明示的な Deny がすべての Allow に優先するため、同じアカウント内の管理者であっても HTTP アクセスは拒否される。同様の条件強制のパターンとして、s3:x-amz-server-side-encryption を条件にした保管時暗号化の強制や、aws:SourceVpce を条件にした VPC エンドポイント経由限定などがある。 SAA-C03 では「転送中のデータを暗号化することを強制したい」「HTTP でのアクセスを禁止したい」という要件で aws:SecureTransport の Deny が正解になる。誤答にはデフォルト暗号化(保管時)、ブロックパブリックアクセス(公開制御)、ACM 証明書の割り当て(S3 単体では不可)が並ぶ。保管時と転送時の混同はこの領域で最も多い誤答パターンなので、要件文のどちらを問われているかを必ず読み分けたい。