📋 開発前チェックリスト

新しいAPIエンドポイントを開発する前に確認すべき項目。

  • API仕様書(OpenAPI)が作成されている
  • 認証・認可の方式が決定されている
  • 入力パラメータの型・制約が定義されている
  • レスポンスに含めるフィールドが明確に定義されている
  • エラーレスポンスの形式が統一されている
  • レート制限の要件が定められている
  • 個人情報・機密データの取り扱いが確認されている
  • 認証方式が決定されている(OAuth2.0, JWT, APIキー)
  • 各エンドポイントに必要な権限(スコープ/ロール)が定義されている
  • リソースレベルの認可チェックが設計されている(BOLA対策)
  • 管理者向け機能は明確に分離されている
  • トークンの有効期限・リフレッシュ方式が決定されている
  • 通信はTLS 1.2以上を使用
  • 保存データの暗号化方式が決定されている
  • 個人情報のマスキング・匿名化方針が決定されている
  • ログに機密情報(トークン、パスワード)を含めない
  • APIレスポンスにデバッグ情報やスタックトレースを含めない

👀 コードレビュー観点

APIのコードレビュー時に確認すべきセキュリティ観点。

確認項目重要度解説
全エンドポイントで認証ミドルウェアが適用されている必須公開APIを除き、認証チェックが漏れていないか
オブジェクトレベルの認可チェックがある必須リクエストされたリソースが本人のものか確認
管理者機能にロール検証がある必須一般ユーザーが管理APIを呼べないか
JWT検証時にアルゴリズムを指定している必須alg: none 攻撃の防止
トークンの有効期限が適切に設定されている推奨アクセストークン: 15分以内
確認項目重要度解説
リクエストボディのスキーマバリデーションがある必須型・長さ・形式の検証
SQLクエリがパラメータ化されている必須文字列結合でクエリを組み立てていないか
パスパラメータの形式検証がある必須UUID形式など、期待する形式かチェック
ページネーションパラメータに上限がある推奨limit=999999のような過大リクエスト防止
ファイルアップロードの型・サイズ制限がある推奨Content-Typeとファイルサイズの検証
確認項目重要度解説
レスポンスに不要なフィールドが含まれていない必須password_hash, 内部ID等の漏洩防止
エラーレスポンスにスタックトレースが含まれていない必須本番環境で内部情報を露出させない
セキュリティヘッダーが設定されている推奨X-Content-Type-Options, HSTS等
Content-Typeが正しく設定されている推奨application/json を明示的に指定
確認項目重要度解説
レート制限が適用されている必須特に認証・決済系エンドポイント
適切なログが記録されている推奨誰が何をいつ行ったか追跡可能
秘密情報がハードコードされていない必須環境変数・シークレットマネージャーを使用
CORS設定が適切である推奨ワイルドカード使用を避ける
依存パッケージに既知の脆弱性がない推奨npm audit / Snyk の結果を確認

📜 セキュリティポリシーテンプレート

社内のAPI開発における基本ポリシーのテンプレートです。プロジェクトに合わせてカスタマイズしてください。

1. 認証ポリシー

Policyテンプレート
■ 認証方式
  - ユーザー向けAPI: OAuth 2.0 (Authorization Code + PKCE)
  - サーバー間API: OAuth 2.0 (Client Credentials) または mTLS
  - 外部連携API: APIキー + HMAC署名

■ トークン管理
  - アクセストークン有効期限: 15分
  - リフレッシュトークン有効期限: 7日(ローテーション必須)
  - トークン保存: HttpOnly + Secure + SameSite Cookie

■ パスワードポリシー
  - 最小12文字、大文字・小文字・数字・記号を各1つ以上
  - bcrypt (cost factor 12以上) でハッシュ化
  - パスワードリスト攻撃対策(Have I Been Pwned API連携)

2. API設計ポリシー

Policyテンプレート
■ バージョニング
  - URLパスでバージョン管理: /api/v1/resources
  - 旧バージョンは最低6ヶ月のサポート期間を設ける
  - 廃止予定はDeprecationヘッダーで通知

■ レート制限(デフォルト値)
  - 一般API: 100リクエスト/15分
  - 認証API: 5リクエスト/15分
  - 公開API: 30リクエスト/分
  - RateLimit-* ヘッダーを常に返却

