امنیت MCP: آنچه پس از ۹۵ بار قطعی در محیط عملیاتی آموختم

فکر می‌کردم امنیت ساده است. به‌روزرسانی وابستگی‌ها. استفاده از HTTPS. عدم ذخیره مستقیم (hardcode) اسرار.

اشتباه می‌کردم.

پس از ۹۵ بار قطعی در محیط عملیاتی و ۱۸۰۰ ساعت توسعه، آموختم که امنیت Model Context Protocol (MCP) متفاوت است. این امنیت مانند امنیت استاندارد REST API نیست.

MCP ریسک‌های جدیدی ایجاد می‌کند زیرا کلاینت یک LLM است، نه یک انسان.

در اینجا آنچه باید برای ایمن نگه داشتن سرور MCP خود بدانید، آورده شده است.

۱. مدل تهدید MCP

در REST، شما دقیقاً می‌دانید چه کسی در حال فراخوانی API شماست. در MCP، مدل زبانی بزرگ (LLM) به عنوان واسطه عمل می‌کند. این موضوع همه چیز را تغییر می‌دهد:

  • LLMها می‌توانند در فراخوانی ابزارها یا پارامترها دچار توهم (hallucinate) شوند.
  • کاربران مستقیماً ابزارها را فراخوانی نمی‌کنند. آن‌ها با LLM صحبت می‌کنند و LLM با سرور شما صحبت می‌کند.
  • کلاینت‌های مخرب می‌توانند در طول فرآیند کشف (discovery)، سرور شما را برای یافتن ابزارهای پنهان جستجو کنند.

بزرگترین تهدید شما فقط یک هکر نیست؛ بلکه یک LLM با نیت خیر است که با انجام یک اشتباه ناخواسته، باعث از کار افتادن سیستم شما می‌شود.

۲. مدیریت کلید API

بسیاری از توسعه‌دهندگان برای راحتی کار، کلیدهای API را در پارامترهای کوئری (query parameters) ارسال می‌کنند. این یک اشتباه است. پارامترهای کوئری در تمام لاگ‌های سرور و پروکسی‌ها ظاهر می‌شوند.

این قوانین را دنبال کنید:

  • از احراز هویت در هدر استفاده کنید (Authorization: Bearer).
  • از ارسال کلیدها در بدنه JSON خودداری کنید.
  • برای هر کلاینت یک کلید API متفاوت صادر کنید. این کار به شما کمک می‌کند تا میزان استفاده را ردیابی کرده و بدون از کار انداختن کل سیستم، دسترسی را لغو کنید.

۳. اعتبارسنجی سخت‌گیرانه ورودی

LLMها ممکن است اشتباه حدس بزنند. آن‌ها انواع داده‌های اشتباه و پارامترهای اضافی ارسال خواهند کرد. شما باید هر فراخوانی را اعتبارسنجی کنید:

  • ابتدا بررسی کنید که آیا نام ابزار در لیست شما وجود دارد یا خیر.
  • فراخوانی‌هایی که دارای پارامترهای اضافی هستند را رد کنید. آن‌ها را نادیده نگیرید.
  • انواع پارامترها را دقیقاً مطابقت دهید. انواع داده‌ها را تغییر اجباری (coerce) نکنید.
  • محدودیت‌های اندازه سخت‌گیرانه‌ای برای رشته‌ها و آرایه‌ها تعیین کنید تا از کرش کردن حافظه جلوگیری شود.
  • تمام مسیرهای فایل را پاکسازی (sanitize) کنید تا از حملات پیمایش دایرکتوری (directory traversal) جلوگیری شود.

۴. محدودسازی نرخ (Rate Limiting) لایه‌بندی شده

یک دستور کاربر می‌تواند همزمان ده فراخوانی ابزار را فعال کند. این کار می‌تواند در عرض چند ثانیه مخزن اتصالات (connection pool) شما را تخلیه کند.

از سه لایه دفاعی استفاده کنید:

  • محدودیت‌های مربوط به هر کلید API برای کنترل میزان استفاده کلاینت.
  • محدودیت‌های مربوط به هر IP برای جلوگیری از حملات Brute Force.
  • محدودیت‌های اتصال همزمان برای زنده نگه داشتن سرور در زمان اوج ترافیک.

۵. ریسک‌های تزریق دستور (Prompt Injection)

یک کاربر می‌تواند یک LLM را فریب دهد تا یک ابزار مخرب را فراخوانی کند. اگر کاربری به LLM بگوید تمام یادداشت‌ها را پاک کن، ممکن است LLM واقعاً این کار را انجام دهد.

از خود محافظت کنید:

  • عملیات خواندن و نوشتن را از هم جدا کنید.
  • برای هرگونه اقدام حذف یا به‌روزرسانی، تایید دستی کاربر را الزامی کنید.
  • برای کاربر پایگاه داده خود از اصل حداقل دسترسی (least privilege) استفاده کنید.

امنیت یک فرآیند مداوم است. با مدیریت بهتر کلیدها و اعتبارسنجی سخت‌گیرانه شروع کنید. این مراحل بیشتر مشکلات را حل می‌کنند.

Source: https://dev.to/kevinten10/mcp-security-what-i-learned-securing-my-mcp-server-after-95-production-outages-3hc0

Optional learning community: https://t.me/GyaanSetuAi