AI-агентам нужны границы, а не мастер-ключи
Предоставление AI-агенту доступа к вашему приложению через MCP — это риск. Вы вручаете связку ключей в надежде, что они откроют только определенные двери. Такое доверие — это угроза безопасности.
При создании MCP-инструментов для многопользовательского (multi-tenant) приложения на Laravel вы должны решить одну задачу: как позволить агенту управлять приложением, не предоставляя доступ к чужим данным.
Каждый MCP-инструмент работает как эндпоинт. Агент вызывает инструмент, и ваш сервер выполняет код. В многопользовательской архитектуре каждый инструмент должен отвечать на два вопроса:
- Разрешено ли вам это делать?
- Разрешено ли вам делать это именно здесь?
Если вы проигнорируете их, вы создадите дыру в безопасности.
Веб-запросы используют сессии для управления многопользовательским режимом. MCP-инструменты используют токены. Здесь нет сессий и нет middleware для установки контекста текущего тенанта. Если вы полагаетесь на глобальные области видимости (global scopes), которые ищут «текущую организацию» в сессии, они ничего не найдут. Запрос, который должен быть ограниченным, может вернуть все строки из вашей базы данных.
Чтобы оставаться в безопасности, я использую эти четыре правила:
- Явная фильтрация: Никогда не полагайтесь на неявную область видимости (ambient scope) при аутентификации по токену. Всегда используйте один и тот же trait для фильтрации по организации.
- Используйте UUID: Никогда не используйте автоинкрементные ID. Используйте непредсказуемые идентификаторы, чтобы агенты не могли угадать другие записи.
- Повторно используйте разрешения: Не создавайте новые наборы разрешений для агентов. Используйте те же строки способностей (ability strings), что и ваше веб-приложение.
- Помечайте побочные эффекты: Используйте аннотации, чтобы пометить инструменты как «только для чтения» (read-only) или «с возможностью записи» (write-enabled).
Используя один trait для поиска организации, вы создаете единую точку для аудита. Если поиск возвращает null, инструмент сообщает агенту, что запись не найдена. Агент не получает никакой информации о других тенантах.
Это не проблема AI. Это проблема многопользовательской архитектуры и авторизации. MCP упрощает доступ к вашему приложению, поэтому вы должны строго соблюдать границы.
Агент должен делать именно то, что может делать человек в рамках своего собственного тенанта, и ничего больше.
Optional learning community: https://t.me/GyaanSetuAi
