画像アップロード#

ID#

sec001-upload

関連仕様・設計#

概要#

画像アップロード時における脅威と、それに対する具体的な防御策を定義する。

セキュリティリスク分析#

1. ファイル形式偽装攻撃#

脅威: 悪意のある実行ファイルを画像ファイルとして偽装してアップロードされる

防御策:

  • バイナリ検証: ファイルの拡張子だけでなく、マジックナンバー(バイナリヘッダ)を読み取り、許可された画像形式であることを検証する
  • 許可リスト: JPEG、PNG、WebPなど許可された画像形式のみを受け付ける
  • ファイル内容スキャン: アップロード後にウイルススキャンを実施する

2. 不正アクセスとデータ漏洩#

脅威: 認証されていないユーザーによる画像へのアクセスや第三者への漏洩

防御策:

  • 署名付きURL: S3へのアップロード・ダウンロードには署名付きURLを使用する
  • 有効期限制御: 署名付きURLの有効期限を厳格に管理する(アップロード用5分、閲覧用1時間)
  • 最小権限原則: アップロードされたファイルはデフォルトで非公開とし、presigned URL経由のみ閲覧可能とする

3. リソース枯渇攻撃#

脅威: 大量のアップロードによるストレージ容量の枯渇や、サービス妨害

防御策:

  • サイズ制限: ファイルサイズを5MB以下に制限する
  • レート制限: IPアドレスまたはユーザーIDごとにアップロード回数を制限する(1分間に10回まで)
  • クォータ管理: ユーザーごとの総アップロード容量を制限する

4. 中間者攻撃#

脅威: 通信経路でのデータ改ざんや盗聴

防御策:

  • TLS強制: 全通信をHTTPS(TLS 1.2以上)に限定する
  • 証明書検証: SSL/TLS証明書の厳格な検証を行う
  • HSTS: HTTP Strict Transport Securityを有効化する

セキュリティ要件#

1. 多層防御 (Defense in Depth)#

  • バイナリ検証: システムは、ファイルの拡張子だけでなく、マジックナンバー(バイナリヘッダ)を読み取り、許可された画像形式であることを検証しなければならない。
  • 署名付きURL: S3 へのアップロードには署名付き URL を使用し、その有効期限は発行から 5分間 としなければならない。

2. 最小権限の原則#

  • S3 ACL: アップロードされたファイルはデフォルトで非公開とし、認可用 presigned URL を介してのみ閲覧可能とする。

3. リソース制限#

  • Size Limit: バックエンドは、署名付き URL 発行前にリクエストされたファイルサイズが 5MB 以下であることを厳密に検証しなければならない。
  • Rate Limit: IP アドレスまたはユーザー ID ごとに、一定時間内のアップロード回数を制限しなければならない(1分間に 10回まで等)。

4. 通信セキュリティ#

  • TLS強制: 全ての通信はHTTPS(TLS 1.2以上)でなければならない。
  • 証明書検証: SSL/TLS証明書の有効性を検証しなければならない。