認証とアクセス制御
- すべての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キーをローテーション- ログをエクスポートして原因分析
チェックリスト
- 全エンドポイントで
Authorization: BearerまたはX-API-Keyを必須にしている - サイトID / ファイル名の検証が行われている
- FirebaseのAuthorized domainsが最新
- Stripe Webhook Secretが最新
- pm2 / Nginxログを定期確認している