ایمن‌سازی عامل‌های هوش مصنوعی با ابزارهای MCP در لاراول

دادن دسترسی به یک عامل هوش مصنوعی از طریق MCP، مانند دادن دسته‌کلید به کسی است. اگر قوانینی تعیین نکنید، ممکن است آن‌ها درهای اشتباهی را باز کنند.

من اخیراً ابزارهای MCP را برای یک اپلیکیشن چندمستاجری (multi-tenant) در لاراول ساختم. من یک هدف داشتم: اجازه دادن به عامل برای هدایت اپلیکیشن، بدون اینکه اجازه داشته باشد داده‌های دیگران را ببیند.

مشکل ابزارهای MCP

هر ابزار MCP یک نقطه اتصال (endpoint) است. یک عامل ابزاری را فراخوانی می‌کند و سرور شما کد را اجرا می‌کند. در یک اپلیکیشن چندمستاجری، هر ابزار باید به دو سوال پاسخ دهد:

  • آیا اجازه انجام این کار را دارید؟
  • آیا اجازه دارید این کار را در این سازمان خاص انجام دهید؟

اگر یکی را از قلم بیندازید، داده‌ها را لو می‌دهید.

چرا چندمستاجری استاندارد در اینجا شکست می‌خورد

در یک اپلیکیشن وب معمولی، شما نشست‌ها (sessions) را دارید. از اسکوپ‌های سراسری (global scopes) برای فیلتر کردن داده‌ها بر اساس شناسه سازمان استفاده می‌کنید. این روش کار می‌کند زیرا «سازمان فعلی» همیشه در نشست موجود است.

ابزارهای MCP از نشست‌ها استفاده نمی‌کنند؛ آن‌ها از توکن‌ها استفاده می‌کنند. هیچ میان‌افزاری (middleware) برای تنظیم بافت (context) مستاجر وجود ندارد. اگر به یک اسکوپ سراسری که به دنبال نشست می‌گردد تکیه کنید، چیزی پیدا نخواهد کرد. در این صورت ممکن است تمام ردیف‌های پایگاه داده شما را برگرداند. این یک نشت داده خاموش است.

راه حل: فیلتر کردن صریح

هرگز در احراز هویت مبتنی بر توکن، به اسکوپ‌های محیطی (ambient scope) تکیه نکنید. هر بار به صورت صریح فیلتر کنید.

من یک trait واحد برای مدیریت این موضوع ایجاد کردم:

trait ResolvesOrgEvents
{
    protected function resolveOrgEvent(Authenticatable $user, string $uuid): ?Event
    {
        if (empty($user->organization_id)) {
            return null;
        }

        return Event::query()
            ->withOrganization($user->organization_id)
            ->where('uuid', $uuid)
            ->first();
    }
}

این رویکرد از چهار قانون پیروی می‌کند:

  • استفاده از UUID: هرگز از شناسه‌های خودافزا (auto-increment) استفاده نکنید. عامل‌ها نباید بتوانند با تغییر یک عدد، شناسه‌ها را حدس بزنند.
  • منبع واحد حقیقت: فیلتر سازمان در یک trait قرار دارد. هر ابزار از آن استفاده می‌کند.
  • استفاده مجدد از مجوزها: برای عامل‌ها مجوزهای جدید اختراع نکنید. از همان رشته‌های مجوزی استفاده کنید که اپلیکیشن وب شما استفاده می‌کند. این کار از داشتن قدرت بیشترِ عامل نسبت به کاربر انسانی جلوگیری می‌کند.
  • مشخص کردن اثرات جانبی: از یادداشت‌ها (annotations) استفاده کنید تا نشان دهید آیا یک ابزار فقط‌خواندنی است یا قابلیت نوشتن دارد.

تست کردن مرزها

شما باید مسیر منفی را تست کنید. فقط تست نکنید که آیا ابزار کار می‌کند یا خیر؛ بلکه تست کنید که آیا کاربری از سازمان A می‌تواند داده‌های سازمان B را ببیند یا خیر.

اگر یک عامل سعی کند به یک UUID از مستاجر دیگری دسترسی پیدا کند، ابزار باید عبارت "not found" را برگرداند. ابزار نباید به عامل بگوید که داده وجود دارد اما متعلق به شخص دیگری است.

با هر ابزار هوش مصنوعی مانند یک نقطه اتصال غیرقابل اعتماد رفتار کنید. انضباط تنها راه برای ایمن نگه داشتن داده‌های شماست.

منبع: https://dev.to/nasrulhazim/giving-an-ai-agent-the-keys-without-giving-it-the-building-rbac-org-scoped-mcp-tools-in-laravel-43oi