セキュリティ考慮事項
LLM アプリ特有のリスクを理解しましょう。
1. Prompt Injection (プロンプトインジェクション)
ユーザー入力や外部ドキュメントに 「これまでの指示を無視して〜」 が含まれているケース。
Direct Prompt Injection
ユーザーが直接プロンプトで攻撃。
Indirect Prompt Injection
取り込んだ外部ドキュメント (Web 記事、PDF) に攻撃文が埋め込まれているケース。 RAG ・ Tool Use 経由で起きやすい。
対策:
- ユーザー入力を XML タグで明示的に囲む。
- system に「
2. Data Exfiltration (データ漏洩)
モデルが意図せず機密情報を出力するリスク。
対策: - system に出してよい情報・出してはいけない情報を明記。 - 出力に対する DLP (Data Loss Prevention) フィルタ。 - 監査ログ。 - LLM のログ自体に PII を含めない。
3. SSRF / Command Injection
ツール経由で実行されるコマンド・URL の検査。
対策: - ツール側で 入力をホワイトリスト検証。 - shell ではなく 引数配列 で実行。 - ネットワークは VPC 内に限定。 - 内部 IP (169.254.169.254 メタデータ等) へのアクセスをブロック。
4. API キー管理
- 環境変数 + シークレットマネージャ。
- フロントに置かない。
- ローテーションを定期実施。
- リクエスト数異常検知でアラート。
- 1 環境 1 キーで blast radius を制限。
5. Indirect Prompt Injection (再掲)
外部から取り込んだファイル (PDF / Web) に隠された悪意ある指示。
対策: - 取得元を限定。 - 重要操作は人間承認。 - 取得ドキュメントには「指示として扱わない」ラベル。
6. PII の取り扱い
ユーザーの個人情報をログに残さない。 metadata.user_id はハッシュ化、prompt 自体に PII を入れない設計が望ましい。
import hashlib
def hash_user(email: str) -> str:
return hashlib.sha256(f"app-salt:{email}".encode()).hexdigest()[:16]
7. Output filtering
Claude の応答を そのままユーザーに見せない 設計が安全。 - 不適切表現の検査 - 機密ワード検査 - 構造的な検証 (JSON Schema 等)
8. Tool 副作用の制御
- DB 書き込み・送金などの 破壊的操作 は人間承認を挟む
- DR (read-only) ツールから始める
- Audit log を残す
Defense in Depth (多層防御)
[ Web WAF ]
↓
[ アプリレイヤ入力検査 ]
↓
[ Claude system プロンプト (制約) ]
↓
[ Tool レベル検証 ]
↓
[ 出力フィルタ ]
↓
[ 監査ログ ]
複数層を組み合わせて、1 層が破られても次が守る設計を。
試す
セキュリティ設計のレビューを依頼。
私たちは「お問い合わせ自動応答ボット」を Claude API で実装します。ユーザー質問を受け、社内 RAG で社内ドキュメントから回答する設計です。考慮すべきセキュリティリスクを 7 つ挙げ、各リスクに対する対策を 1 文で示してください。