Laravel MCP Tools ಮೂಲಕ AI Agents ಗಳನ್ನು ಸುರಕ್ಷಿತಗೊಳಿಸುವುದು

MCP ಮೂಲಕ ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ AI ಏಜೆಂಟ್‌ಗೆ ಪ್ರವೇಶ ನೀಡುವುದು ಎಂದರೆ ಯಾರಿಗಾದರೂ ಕೀಚೈನ್‌ ಅನ್ನು ನೀಡುವುದರಂತೆ. ನೀವು ನಿಯಮಗಳನ್ನು ನಿಗದಿಪಡಿಸದಿದ್ದರೆ, ಅವರು ತಪ್ಪು ಬಾಗಿಲುಗಳನ್ನು ತೆರೆಯಬಹುದು.

ನಾನು ಇತ್ತೀಚೆಗೆ ಮಲ್ಟಿ-ಟೆನೆಂಟ್ (multi-tenant) Laravel ಅಪ್ಲಿಕೇಶನ್‌ಗಾಗಿ MCP ಟೂಲ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಿದೆ. ನನ್ನ ಗುರಿ ಒಂದೇ ಆಗಿತ್ತು: ಏಜೆಂಟ್ ಬೇರೆಯವರ ಡೇಟಾವನ್ನು ನೋಡದಂತೆ ತಡೆಯುತ್ತಲೇ, ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಚಾಲನೆ ಮಾಡಲು ಅದಕ್ಕೆ ಅವಕಾಶ ನೀಡುವುದು.

MCP ಟೂಲ್‌ಗಳ ಸಮಸ್ಯೆ

ಪ್ರತಿಯೊಂದು MCP ಟೂಲ್ ಒಂದು ಎಂಡ್‌ಪಾಯಿಂಟ್ (endpoint). ಏಜೆಂಟ್ ಒಂದು ಟೂಲ್ ಅನ್ನು ಕರೆಯುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಸರ್ವರ್ ಕೋಡ್ ಅನ್ನು ರನ್ ಮಾಡುತ್ತದೆ. ಮಲ್ಟಿ-ಟೆನೆಂಟ್ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ, ಪ್ರತಿಯೊಂದು ಟೂಲ್ ಈ ಎರಡು ಪ್ರಶ್ನೆಗಳಿಗೆ ಉತ್ತರಿಸಬೇಕು:

  • ಇದನ್ನು ಮಾಡಲು ನಿಮಗೆ ಅನುಮತಿ ಇದೆಯೇ?
  • ಈ ನಿರ್ದಿಷ್ಟ ಸಂಸ್ಥೆಯಲ್ಲಿ (organization) ಇದನ್ನು ಮಾಡಲು ನಿಮಗೆ ಅನುಮತಿ ಇದೆಯೇ?

ನೀವು ಒಂದನ್ನು ಮರೆತರೂ, ಡೇಟಾ ಸೋರಿಕೆಯಾಗಬಹುದು.

ಇಲ್ಲಿ ಸಾಮಾನ್ಯ ಮಲ್ಟಿ-ಟೆನೆನ್ಸಿ ಏಕೆ ವಿಫಲವಾಗುತ್ತದೆ?

ಸಾಮಾನ್ಯ ವೆಬ್ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ, ನೀವು ಸೆಷನ್‌ಗಳನ್ನು (sessions) ಹೊಂದಿರುತ್ತೀರಿ. ಆರ್ಗನೈಸೇಶನ್ ID ಮೂಲಕ ಡೇಟಾವನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಲು ನೀವು ಗ್ಲೋಬಲ್ ಸ್ಕೋಪ್‌ಗಳನ್ನು (global scopes) ಬಳಸುತ್ತೀರಿ. ಇದು ಕೆಲಸ ಮಾಡುತ್ತದೆ ಏಕೆಂದರೆ "ಪ್ರಸ್ತುತ ಸಂಸ್ಥೆ" (current organization) ಯಾವಾಗಲೂ ಸೆಷನ್‌ನಲ್ಲಿ ಇರುತ್ತದೆ.

