署名付きURLとホットリンク防止 戦略ガイド(期限/トークン/画像CDNセキュリティ)
無制限アクセスやホットリンク(外部サイト直接埋め込み)による帯域浪費とキャッシュヒット低下はコストとパフォーマンスを同時に悪化させます。本ガイドは Signed URL / Cookie / Token / Edge 検証を組み合わせ、再現性ある短期アクセス制御と安全な鍵運用を確立する実務フレームを提示します。
1. 脅威モデル(何を防ぎ何を許容するか)
- 大量ホットリンク: 高トラフィック掲示板埋め込みによる egress 増大。
- 期限外再利用: 一度発行した URL を長期共有キャッシュや SNS で半永久利用。
- URL 推測: 連番/平文パスで総当たり → 原本一括収集。
- スクレイピング: 自動巡回で署名パラメータ脱落でも取得継続。
- 鍵漏洩: 署名秘密鍵がCIログ等で漏れ再生成不能 or 遅延。
2. 署名方式の選択肢と組み合わせ
方式 | 利点 | 弱点/注意 | 適用例 |
---|---|---|---|
Query署名 (signed_url?exp=...&sig=...) | 単純実装/パス毎差異/キャッシュ整合しやすい | URL露出しやすい・長期共有化されがち | 短期一時表示 / サムネ分発行 |
Path署名 (/sig/hash/path) | パラメータ秘匿・WAFルール簡潔 | URL正規化の統一ミスで検証失敗 | CDNエッジ変換 / 低漏洩面 |
Cookie署名 | URL継続性・埋め込みで露出しにくい | Cookie属性管理・CORS/サブドメイン整合 | 会員制ギャラリー / 一時DL |
Origin Token (Header) | 権限/レート柔軟・短期失効 | プレーン転送で漏洩時リプレイ | API連携 / 動的変換レイヤ |
Signed Cookie + 変換署名併用 | 動的リサイズ/フォーマット変換を認可付きで安全化 | 設計が複雑・監査要件増 | 高額課金素材 / 有料会員 |
※ 公開静的アセットへの WAF 過剰適用は失敗率増。リスク境界を明確化し保護レベルを段階化。
3. 期限と鍵ローテーション(短期+オーバーラップ)
期限(exp)は最小権限原則。短期URL(5〜10分)をユーザー操作直前に発行し、再取得は軽量APIで行う。鍵は K_active/K_next の2本を保持し、署名検証は両方許容期間を24時間程度設けることで無停止ローテーション。漏洩時は K_next を即昇格 + 新 next を再生成し短期失効を強制。
- 署名対象文字列: METHOD + PATH + EXP + (IP prefix optional)
- 時刻ずれ: NTP監視 / skew > 5s でログ警告
- 再利用防止: exp + 現在時刻差 > 0 でのみHIT、早期再生成は 429
- 集中攻撃: 失敗率 > 基準 + 3σ で IP / ASN 単位レート制御
4. キャッシュ失効と再検証整合
署名付きURLはパス差異でキャッシュキーが分離されやすくヒット率を下げがち。Variantパラメータ(サイズ/format)を正規位置に固定し canonical 生成を統一、stale-while-revalidate で短期署名とキャッシュ再利用を両立。リサイズ/変換は生成後に immutable + 長期TTL(1y)で実ファイルを固定し、署名は取得フェーズのみ保護する二層構造が安定する。
- Edge: 署名検証成功後に
cache-control: public, max-age=600, stale-while-revalidate=86400
- Origin: 生成済みバリアントは immutable で再検証ヒット減
- Variant衝突: 正規化順序 (w,h,fit,format,q) を固定
- 404/403: 短期 negative キャッシュ 60s で DoS 低減
5. 動的最適化レイヤ併用(安全なエンコード)
画像の動的最適化(/resize?url=...&w=...)は SSR や Edge Functions で行う場合、オリジン以外参照の悪用とリソース爆破が主リスク。署名パラメータに変換指示(w,h,format,q)を含め、入力URLが許可ドメイン/パス前方一致のみ通過するホワイトリスト検証を実装。Sharp等のライブラリは並列数/メモリ上限制限を行い、失敗時は軽量PNG保険画像を即時返却する。
- 許可ドメイン: env で配列管理し prefix マッチ
- メモリ制限: 画素数 (w*h) > 24MP で拒否
- 同時実行: キュー/セマフォで上限(例: 4)
- 失敗: ポイズンファイル再試行禁止フラグ付与
- ログ: 変換結果(サイズ/SSIM)と失敗統計を集中集計
6. 監視と検知(可視化→閾値→自動化)
不正利用は 失敗率・同一IP集中・期限切れ再試行 のスパイクで検知。メトリクスを時系列DBへ送信し、95/99パーセンタイル逸脱でアラート。攻撃時は WAF ルール(ASN/IP Range)自動追加と署名鍵早期ローテを組み合わせ MTTR を短縮。
- 指標: req_total / verify_fail / expired / resize_fail / variant_miss
- ダッシュボード: 伸長率(今5分 vs 前5分) と p95/p99 latency
- アラート: 失敗率 > 基準+3σ を5分継続 / 単IP > 300r/5m
- 対応Runbook: 自動RateLimit → 鍵ローテ → BKアップロード封止
7. ハードニング(多層防御と最小権限)
- キー保護: KMS + 環境変数は runtime 読み出しのみ(ビルド時含めない)。
- 署名ライブラリ: HMAC 前に入力正規化(重複スラッシュ除去・小文字化)。
- レスポンスヘッダ: leak軽減 (cache-control, content-length 固定化でタイミング差異削減)。
- 失敗レスポンス: 403/404/410 を同一 body サイズ/遅延で返し列挙難度を上げる。
- 鍵ローテ: 旧鍵は遅延削除 (grace=24h) → 完了後安全に破棄。
- WAF: Bot指標(UA不明, headless特性)組み合わせ false positive 最小化。
- ログ匿名化: IPは /24 or /48 にマスクし個人識別を回避。
8. まとめ:短期署名 + キャッシュ二層 + ローテ自動化
短期署名URLとキャッシュ戦略を分離し「生成段階を守り、生成済みは高速再利用」の二層構造にで、コストと安全性を同時に最適化できます。鍵ローテーションと監視を標準化し、異常兆候時のRunbookを自動化すれば攻撃と日常運用を同じ形で捌けます。
Version: 2025-09-06 – 初版(TechArticle/HowTo/FAQ/構造化データ統合)。