AI Security for Apps(旧称 Firewall for AI)は、受信した LLM プロンプト内の個人識別情報(PII)を検出できます。PII 検出には 2 つの方法があり、組み合わせて多層防御にできます。
- AI ベースの検出 — AI Security for Apps は、AI モデルを使い、プロンプト内容から一般的な PII の種類を特定します。自然言語や想定外の形式で現れる PII も拾えます。
- 完全一致検出(正規表現) — 生のリクエスト本文に対する正規表現で、WAF カスタムルールを書きます。形式が決まっている組織固有の識別子に向きます。
AI Security for Apps が有効で、cf-llm ラベル付きエンドポイントにリクエストが届くと、プロンプトをスキャンして PII を探し、次の 2 つのフィールドを設定します。
- LLM PII detected(
cf.llm.prompt.pii_detected) — PII が見つかった場合はtrueです。 - LLM PII categories(
cf.llm.prompt.pii_categories) — 見つかった具体的な PII 種別の配列です。
検出は、AI ベースの固有表現認識(Named Entity Recognition、NER)モデルで行います。認識するカテゴリの一覧は、cf.llm.prompt.pii_categories フィールドリファレンス を参照してください。
対応している PII カテゴリ
| カテゴリ | 説明 |
|---|---|
BANK_ACCOUNT |
銀行口座番号 |
CREDIT_CARD |
クレジットカード番号 |
DATE_TIME |
日付または時刻の表現 |
DRIVER_LICENSE |
運転免許証番号 |
EMAIL_ADDRESS |
メールアドレス |
IP_ADDRESS |
IPv4 アドレス |
LOCATION |
所在地または住所 |
PASSPORT |
旅券番号 |
PERSON |
個人の氏名(一部または全部) |
PHONE_NUMBER |
電話番号 |
TAX_ID |
納税者番号 |
US_SSN |
米国の社会保障番号(SSN) |
URL |
URL |
cf.llm.prompt.pii_detected フィールドは、いずれかの PII カテゴリが検出されると true を返します。PERSON、DATE_TIME、LOCATION のような広いカテゴリも含まれ、通常の会話にもよく現れます。このフィールドだけを根拠にブロックすると、多くのアプリケーションで誤検知が多くなります。
代わりに cf.llm.prompt.pii_categories に対してルールを作り、ユースケースで必要なカテゴリだけを列挙してください。たとえば、カスタマーサポートのチャットボットでは、クレジットカード番号と SSN はブロックし、人名と日付は無視してよい場合があります。いちばん狭いカテゴリ集合から始め、Security Analytics で一致を監視し、必要なときだけ広げます。
-
受信リクエストが次に一致する場合:
フィールド 演算子 値 LLM PII Detected equals True エディターを使う場合の式:
(cf.llm.prompt.pii_detected) -
アクション: Block
-
受信リクエストが次に一致する場合:
フィールド 演算子 値 LLM PII Categories is in Credit Cardエディターを使う場合の式:
(any(cf.llm.prompt.pii_categories[*] in {"CREDIT_CARD"})) -
アクション: Block
次の 2 つの カスタムルール を作成します。
-
アクションが Block で、次の式のルール:
(any(cf.llm.prompt.pii_categories[*] in {"CREDIT_CARD" "US_SSN"})) -
アクションが Log で、次の式のルール:
(any(cf.llm.prompt.pii_categories[*] in {"EMAIL_ADDRESS"}))
組織固有の カスタム PII 形式(社内の従業員 ID、患者記録番号、独自の口座識別子など)を検出する必要がある場合は、生本文(http.request.body.raw フィールド)への正規表現一致を使う WAF カスタムルール を作成できます。
この方法は、あらかじめ決めたパターン(組織固有の識別子を含む)に一致させることで、AI ベースの検出を補完します。
次の例では、組織が EMP- のあとに数字 6 桁が続く形式(例: EMP-482910)の従業員 ID を使っています。
次の設定で カスタムルールを作成 します。
-
受信リクエストが次に一致する場合:
フィールド 演算子 値 Raw request body matches regex EMP-[0-9]{6}エディターを使う場合の式:
(http.request.body.raw matches "EMP-[0-9]{6}") -
アクション: Block
-
レスポンスタイプ: カスタム JSON
-
レスポンス本文:
{ "error": "Request blocked: employee ID detected in prompt." }
特定のエンドポイントに限定する
このルールを LLM エンドポイントだけに限定するには、パス条件と組み合わせます。
| フィールド | 演算子 | 値 | 論理 |
|---|---|---|---|
| URI Path | equals | /api/chat |
And |
| Raw request body | matches regex | EMP-[0-9]{6} |
エディターを使う場合の式:
(http.request.uri.path eq "/api/chat" and http.request.body.raw matches "EMP-[0-9]{6}")
| カスタム PII の種類 | 形式の例 | 正規表現パターン |
|---|---|---|
| 従業員 ID | EMP-482910 |
EMP-[0-9]{6} |
| 患者記録番号 | PAT/2024/00391 |
PAT/[0-9]{4}/[0-9]{5} |
| 社内アカウント ID | ACCT-XX-99999 |
ACCT-[A-Z]{2}-[0-9]{5} |
| カスタム API キーのプレフィックス | sk_live_abc123... |
sk_live_[a-zA-Z0-9]{20,} |
- Cloudflare プランの要件。 正規表現演算子(
matchesと~)には、Business または Enterprise プランが必要です。 - 本文サイズの上限。
http.request.body.rawフィールドが検査するリクエスト本文は、一部だけです。正確な上限は プランによって異なります。 - JSON ペイロード。 生本文には JSON 構造全体が含まれます。プロンプト文字列は JSON 文字列の内側にあるため、正規表現はその点を踏まえてください。
- パフォーマンス。 複雑な正規表現は、ルール評価時間に影響することがあります。パターンはできるだけ具体的にしてください。
AI ベースの検出と完全一致検出を組み合わせて、多層防御にできます。
(cf.llm.prompt.pii_detected or http.request.body.raw matches "EMP-[0-9]{6}")
このルールは、AI モデルが組み込みの PII カテゴリのいずれかを検出した場合、または正規表現がカスタム識別子形式に一致した場合に、リクエストをブロックします。