■ レスポンス
  - Content-Type: application/json 固定
  - エラーレスポンスは RFC 7807 (Problem Details) 形式
  - 本番環境でスタックトレースを返さない
  - ページネーション: デフォルト20件、最大100件

3. ログ・監査ポリシー

Policyテンプレート
■ 必須ログ項目
  - タイムスタンプ (ISO 8601, UTC)
  - リクエストID(トレーサビリティ用UUID)
  - ユーザーID / APIクライアントID
  - HTTPメソッド + エンドポイント
  - ステータスコード
  - ソースIP
  - レスポンスタイム

■ 禁止ログ項目(機密情報)
  - パスワード / トークン / APIキー
  - クレジットカード番号
  - 個人を特定できる情報のフル表示(マスキング必須)

■ 監視アラート
  - 認証失敗: 5回/分 以上で通知
  - 403エラー: 10回/分 以上で通知
  - 500エラー: 1回で即時通知
  - レート制限超過: パターン分析

🚨 インシデント対応フロー

Phase 1: 検知

監視アラート、ユーザー報告、外部通報などによりインシデントを検知。初期トリアージで重要度を判定。

0〜30分

Phase 2: 封じ込め

被害拡大を防止。APIキーの無効化、該当エンドポイントの一時停止、影響範囲の特定。

30分〜2時間

Phase 3: 根絶・復旧

脆弱性の修正、パッチ適用、サービス復旧。影響を受けたユーザーへの通知。

2〜24時間

Phase 4: 事後分析

ポストモーテム実施。根本原因分析、再発防止策の策定、ドキュメント化。

1〜5営業日

🤖 AI / LLMセキュリティチェックリスト

AIモデルやLLM搭載機能を統合するシステム向けの追加チェック項目。

  • モデルプロバイダーのセキュリティとコンプライアンスが評価済みである(SOC 2、データ処理契約)
  • システムプロンプトが安全に保管され、エンドユーザーに公開されていない
  • リクエスト単位・ユーザー単位でトークン予算とコスト上限が設定されている
  • 外部LLM APIに送信可能なデータをデータ分類ポリシーで定義している
  • LLMの出力がレンダリングや後続処理の前に検証・サニタイズされている
  • モデルの利用不可時や応答品質低下時のフォールバック動作が定義されている
  • 予期しない動作変更を防ぐためのモデルバージョン固定戦略が文書化されている
  • エージェントの権限は最小権限の原則に従っている — 必要なツールとAPIのみアクセス可能
  • ツール/関数呼び出しは明示的な許可リスト(拒否リストではない)を使用している
  • 影響度の高い操作(決済、削除、外部通信)にはHuman-in-the-loop承認が必要
  • エージェントのメモリスコープが制限されている — 会話履歴がテナントやセッション間で漏洩しない
  • エージェント間通信が認証済みで、署名付きメッセージを使用している
  • 目標逸脱の検知が実装されている — 意図した目的からの逸脱が監視されている
  • エージェントの実行を即座に停止できる緊急キルスイッチが存在する
  • 学習データの出所がリネージュトラッキングにより文書化されている
  • 学習およびファインチューニング用データセットにデータ整合性チェックが存在する(ハッシュ検証)
  • モデルアーティファクトがバージョン管理され、改ざん防止レジストリに保存されている
  • 性能劣化を検知するためのモデルドリフト監視が導入されている
  • サードパーティのモデルとエンベディングが既知の脆弱性について評価済みである
  • 学習データセットにPIIおよび機密データのスクラビングが適用されている

🧐 AI / LLMコードレビュー観点

LLM、AIエージェント、MLモデルを統合するコードに特化したセキュリティ確認項目。

確認項目重要度解説
システムプロンプトがクライアント側コードやAPIレスポンスに公開されていない必須プロンプト漏洩は標的型プロンプトインジェクション攻撃を可能にする
LLMの出力がレンダリング前に検証されている(HTML/JS/SQL)必須LLM生成コンテンツにXSSペイロードやインジェクションベクターが含まれる可能性がある
プロンプト内でユーザー入力とシステム指示が明確に分離されている必須指示とデータの境界を維持することで直接的なプロンプトインジェクションを防止
ツール/関数呼び出しの権限がユーザーロールごとにスコープされている必須エージェントのツールアクセスを通じた権限昇格を防止
リクエスト単位・セッション単位でトークン数の上限が適用されている推奨コスト爆発およびDenial-of-Wallet攻撃を防止
RAGの検索結果がプロンプトに挿入される前にサニタイズされている必須取得されたドキュメントに間接的なプロンプトインジェクションペイロードが含まれる可能性がある
エージェントのアクションとツール呼び出しが完全な監査証跡付きで記録されている推奨AIシステムにおけるインシデント調査とコンプライアンスに不可欠

