第29回: S3ストレージ設計の基本 — 「とりあえず公開バケット」で大丈夫ですか?

章: 第8章: パフォーマンスと本番運用実践

ファイルの公開範囲、きちんと設計されていますか?

「とりあえず公開バケットにアップロード」——この判断が、後から情報漏えいのリスクを生む原因になります。

請求書・個人情報・契約書などの機密ファイルが、URLさえ知っていれば誰でも閲覧できる状態になっていませんか?S3の権限設計とURL発行方針は、アーキテクチャ設計の最初に決める必要があります。

問題の本質と解決策

問題: 公開バケットに機密ファイルを置くと、URLが漏れた瞬間にアクセスが可能になります。また、非公開バケットの設計を後から変えるのは影響範囲が大きくなりがちです。

解決策: 機密ファイルは非公開バケットに置き、アクセス時は temporaryUrl() で期限付き署名URLを発行します。公開ファイル(アイコン・サムネイル等)とは明確にバケットを分けて管理します。

公開バケット vs 非公開バケット 比較

観点 公開バケット 非公開バケット + temporaryUrl
アクセス制御 URLを知れば誰でもアクセス可 期限付きURLのみアクセス可
機密ファイルへの適性 ✗ 不適切 ◎ 適切
実装コスト 低い 低〜中(数行で実装可能)
URL漏えい時のリスク 恒久的なアクセス可能 URL期限切れで無効化

チェックポイント: アップロード先のバケットは「公開情報用」と「機密情報用」で分けていますか?同一バケットに混在させると権限管理が複雑になります。

実装サンプル


<?php
// 保存
$path = Storage::disk('s3')->putFile('invoices', $request->file('pdf'));

// 一時URL(非公開ファイル)
$url = Storage::disk('s3')->temporaryUrl($path, now()->addMinutes(10));

return response()->json(['url' => $url]);

まとめ & 次のステップ

  • 機密ファイルは非公開バケットに置き、temporaryUrl() で期限付きURLを発行します
  • 公開ファイルと機密ファイルはバケットを分けて管理することが基本設計です
  • temporaryUrl() の有効期限は用途に応じて数分〜数十分で設定します
  • バケットのアクセスポリシーは最小権限の原則(Least Privilege)で設定しましょう
  • まず「このファイルは公開していい情報か」を設計段階で問いかける習慣をつけましょう

次回は 認証強化(2FA/セッション管理) を学びます。パスワード漏えい前提で守りを固める認証設計を解説します。

Related Articles