開発チーム向けのセキュリティチェックリスト、コードレビュー観点、ポリシーテンプレート。
新しい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開発における基本ポリシーのテンプレートです。プロジェクトに合わせてカスタマイズしてください。
■ 認証方式 - ユーザー向け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連携)
■ バージョニング - 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件
■ 必須ログ項目 - タイムスタンプ (ISO 8601, UTC) - リクエストID(トレーサビリティ用UUID) - ユーザーID / APIクライアントID - HTTPメソッド + エンドポイント - ステータスコード - ソースIP - レスポンスタイム ■ 禁止ログ項目(機密情報) - パスワード / トークン / APIキー - クレジットカード番号 - 個人を特定できる情報のフル表示(マスキング必須) ■ 監視アラート - 認証失敗: 5回/分 以上で通知 - 403エラー: 10回/分 以上で通知 - 500エラー: 1回で即時通知 - レート制限超過: パターン分析
監視アラート、ユーザー報告、外部通報などによりインシデントを検知。初期トリアージで重要度を判定。
0〜30分被害拡大を防止。APIキーの無効化、該当エンドポイントの一時停止、影響範囲の特定。
30分〜2時間脆弱性の修正、パッチ適用、サービス復旧。影響を受けたユーザーへの通知。
2〜24時間ポストモーテム実施。根本原因分析、再発防止策の策定、ドキュメント化。
1〜5営業日AIモデルやLLM搭載機能を統合するシステム向けの追加チェック項目。
関連: LLM06: Excessive Agency, LLM02: Insecure Output Handling
LLM、AIエージェント、MLモデルを統合するコードに特化したセキュリティ確認項目。
| 確認項目 | 重要度 | 解説 |
|---|---|---|
| システムプロンプトがクライアント側コードやAPIレスポンスに公開されていない | 必須 | プロンプト漏洩は標的型プロンプトインジェクション攻撃を可能にする |
| LLMの出力がレンダリング前に検証されている(HTML/JS/SQL) | 必須 | LLM生成コンテンツにXSSペイロードやインジェクションベクターが含まれる可能性がある |
| プロンプト内でユーザー入力とシステム指示が明確に分離されている | 必須 | 指示とデータの境界を維持することで直接的なプロンプトインジェクションを防止 |
| ツール/関数呼び出しの権限がユーザーロールごとにスコープされている | 必須 | エージェントのツールアクセスを通じた権限昇格を防止 |
| リクエスト単位・セッション単位でトークン数の上限が適用されている | 推奨 | コスト爆発およびDenial-of-Wallet攻撃を防止 |
| RAGの検索結果がプロンプトに挿入される前にサニタイズされている | 必須 | 取得されたドキュメントに間接的なプロンプトインジェクションペイロードが含まれる可能性がある |
| エージェントのアクションとツール呼び出しが完全な監査証跡付きで記録されている | 推奨 | AIシステムにおけるインシデント調査とコンプライアンスに不可欠 |
AIモデルおよびLLM搭載アプリケーションを展開する組織向けのポリシーテンプレート。
■ モデルアクセス階層 - Tier 1(制限付き): GPT-4クラス / ファインチューニング済みモデル — チームリーダーの承認が必要 - Tier 2(標準): GPT-3.5クラス / エンベディング — 全開発者が利用可能 - Tier 3(オープン): オープンソースモデル(ローカル推論) — 承認不要 ■ LLMプロバイダー向けAPIキー管理 - サービス/環境ごとに1つのAPIキー(プロジェクト間で共有しない) - 予算の50%、80%、100%で月次支出アラートを設定 - プロバイダーレベルでハードスペンディングキャップを適用 - キーローテーション: 90日ごと、またはチームメンバー離脱時に即時 ■ 外部モデルへの送信データ - 送信禁止: PII、認証情報、内部IP、ソースコード、顧客データ - レビュー付きで許可: 匿名化ログ、公開ドキュメント、合成データ - 外部APIへのすべてのプロンプトを記録すること(PIIを除く)
■ 学習データ要件 - すべての学習データに出所とライセンスが文書化されていること - 学習/ファインチューニングに使用する前にPIIを削除または匿名化すること - データポイズニング対策: ハッシュ検証によるデータ整合性の確認 - 再現性と監査のために学習データのスナップショットを保持 ■ RAG(検索拡張生成)データ - ドキュメント取り込みパイプラインでコンテンツをサニタイズ(スクリプト・インジェクション除去) - ベクトルストアのアクセス制御はソースドキュメントの権限と一致させること - エンベディングモデルはバージョン管理し固定すること ■ モデル出力データ - LLMの出力を権威あるものとして信頼しない — 必ず事実を検証 - 生成されたコードは人間が書いたコードと同じセキュリティレビューを受けること - PIIを含む出力は保存前にフラグ付けし、編集(リダクト)すること
■ AI固有インシデントの重大度レベル - P1(重大): データ流出や不正操作につながるプロンプトインジェクション - P1(重大): モデル配信の侵害または改ざんされた出力の返却 - P2(高): 学習データポイズニングの検出、ジェイルブレイクバイパスの発見 - P2(高): 承認範囲外でエージェントが意図しない操作を実行 - P3(中): モデルドリフトによる精度低下がしきい値を下回る - P4(低): 過剰なトークン使用によるコスト超過 ■ 対応手順 - P1: 影響を受けたモデルエンドポイントを即時無効化し、セキュリティチームに通知 - P2: 影響を受けたモデルバージョンを隔離し、最後の正常版にロールバック - P3: 再学習パイプラインをトリガーし、監視頻度を引き上げ - P4: レート制限と予算上限を調整し、利用パターンをレビュー ■ インシデント後の要件 - P1/P2に対して48時間以内に根本原因分析を実施 - 新たな攻撃ベクターでプロンプトインジェクションテストスイートを更新 - ガードレール設定のレビューおよび更新
API設計で使用するセキュリティ関連のHTTPステータスコード。
| コード | 意味 | 使用場面 |
|---|---|---|
| 400 | Bad Request | 入力バリデーションエラー |
| 401 | Unauthorized | 認証が必要、またはトークンが無効 |
| 403 | Forbidden | 認証済みだが権限が不足 |
| 404 | Not Found | リソース不存在(403の代わりにも使用可) |
| 405 | Method Not Allowed | 許可されていないHTTPメソッド |
| 413 | Payload Too Large | リクエストボディのサイズ超過 |
| 422 | Unprocessable Entity | 構文は正しいがセマンティクスエラー |
| 429 | Too Many Requests | レート制限超過 |
| 500 | Internal Server Error | サーバー内部エラー(詳細は隠す) |