📑 AI / LLMセキュリティポリシーテンプレート

AIモデルおよびLLM搭載アプリケーションを展開する組織向けのポリシーテンプレート。

4. AIモデルアクセス制御ポリシー

Policyテンプレート
■ モデルアクセス階層
  - Tier 1(制限付き): GPT-4クラス / ファインチューニング済みモデル — チームリーダーの承認が必要
  - Tier 2(標準): GPT-3.5クラス / エンベディング — 全開発者が利用可能
  - Tier 3(オープン): オープンソースモデル(ローカル推論) — 承認不要

■ LLMプロバイダー向けAPIキー管理
  - サービス/環境ごとに1つのAPIキー(プロジェクト間で共有しない)
  - 予算の50%、80%、100%で月次支出アラートを設定
  - プロバイダーレベルでハードスペンディングキャップを適用
  - キーローテーション: 90日ごと、またはチームメンバー離脱時に即時

■ 外部モデルへの送信データ
  - 送信禁止: PII、認証情報、内部IP、ソースコード、顧客データ
  - レビュー付きで許可: 匿名化ログ、公開ドキュメント、合成データ
  - 外部APIへのすべてのプロンプトを記録すること(PIIを除く)

5. AIデータ取り扱いポリシー

Policyテンプレート
■ 学習データ要件
  - すべての学習データに出所とライセンスが文書化されていること
  - 学習/ファインチューニングに使用する前にPIIを削除または匿名化すること
  - データポイズニング対策: ハッシュ検証によるデータ整合性の確認
  - 再現性と監査のために学習データのスナップショットを保持

■ RAG(検索拡張生成)データ
  - ドキュメント取り込みパイプラインでコンテンツをサニタイズ(スクリプト・インジェクション除去)
  - ベクトルストアのアクセス制御はソースドキュメントの権限と一致させること
  - エンベディングモデルはバージョン管理し固定すること

■ モデル出力データ
  - LLMの出力を権威あるものとして信頼しない — 必ず事実を検証
  - 生成されたコードは人間が書いたコードと同じセキュリティレビューを受けること
  - PIIを含む出力は保存前にフラグ付けし、編集(リダクト)すること

6. AIインシデント分類ポリシー

Policyテンプレート
■ AI固有インシデントの重大度レベル
  - P1(重大): データ流出や不正操作につながるプロンプトインジェクション
  - P1(重大): モデル配信の侵害または改ざんされた出力の返却
  - P2(高): 学習データポイズニングの検出、ジェイルブレイクバイパスの発見
  - P2(高): 承認範囲外でエージェントが意図しない操作を実行
  - P3(中): モデルドリフトによる精度低下がしきい値を下回る
  - P4(低): 過剰なトークン使用によるコスト超過

■ 対応手順
  - P1: 影響を受けたモデルエンドポイントを即時無効化し、セキュリティチームに通知
  - P2: 影響を受けたモデルバージョンを隔離し、最後の正常版にロールバック
  - P3: 再学習パイプラインをトリガーし、監視頻度を引き上げ
  - P4: レート制限と予算上限を調整し、利用パターンをレビュー

■ インシデント後の要件
  - P1/P2に対して48時間以内に根本原因分析を実施
  - 新たな攻撃ベクターでプロンプトインジェクションテストスイートを更新
  - ガードレール設定のレビューおよび更新

クイックリファレンス: HTTPステータスコード

API設計で使用するセキュリティ関連のHTTPステータスコード。

コード意味使用場面
400Bad Request入力バリデーションエラー
401Unauthorized認証が必要、またはトークンが無効
403Forbidden認証済みだが権限が不足
404Not Foundリソース不存在(403の代わりにも使用可)
405Method Not Allowed許可されていないHTTPメソッド
413Payload Too Largeリクエストボディのサイズ超過
422Unprocessable Entity構文は正しいがセマンティクスエラー
429Too Many Requestsレート制限超過
500Internal Server Errorサーバー内部エラー(詳細は隠す)