認証とアクセス制御

  • すべてのAPIリクエストで Firebase IDトークンを検証 (authenticateUser ミドルウェア)
  • Public API (v1) では X-API-Key ヘッダーによるAPIキー認証 (authenticateApiKey ミドルウェア)
  • サイト操作系エンドポイントでは verifySiteOwnership を必ず通し、ユーザーIDとサイトIDの突合を実施
  • sanitizePath により ../ などのパストラバーサルを拒否

APIキーセキュリティ

  • キーは hrmk_ プレフィックス + 32文字のランダムHEX
  • データベースにはSHA256ハッシュのみ保存(生のキーは保存しない)
  • スコープ: read(読み取り専用)/ readwrite(読み書き)
  • 有効期限設定が可能
  • 操作の監査ログを自動記録

ネットワークと暗号化

  • HTTPS + TLS1.2以上。Let’s Encryptによる自動証明書
  • 画像・メディアアップロードはサイズ(10MB)と拡張子でフィルタし、サーバー側で検証

データ保護

  • PostgreSQLはlocalhostで稼働し、外部公開しない
  • .sitemeta.json に含まれるSEO/Analytics設定はユーザーごとに分離
  • StripeやGemini/Claude等のAPIキーは .env に保存

レート制限

対象制限
Internal API (/api/*)100リクエスト / 15分
Public API (/api/v1/*)60リクエスト / 分

監査とログ

  • pm2 logs ai-web-builder で不審なアクセスを定期確認
  • APIキーの使用履歴は GET /api/api-audit-logs で取得可能
  • Firebase UIDは必ずヘッダーのトークンから取得し、リクエストボディからは受け取らない

インシデント対応

  1. 影響範囲の特定(対象サイト/ユーザー)
  2. 該当APIキーの即時無効化(DELETE /api/api-keys
  3. .env のAPIキーをローテーション
  4. ログをエクスポートして原因分析

チェックリスト

  • 全エンドポイントで Authorization: Bearer または X-API-Key を必須にしている
  • サイトID / ファイル名の検証が行われている
  • FirebaseのAuthorized domainsが最新
  • Stripe Webhook Secretが最新
  • pm2 / Nginxログを定期確認している