Laravel MCP கருவிகள் மூலம் AI ஏஜென்ட்களைப் பாதுகாத்தல்

MCP மூலம் உங்கள் செயலியில் ஒரு AI ஏஜென்ட்க்கு அணுகல் வழங்குவது, ஒருவருக்குச் சாவிக் கொத்தை வழங்குவதைப் போன்றது. நீங்கள் விதிகளை வகுக்காவிட்டால், அவர்கள் தவறான கதவுகளைத் திறந்துவிடக்கூடும்.

நான் சமீபத்தில் ஒரு மல்டி-டெனன்ட் (multi-tenant) Laravel செயலிக்காக MCP கருவிகளை உருவாக்கினேன். எனது ஒரே இலக்கு: ஏஜென்ட் மற்றவர்களின் தரவைக் காண அனுமதிக்காமல், செயலியை இயக்க அனுமதிப்பதே ஆகும்.

MCP கருவிகளில் உள்ள சிக்கல்

ஒவ்வொரு MCP கருவியும் ஒரு எண்ட்பாயிண்ட் (endpoint) ஆகும். ஒரு ஏஜென்ட் ஒரு கருவியைக் அழைக்கும்போது, உங்கள் சர்வர் குறியீட்டை (code) இயக்கும். ஒரு மல்டி-டெனன்ட் செயலியில், ஒவ்வொரு கருவியும் இரண்டு கேள்விகளுக்குப் பதிலளிக்க வேண்டும்:

  • இதைச் செய்ய உங்களுக்கு அனுமதி உள்ளதா?
  • இந்த குறிப்பிட்ட நிறுவனத்தில் (organization) இதைச் செய்ய உங்களுக்கு அனுமதி உள்ளதா?

இதில் ஒன்றை நீங்கள் தவறவிட்டாலும், தரவு கசிவு (data leak) ஏற்படக்கூடும்.

ஏன் சாதாரண மல்டி-டெனன்சி (Multi-Tenancy) இங்கே தோல்வியடைகிறது

ஒரு சாதாரண இணையச் செயலியில் (web app), உங்களிடம் செஷன்கள் (sessions) இருக்கும். நிறுவனத்தின் ID மூலம் தரவை வடிகட்ட நீங்கள் குளோபல் ஸ்கோப்களை (global scopes) பயன்படுத்துவீர்கள். "தற்போதைய நிறுவனம்" எப்போதும் செஷனில் இருப்பதால் இது வேலை செய்கிறது.

MCP கருவிகள் செஷன்களைப் பயன்படுத்துவதில்லை. அவை டோக்கன்களைப் (tokens) பயன்படுத்துகின்றன. டெனன்ட் சூழலை (tenant context) அமைக்க அங்கு மிட்ல்வேர் (middleware) இல்லை. நீங்கள் செஷனைத் தேடும் குளோபல் ஸ்கோப்பைச் சார்ந்திருந்தால், அது எதையும் கண்டறியாது. அதன் விளைவாக, உங்கள் தரவுத்தளத்தில் உள்ள அனைத்து வரிசைகளையும் (rows) அது திருப்பித் தரக்கூடும். இது ஒரு அமைதியான தரவு கசிவு (silent data leak) ஆகும்.

தீர்வு: வெளிப்படையான வடிகட்டுதல் (Explicit Filtering)

டோக்கன் அங்கீகாரத்துடன் (token authentication) இருக்கும் சூழலில், மறைமுகமான ஸ்கோப்பை (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) ID-களை ஒருபோதும் பயன்படுத்த வேண்டாம். எண்களை மாற்றுவதன் மூலம் ஏஜென்ட்கள் ID-களைக் கண்டறியும் வகையில் இருக்கக்கூடாது.
  • ஒற்றை உண்மை ஆதாரம் (Single Source of Truth): நிறுவன வடிகட்டி (organization filter) ஒரே ஒரு ட்ரெயிட்டில் இருக்கும். ஒவ்வொரு கருவியும் அதைப் பயன்படுத்தும்.
  • அனுமதிகளை மறுபயன்பாடு செய்யவும்: ஏஜென்ட்களுக்காகப் புதிய அனுமதிகளை உருவாக்க வேண்டாம். உங்கள் இணையச் செயலி பயன்படுத்தும் அதே அனுமதி சரங்களை (permission strings) பயன்படுத்தவும். இது ஏஜென்ட், மனித பயனரை விட அதிக அதிகாரம் பெறுவதைத் தடுக்கும்.
  • பக்க விளைவுகளைக் (Side Effects) குறிக்கவும்: ஒரு கருவி 'read-only' அல்லது 'write-enabled' தானா என்பதைக் காட்ட அனோடேஷன்களைப் (annotations) பயன்படுத்தவும்.

எல்லைகளைச் சோதித்தல் (Testing the Boundary)

நீங்கள் எதிர்மறைப் பாதையை (negative path) சோதிக்க வேண்டும். கருவி வேலை செய்கிறதா என்று மட்டும் சோதிக்க வேண்டாம். நிறுவனம் A-விலிருந்து வரும் ஒரு பயனர் நிறுவனம் B-யின் தரவைக் காண முடியாது என்பதைச் சோதிக்கவும்.

ஒரு ஏஜென்ட் மற்றொரு டெனன்டின் UUID-ஐ அணுக முயன்றால், கருவி "not found" என்று பதிலளிக்க வேண்டும். தரவு உள்ளது, ஆனால் அது வேறொருவருக்குச் சொந்தமானது என்று ஏஜென்ட்டிடம் சொல்லக்கூடாது.

ஒவ்வொரு AI கருவியையும் நம்பகமற்ற எண்ட்பாயிண்டாகக் கருதவும். உங்கள் தரவைப் பாதுகாப்பாக வைத்திருக்க ஒழுக்கமே ஒரே வழி.

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