セキュリティとベストプラクティス

Reseller API

本 API はすべての呼び出しが直接的な金銭的影響を持ち、機微なサーバー認証情報にアクセスし得るという前提で設計されています。したがってセキュリティ要件は REST デフォルトをはるかに上回ります。

実装済みのセキュリティ管理策

  • HMAC-SHA256: すべてのリクエストはメソッド、パス、タイムスタンプ、ノンス、ボディハッシュにわたって HMAC-SHA256 で署名されます。検証は定数時間(hash_equals)で行われます。
  • AES-256-GCM: シークレットは AES-256-GCM 暗号化のみで永続化されます(libsodium 使用)。マスターキーはデータベースの外部 /etc/kh-reseller-api/master.key.v{N} に保管されます。
  • Replay protection: タイムスタンプ許容範囲 +-300 秒、ノンスキャッシュ 600 秒。正しく署名されたリクエストは再送できません。
  • Scope-based authorization: キーごとの明示的なスコープリスト。書き込みおよび機微なスコープは明示的に有効化する必要があります。
  • IP whitelist (optional): キーごとに任意の IP 許可リスト(CIDR 記法、IPv4 および IPv6 対応)。
  • Rate limit: 多層構造:キーごと(分単位+日単位)および IP ごと(分単位)。バースト許容付きのトークンバケット方式です。
  • Idempotency: 発注および破壊的なサービスアクションには Idempotency-Key が必要です。ネットワーク再試行に対して 24 時間のリプレイ防止が働きます。
  • Tenant isolation: すべてのデータベースクエリはアカウント ID で厳格にフィルタリングされます。テナント間アクセスは構造的に不可能です。
  • Tamper-evident audit log: すべてのリクエストはチェーンハッシュ(chain_hash[n] = sha256(chain_hash[n-1] || row_n))付きで監査ログに記録されます。事後の改ざんはハッシュの不一致により即座に検知されます。
  • Credentials.read alerting: すべての credentials.read 呼び出しは専用の監査エントリーを生成し、必要に応じてアカウントオーナーに確認メールが送信されます。
  • SSRF-guarded webhooks: Webhook URL は保存前に検証されます:HTTPS 必須、DNS 解決はパブリック IP のみを返す必要があります(RFC1918 不可、リンクローカル不可)。

リセラー側でのベストプラクティス

  • シークレットはシークレットマネージャー(HashiCorp Vault、AWS Secrets Manager、Doppler、1Password)に保管してください。コード内や Git リポジトリには絶対に置かないでください。
  • シークレットは定期的にローテーションしてください(少なくとも年 1 回、または人事異動時)。カスタマーポータルからワンクリックで実行でき、旧シークレットは即座に無効化されます。
  • ユースケースごとに最小スコープの専用キーを 1 つ用意してください(可能なら読み取り専用)。「神モード」キーは作らないでください。
  • 統合が固定 IP(クラウド、踏み台)から実行される場合は IP 許可リストを設定してください。
  • Idempotency-Key はサーバー側で生成して永続化し、再試行のたびに新しい値を生成しないでください。推奨:論理的な注文ごとに UUIDv4 を使用してください。
  • 自社の URL に Webhook を設定し、少なくとも order.created と credentials.read をイベントストリームとして監視してください。

セキュリティ報告

セキュリティ上の問題は security@kernelhost.com まで内密にご報告ください。PGP 鍵はご請求に応じて提供します。24 時間以内の返信を保証します。バグバウンティプログラムは準備中です。