Главный принцип
Модель не должна решать, имеет ли пользователь доступ. Identity проверяется на gateway, права вычисляет policy layer, retrieval видит только разрешённое множество, и лишь затем chunks попадают в prompt.
Доверенная identity
Не принимайте tenant_id или role из произвольного body. Используйте проверенный token, серверную сессию и mapping на внутренний principal. Сохраняйте decision ID для аудита.
Security trimming до генерации
Фильтруйте candidates на search layer или в изолированном permission-aware retriever. Удалить секрет из готового ответа сложнее и ненадёжнее, чем не передать его модели.
ACL при ingestion и query
Документ хранит нормализованные principals или policy reference. Изменение прав требует быстрой переиндексации или внешней проверки. Определите поведение при недоступности policy service: для закрытых данных fail closed.
Кэши и shared memory
Query cache, semantic cache и agent memory включают tenant, user scope, policy version и модель. Общий ключ только по тексту запроса способен вернуть ответ, построенный на чужих документах.
Цитаты тоже чувствительны
Даже название файла, URL и snippet могут раскрыть существование закрытого объекта. Citation renderer повторно проверяет права и не выдаёт source metadata вне scope.
Проверка изоляции
Автоматизируйте negative tests: пользователь A запрашивает уникальный marker B; права меняются во время сессии; документ удаляется; cache прогрет другим tenant. Любое появление marker — критический инцидент.