認証とアクセス制御
- すべての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は必ずヘッダーのトークンから取得し、リクエストボディからは受け取らない
インシデント対応
- 影響範囲の特定(対象サイト/ユーザー)
- 該当APIキーの即時無効化(
DELETE /api/api-keys)
.env のAPIキーをローテーション
- ログをエクスポートして原因分析
チェックリスト