Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

PII 検出

最終更新 Markdown で表示Agent セットアップ

AI Security for Apps(旧称 Firewall for AI)は、受信した LLM プロンプト内の個人識別情報(PII)を検出できます。PII 検出には 2 つの方法があり、組み合わせて多層防御にできます。

  • AI ベースの検出 — AI Security for Apps は、AI モデルを使い、プロンプト内容から一般的な PII の種類を特定します。自然言語や想定外の形式で現れる PII も拾えます。
  • 完全一致検出(正規表現) — 生のリクエスト本文に対する正規表現で、WAF カスタムルールを書きます。形式が決まっている組織固有の識別子に向きます。

AI ベースの PII 検出

AI Security for Apps が有効で、cf-llm ラベル付きエンドポイントにリクエストが届くと、プロンプトをスキャンして PII を探し、次の 2 つのフィールドを設定します。

検出は、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 を返します。PERSONDATE_TIMELOCATION のような広いカテゴリも含まれ、通常の会話にもよく現れます。このフィールドだけを根拠にブロックすると、多くのアプリケーションで誤検知が多くなります。

代わりに cf.llm.prompt.pii_categories に対してルールを作り、ユースケースで必要なカテゴリだけを列挙してください。たとえば、カスタマーサポートのチャットボットでは、クレジットカード番号と SSN はブロックし、人名と日付は無視してよい場合があります。いちばん狭いカテゴリ集合から始め、Security Analytics で一致を監視し、必要なときだけ広げます。

ルール例 — AI ベースの検出

PII を含むリクエストをすべてブロックする

  • 受信リクエストが次に一致する場合:

    フィールド 演算子
    LLM PII Detected equals True

    エディターを使う場合の式:
    (cf.llm.prompt.pii_detected)

  • アクション: Block

特定の PII カテゴリだけをブロックする

  • 受信リクエストが次に一致する場合:

    フィールド 演算子
    LLM PII Categories is in Credit Card

    エディターを使う場合の式:
    (any(cf.llm.prompt.pii_categories[*] in {"CREDIT_CARD"}))

  • アクション: Block

メールアドレスはログし、クレジットカードと SSN はブロックする

次の 2 つの カスタムルール を作成します。

  1. アクションが Block で、次の式のルール:
    (any(cf.llm.prompt.pii_categories[*] in {"CREDIT_CARD" "US_SSN"}))

  2. アクションが Log で、次の式のルール:
    (any(cf.llm.prompt.pii_categories[*] in {"EMAIL_ADDRESS"}))

完全一致の PII 検出(正規表現)

組織固有の カスタム PII 形式(社内の従業員 ID、患者記録番号、独自の口座識別子など)を検出する必要がある場合は、生本文(http.request.body.raw フィールド)への正規表現一致を使う WAF カスタムルール を作成できます。

この方法は、あらかじめ決めたパターン(組織固有の識別子を含む)に一致させることで、AI ベースの検出を補完します。

例: 従業員 ID を検出する

次の例では、組織が 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 カテゴリのいずれかを検出した場合、または正規表現がカスタム識別子形式に一致した場合に、リクエストをブロックします。

役に立ちましたか?