S3で誤ったデータの公開を防ぐパブリックアクセス設定機能が追加されました

537件のシェア(そこそこ話題の記事)

こんにちは、臼田です。

S3のセキュリティを向上する素晴らしいアップデートが来ました!ほぼすべてのAWSユーザがこの設定を今すぐ有効化すべきだと思います。

S3で新たにパブリックアクセス設定という機能が追加され、誤ってデータを公開してしまうことを防ぐ設定をAWSアカウント全体・バケット毎にできるようになりました。

Amazon S3 Block Public Access – Another Layer of Protection for Your Accounts and Buckets | AWS News Blog

この良さを理解するにはこれまでどうなっていたかを知る必要がありますので、そこから順に説明したいと思います。

これまでのS3セキュリティ

これまでS3にはアクセス制御に利用する要素が、主に下記の3種類がありました。

  • ACL(アクセスコントロールリスト)
  • バケットポリシー
  • IAM

特にバケットやオブジェクトの公開にかかるのはACLとバケットポリシーです。そしてACLはバケット単位とオブジェクト単位両方で設定することができ、バケット単位のACLの設定に関係なくオブジェクト単位のACLが優先されました

つまりS3の管理者はバケット単位のACLでパブリックアクセスを許可しない設定にしておけばいいというわけではなく、常にアップロードされたオブジェクトについてもパブリックアクセスを許可していないことを確認し続ける必要がありました。これはCloudTrailで監視・検知することは可能ですがかなりの労力が必要です。

また、バケットポリシーではACLよりも優先してブロックすることも可能でしたが、下記のような理由から簡単ではありませんでした。

  • ポリシードキュメントという特有のJSON形式で記述する必要がある
  • 公開設定以外にも様々な条件の組み合わせなどがあり、管理しづらい

詳細なS3の権限設定の種類や関係性については下記をご参照ください。

S3のアクセスコントロールが多すぎて訳が解らないので整理してみる

そのため、管理者にとってS3にあるデータが誤って公開されていないかを管理・運用していくことは簡単ではありませんでした。

パブリックアクセス設定機能

今回追加されたパブリックアクセス設定機能は下記のようなものです。

  • ACL及びバケットポリシーの公開設定をブロックできる
  • 既存の公開設定を削除できる
  • AWSアカウント全体及びバケット単位で利用できる

字面だけでは分かりづらいと思うので画面を見ていきましょう。

S3のコンソールではバケット一覧とは別に、左側に「このアカウントのパブリックアクセス設定」が追加されています。こちらがアカウント単位の設定です。

項目としては2分類4項目あり、簡単に書くと下記のようになっています。

  • ACLの公開設定管理
    • 新規の公開設定のACLをブロックする
    • 既存の公開設定のACLを削除する
  • バケットポリシーの公開設定管理
    • 新規の公開設定のバケットポリシーをブロックする
    • 既存の公開設定及びクロスアカウントアクセスのバケットポリシーをブロックする

ACLとバケットポリシーについて、新規の公開を防ぐ設定と、既存の公開を修正する設定です。素晴らしいですね。

これを一発ポチッとすればアカウント全体に設定を適用できます。ちなみに、反映は体感的には瞬時に行われていました。

バケット単位については下記のようになっています。

S3バケットの一覧からバケットを選択すると「パブリックアクセス設定を編集する」が選べるようになります。

ちなみに、以前はバケット自体の公開設定を入れていないだけで「非公開」と表示されていたアクセスの項目は「オブジェクトは公開可能」という表記に変わっていました。適切な表現に修正された形ですね。

「パブリックアクセス設定を編集する」を押すと先ほどと同等の設定がバケット単位で設定できる画面が表示されます。

画面としては、上記だけではなくバケットの詳細画面から「アクセス権限 -> パブリックアクセス設定」でも同じ設定が可能です。

設定してみた

それでは実際に設定変更してみます。

今回はバケットのパブリックアクセス設定を変更してみます。試験的に公開オブジェクトが置いてあるバケットで実施してみます。

まずは右上の「編集」を押すと設定変更画面に移ります。4項目についてチェックボックスが出るので全てにチェックを入れ「保存」を押します。

確認画面が出てくるので、テキストボックスに「確認」と入力して「確認」ボタンを押します。

正常に処理された旨が表示され、各項目がTrueに変更されています。

バケット一覧ではアクセスが「バケットとオブジェクトは非公開」と表示されるようになりました。

公開されていたオブジェクトの権限を確認すると、読み込み権限が管理者と一般の2つが対象となっていたところが1つのみ(管理者のみ)に変更されました。(画像左が設定前、右が設定後)この状態でオブジェクトのリンクURLを開くとAccessDeniedとなりました。

ちなみに、もう一度編集から設定を外すと、公開されていたオブジェクトは再び公開されました。項目としては「パブリックアクセスを削除する」と書かれていましたが、現状では直接オブジェクトのACLが削除されるわけではなく、上位のポリシーで上書きされるだけのようです。

パブリックアクセス設定の詳細

パブリックアクセス設定機能として新たに4つの権限が追加されています。

  • GetPublicAccessBlock - アカウントまたはバケットのパブリックアクセスブロックオプションを取得します。
  • PutPublicAccessBlock - アカウントまたはバケットのパブリックアクセスブロックオプションを設定します。
  • DeletePublicAccessBlock - アカウントまたはバケットからパブリックアクセスブロックオプションを削除します。
  • GetBucketPolicyStatus - バケットアクセスポリシーがパブリックかどうかを確認します。

つまり、S3バケットの管理者はこれらの権限をファイルアップロード者に許可しなければ適切な運用が可能です。

また、これらの設定はCloudFormationですでに利用可能です。その設定についてもこちらのブログに書かれています。

この機能自体は無料で利用できます。S3 APIをリクエストする利用料のみで設定して使えます。

まとめ

新しく実装されたパブリックアクセス設定機能を試してみました。全体的にオブジェクトの公開を防ぐことができないACL、設定が複雑で管理しづらいバケットポリシーとは別の新しい方法で簡単にオブジェクトの公開を防ぐ設定ができました。

管理者はボタンポチッとするだけでオブジェクトが誤って公開される懸念から開放されます。

この設定はおそらく今後のスタンダードな設定となるでしょう。ぜひ皆さんも設定してみてください。