AWS SAA(Solutions Architect - Associate)対策

S3のアクセス制御

このレッスンを終えると、S3 の公開要件を読んで、バケットポリシー、パブリックアクセスブロック、署名付き URL、CloudFront のどれで解くのかを選べるようになります。

まず要件から

ある企業が、社内向けの資料を S3 に置いています。ある部署が共有のために ACL でオブジェクトを公開してしまい、外部から読める状態になっていました。経営から「今後、誰かが操作を誤っても公開されない状態にしてほしい。ただし、取引先には特定のファイルを 1 時間だけ渡せるようにしたい」と指示が出ました。

2つの要件が混ざっています。前半はパブリックアクセスブロック、後半は署名付き URL です。両立します。署名付き URL は公開設定ではなく、リクエストに認証情報の署名を載せる仕組みなので、公開ブロックを有効にしたままでも渡せます。ここを混同した選択肢が本番で並びます。

制御手段の線引き

手段効く範囲向いている要件
IAM ポリシー自アカウントのユーザーやロール社内の誰が何をできるか
バケットポリシーバケット全体別アカウントへの許可、条件付きの一括制御
パブリックアクセスブロックアカウント全体またはバケット公開事故の予防
署名付き URL単一のオブジェクト、期限付き一時的に第三者へ渡す
ACLオブジェクトやバケット新規設計では使わない

ACL は古い仕組みで、現在は無効にした状態が既定です。試験で「ACL でオブジェクトごとに公開する」という選択肢を見たら、まず疑ってよい行です。

パブリックアクセスブロックの位置づけ

パブリックアクセスブロックは、バケットポリシーや ACL の内容にかかわらず公開になる設定そのものを拒む上位の仕組みです。アカウント単位でも掛けられるので、要件文に「組織のどのバケットでも公開されないようにしたい」とあればアカウント単位を選びます。バケット単位を選ぶ選択肢は、既存バケットは守れても新規バケットの作成を止められません。

条件付きバケットポリシーの型

暗号化していないアップロードを止める、あるいは HTTPS 以外を拒否する要件は、Deny と Condition で書きます。

{ "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::reports/*", "Condition": { "Bool": { "aws:SecureTransport": "false" } } }

Allow ではなく Deny で書く点が要点です。Allow で HTTPS を許可しても、HTTP を塞いだことにはなりません。前のレッスンの評価順のとおり、確実に塞ぐのは明示的な Deny です。

CloudFront から配信する場合

静的サイトを世界に配信する要件では、バケットを公開せず CloudFront を前に置きます。バケットポリシーで CloudFront のディストリビューションだけを許可し、S3 のエンドポイントを直接叩く経路を塞ぐのが基本形です。この仕組みが Origin Access Control です。「バケットを公開せずに配信したい」「S3 の URL を直接叩かせたくない」と書かれていたらこの行を選びます。

要件語から構成へ

要件文の言い回し選ぶもの
誤操作でも公開されないようにしたいパブリックアクセスブロック(アカウント単位)
取引先に一時的にファイルを渡したい署名付き URL
別アカウントにバケットを読ませたいバケットポリシーもしくはクロスアカウントロール
HTTP でのアクセスを拒否したい条件付きの Deny をバケットポリシーに
暗号化していないアップロードを拒否したい条件付きの Deny をバケットポリシーに
バケットを公開せずに静的サイトを配信したいCloudFront と Origin Access Control
保存期間中は誰も削除できないようにしたいS3 Object Lock

よくある引っ掛け

ひとつめは、一時的な受け渡しの要件に「バケットを一時的に公開して、あとで戻す」を選ぶ誤答です。動きますが、戻し忘れという運用リスクを作り、期限の要件も満たしません。

ふたつめは、パブリックアクセスブロックを有効にすると署名付き URL も使えなくなると考える誤答です。署名付き URL は公開設定ではないので影響を受けません。

まとめ

  • 公開事故の予防はパブリックアクセスブロック。範囲はアカウント単位が強い
  • 一時的な受け渡しは署名付き URL。公開ブロックと両立する
  • HTTPS 強制や暗号化強制は、Allow ではなく条件付きの Deny で書く
  • 公開せずに配信するなら CloudFront と Origin Access Control
  • ACL は新規設計で選ばない
生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部

復習ミニクイズ

ある企業が S3 バケットに保管した契約書ファイルを、取引先の担当者に 24 時間だけ参照させる必要があります。取引先は AWS アカウントを持っておらず、企業側は誤操作による公開事故を防ぐためアカウント単位でパブリックアクセスブロックを有効にしています。アプリケーションの改修は可能です。この要件を満たす方法はどれですか。