認証とアクセス制御

  • すべてのAPIリクエストで Firebase IDトークンを検証 (authenticateUser)
  • サイト操作系エンドポイントでは verifySiteOwnership を必ず通し、ユーザーIDとサイトIDの突合を実施
  • sanitizePath により ../ などのパストラバーサルを拒否
  • 管理画面の許可ドメイン: app.hirameki-web.com のみ(Firebase設定で管理)

ネットワークと暗号化

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

データ保護

  • PostgreSQLはVPCまたはlocalhostで稼働し、外部公開しない
  • .sitemeta.json に含まれるSEO/Analytics設定はユーザーごとに分離
  • StripeやGemini等のAPIキーは .env に保存し、backup-config.shで暗号化バックアップを取得

監査とログ

  • pm2 logs ai-web-builder-backend で不審なアクセスを定期確認
  • SECURITY_AUDIT.md のチェックリストに沿って四半期ごとにレビュー
  • 異常検知時は /api/chatfirebaseUid を必ずヘッダーから再取得し、リクエストボディから受け取らない

インシデント対応

  1. 影響範囲の特定(対象サイト/ユーザー)
  2. 該当APIキーの即時ローテーション
  3. users / sites テーブルの監査ログをエクスポート
  4. Gravバックアップから復元し、再発防止策をドキュメント化

チェックリスト

  • 全エンドポイントで Authorization: Bearer を必須にしている
  • サイトID / ファイル名の検証が行われている
  • FirebaseのAuthorized domainsが最新
  • Stripe Webhook Secretを最新化し、設定ファイルに平文で置かない
  • pm2 / Nginxログを収集している