← Документация WAF / detections / ai-security-for-apps
Обнаружение PII
AI Security for Apps (ранее Firewall for AI) может обнаруживать персональные данные (PII) во входящих LLM-промптах. Существует два подхода к обнаружению PII, и их можно использовать вместе для многоуровневой защиты:
- Обнаружение на основе ИИ — AI Security for Apps использует ИИ-модель для выявления распространённых типов PII в содержимом промпта. Такой подход обнаруживает PII, даже когда они встречаются в естественном языке или в неожиданных форматах.
- Точное обнаружение (regex) — вы пишете пользовательское правило WAF с регулярным выражением по сырому телу запроса. Этот подход идеален для внутренних идентификаторов организации с известным, предсказуемым форматом.
Обнаружение PII на основе ИИ
Когда AI Security for Apps включён и запрос приходит на cf-llm (endpoint с меткой), промпт сканируется на наличие PII и заполняются два поля:
- Обнаружен PII в LLM (
cf.llm.prompt.pii_detected) —true, если были найдены какие-либо PII. - Категории PII для LLM (
cf.llm.prompt.pii_categories) — массив конкретных обнаруженных типов PII.
Обнаружение работает на AI-модели распознавания именованных сущностей (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 (поле) возвращает true при обнаружении любой категории PII — включая широкие категории, такие как PERSON, DATE_TIME и LOCATION , которые часто встречаются в обычной переписке. Блокировка только по этому полю даст высокий уровень ложных срабатываний для большинства приложений.
Вместо этого стройте правила на основе cf.llm.prompt.pii_categories и перечислите только те категории, которые важны для вашего сценария. Например, чат-боту поддержки может потребоваться блокировать номера банковских карт и SSN, но он может спокойно игнорировать имена людей и даты. Начните с самого узкого набора категорий, отслеживайте совпадения в Security Analytics и расширяйте только по мере необходимости.
Примеры правил — обнаружение на основе ИИ
Блокировка любого запроса, содержащего PII
-
Когда входящие запросы соответствуют:
Поле Оператор Значение LLM PII Detected равно 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
Создайте два пользовательские правила:
-
Правило с действием Block и следующее выражение:
(any(cf.llm.prompt.pii_categories[*] in {"CREDIT_CARD" "US_SSN"})) -
Правило с действием Log и следующее выражение:
(any(cf.llm.prompt.pii_categories[*] in {"EMAIL_ADDRESS"}))
Точное обнаружение PII (regex)
Если вам нужно обнаруживать пользовательские форматы PII , специфичные для вашей организации — внутренние идентификаторы сотрудников, номера карт пациентов, собственные идентификаторы аккаунтов, — вы можете создать в WAF пользовательское правило с помощью regex-сопоставления по сырому телу (http.request.body.raw поле).
Этот подход дополняет AI-обнаружение сопоставлением заранее определённых паттернов, включая идентификаторы, специфичные для организации.
Пример: обнаружение идентификаторов сотрудников
В следующем примере организация использует идентификаторы сотрудников в формате EMP- и далее ровно шесть цифр (например, EMP-482910).
Создание пользовательского правила со следующей конфигурацией:
-
Когда входящие запросы соответствуют:
Поле Оператор Значение Сырое тело запроса matches regex EMP-[0-9]{6}Выражение при использовании редактора:
(http.request.body.raw matches "EMP-[0-9]{6}") -
Действие: Block
-
With response type: Custom JSON
-
Тело ответа:
{ "error": "Request blocked: employee ID detected in prompt." }
Ограничение конкретным эндпоинтом
Чтобы ограничить это правило только вашей LLM-конечной точкой, добавьте условие по пути:
| Поле | Оператор | Значение | Логика |
|---|---|---|---|
| URI Path | равно | /api/chat |
And |
| Сырое тело запроса | matches regex | EMP-[0-9]{6} |
Выражение при использовании редактора:
(http.request.uri.path eq "/api/chat" and http.request.body.raw matches "EMP-[0-9]{6}")
Дополнительные примеры регулярных выражений
| Пользовательский тип PII | Пример формата | Regex-шаблон |
|---|---|---|
| Идентификатор сотрудника | EMP-482910 |
EMP-[0-9]{6} |
| Номер медицинской карты пациента | PAT/2024/00391 |
PAT/[0-9]{4}/[0-9]{5} |
| Внутренний идентификатор аккаунта | 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проверяет ограниченную часть тела запроса. Точный лимит зависит от плана. - payload в формате JSON. Необработанное тело запроса включает полную структуру JSON. Ваше регулярное выражение должно учитывать, что текст промпта вложен внутрь JSON-строки.
- Производительность. Сложные шаблоны регулярных выражений могут влиять на время оценки правила. Делайте шаблоны настолько конкретными, насколько возможно.
Комбинирование обоих подходов
Для многоуровневой защиты можно использовать одновременно обнаружение на основе ИИ и точное обнаружение:
(cf.llm.prompt.pii_detected or http.request.body.raw matches "EMP-[0-9]{6}")
Это правило блокирует запросы, в которых AI-модель обнаруживает любую встроенную категорию PII либо regex совпадает с вашим пользовательским форматом идентификатора.