画像アップロード#
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証明書の有効性を検証しなければならない。