MCP ಟೂಲ್‌ಗಳು ಸೆಷನ್‌ಗಳನ್ನು ಬಳಸುವುದಿಲ್ಲ. ಅವು ಟೋಕನ್‌ಗಳನ್ನು ಬಳಸುತ್ತವೆ. ಟೆನೆಂಟ್ ಸಂದರ್ಭವನ್ನು (tenant context) ಸೆಟ್ ಮಾಡಲು ಯಾವುದೇ ಮಿಡ್ಲ್‌ವೇರ್ (middleware) ಇರುವುದಿಲ್ಲ. ನೀವು ಸೆಷನ್ ಅನ್ನು ಹುಡುಕುವ ಗ್ಲೋಬಲ್ ಸ್ಕೋಪ್ ಮೇಲೆ ಅವಲಂಬಿತರಾಗಿದ್ದರೆ, ಅದು ಏನನ್ನೂ ಕಂಡುಹಿಡಿಯುವುದಿಲ್ಲ. ಆಗ ಅದು ನಿಮ್ಮ ಡೇಟಾಬೇಸ್‌ನ ಎಲ್ಲಾ ಸಾಲುಗಳನ್ನು (rows) ಹಿಂತಿರುಗಿಸಬಹುದು. ಇದು ಮೌನವಾಗಿ ನಡೆಯುವ ಡೇಟಾ ಸೋರಿಕೆ.

ಪರಿಹಾರ: ಸ್ಪಷ್ಟವಾದ ಫಿಲ್ಟರಿಂಗ್ (Explicit Filtering)

ಟೋಕನ್ ಅಥೆಂಟಿಕೇಶನ್‌ನೊಂದಿಗೆ ಎಂದಿಗೂ ಅಂಬಿಯೆಂಟ್ ಸ್ಕೋಪ್ (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ಗಳನ್ನು ಬಳಸಿ: ಎಂದಿಗೂ ಆಟೋ-ಇನ್‌ಕ್ರೀಮೆಂಟ್ IDಗಳನ್ನು ಬಳಸಬೇಡಿ. ಏಜೆಂಟ್‌ಗಳು ಕೇವಲ ಸಂಖ್ಯೆಯನ್ನು ಬದಲಾಯಿಸುವ ಮೂಲಕ IDಗಳನ್ನು ಊಹಿಸಲು ಸಾಧ್ಯವಾಗಬಾರದು.
  • ಸಿಂಗಲ್ ಸೋರ್ಸ್ ಆಫ್ ಟ್ರೂತ್ (Single Source of Truth): ಆರ್ಗನೈಸೇಶನ್ ಫಿಲ್ಟರ್ ಒಂದು ಟ್ರೇಟ್‌ನಲ್ಲಿ ಇರುತ್ತದೆ. ಪ್ರತಿಯೊಂದು ಟೂಲ್ ಅದನ್ನು ಬಳಸುತ್ತದೆ.
  • ಅನುಮತಿಗಳನ್ನು ಮರುಬಳಕೆ ಮಾಡಿ: ಏಜೆಂಟ್‌ಗಳಿಗಾಗಿ ಹೊಸ ಅನುಮತಿಗಳನ್ನು ಸೃಷ್ಟಿಸಬೇಡಿ. ನಿಮ್ಮ ವೆಬ್ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸುವ ಅದೇ ಪರ್ಮಿಷನ್ ಸ್ಟ್ರಿಂಗ್‌ಗಳನ್ನು ಬಳಸಿ. ಇದು ಏಜೆಂಟ್ ಮಾನವ ಬಳಕೆದಾರರಿಗಿಂತ ಹೆಚ್ಚು ಅಧಿಕಾರವನ್ನು ಪಡೆಯದಂತೆ ತಡೆಯುತ್ತದೆ.
  • ಸೈಡ್ ಎಫೆಕ್ಟ್‌ಗಳನ್ನು ಗುರುತಿಸಿ: ಒಂದು ಟೂಲ್ 'ರೀಡ್-ಓನ್ಲಿ' (read-only) ಅಥವಾ 'ರೈಟ್-ಎನೇಬಲ್ಡ್' (write-enabled) ಆಗಿದೆಯೇ ಎಂದು ತೋರಿಸಲು ಅನಾಟೇಶನ್‌ಗಳನ್ನು ಬಳಸಿ.

ಗಡಿಗಳನ್ನು ಪರೀಕ್ಷಿಸುವುದು (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