Mengamankan Ejen AI dengan Alatan MCP Laravel

Memberi ejen AI akses ke aplikasi anda melalui MCP adalah seperti menyerahkan satu set kunci kepada seseorang. Jika anda tidak menetapkan peraturan, mereka mungkin membuka pintu yang salah.

Baru-baru ini, saya membina alatan MCP untuk aplikasi Laravel berbilang penyewa (multi-tenant). Saya mempunyai satu matlamat: membolehkan ejen mengendalikan aplikasi tanpa membiarkannya melihat data orang lain.

Masalah dengan Alatan MCP

Setiap alatan MCP adalah satu titik akhir (endpoint). Ejen memanggil alatan, dan pelayan anda menjalankan kod. Dalam aplikasi berbilang penyewa, setiap alatan mesti menjawab dua soalan:

  • Adakah anda dibenarkan melakukan ini?
  • Adakah anda dibenarkan melakukannya dalam organisasi khusus ini?

Jika anda terlepas satu, anda akan membocorkan data.

Mengapa Multi-Tenancy Standard Gagal di Sini

Dalam aplikasi web biasa, anda mempunyai sesi (sessions). Anda menggunakan skop global (global scopes) untuk menapis data mengikut ID organisasi. Ia berfungsi kerana "organisasi semasa" sentiasa ada dalam sesi.

Alatan MCP tidak menggunakan sesi. Ia menggunakan token. Tiada middleware untuk menetapkan konteks penyewa (tenant context). Jika anda bergantung pada skop global yang mencari sesi, ia tidak akan menemui apa-apa. Ia mungkin kemudian memulangkan setiap baris dalam pangkalan data anda. Itu adalah kebocoran data secara senyap.

Penyelesaian: Penapisan Eksplisit

Jangan sesekali bergantung pada skop ambien (ambient scope) dengan pengesahan token. Tapis secara eksplisit setiap masa.

Saya mencipta satu trait tunggal untuk mengendalikan perkara ini:

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();
    }
}

Pendekatan ini mengikut empat peraturan:

  • Gunakan UUID: Jangan sesekali gunakan ID auto-increment. Ejen tidak sepatutnya dapat meneka ID dengan menukar nombor.
  • Sumber Kebenaran Tunggal (Single Source of Truth): Penapis organisasi berada dalam satu trait. Setiap alatan menggunakannya.
  • Gunakan Semula Keizinan (Permissions): Jangan cipta keizinan baharu untuk ejen. Gunakan rentetan keizinan (permission strings) yang sama seperti yang digunakan oleh aplikasi web anda. Ini menghalang ejen daripada mempunyai kuasa yang lebih besar daripada pengguna manusia.
  • Tandakan Kesan Sampingan (Side Effects): Gunakan anotasi untuk menunjukkan jika sesuatu alatan adalah baca-sahaja (read-only) atau boleh-tulis (write-enabled).

Menguji Sempadan

Anda mesti menguji laluan negatif (negative path). Jangan hanya uji jika alatan itu berfungsi. Uji bahawa pengguna dari Organisasi A tidak boleh melihat data dari Organisasi B.

Jika ejen cuba mengakses UUID daripada penyewa lain, alatan tersebut harus memulangkan "tidak ditemui" (not found). Ia tidak sepatutnya memberitahu ejen bahawa data itu wujud tetapi milik orang lain.

Anggap setiap alatan AI sebagai titik akhir yang tidak dipercayai. Disiplin adalah satu-satunya cara untuk memastikan data anda selamat.

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