MCP సెక్యూరిటీ: 95 ప్రొడక్షన్ అవుటేజీల తర్వాత నేను నేర్చుకున్న విషయాలు
సెక్యూరిటీ అంటే చాలా సులభం అనుకున్నాను. డిపెండెన్సీలను అప్డేట్ చేయడం, HTTPS ఉపయోగించడం, సీక్రెట్స్ను హార్డ్కోడ్ చేయకపోవడం... అంతే అనుకున్నాను.
కానీ నేను పొరబడ్డాను.
95 ప్రొడక్షన్ అవుటేజీలు మరియు 1,800 గంటల డెవలప్మెంట్ తర్వాత, Model Context Protocol (MCP) సెక్యూరిటీ భిన్నంగా ఉంటుందని నేను తెలుసుకున్నాను. ఇది సాధారణ REST API సెక్యూరిటీ లాంటిది కాదు.
ఇక్కడ క్లయింట్ మనిషి కాదు, ఒక LLM కావడం వల్ల MCP కొత్త రిస్క్లను సృష్టిస్తుంది.
మీ MCP సర్వర్ను సురక్షితంగా ఉంచుకోవడానికి మీరు తెలుసుకోవలసిన విషయాలు ఇక్కడ ఉన్నాయి.
1. MCP థ్రెట్ మోడల్ (Threat Model)
RESTలో, మీ APIని ఎవరు కాల్ చేస్తున్నారో మీకు ఖచ్చితంగా తెలుస్తుంది. కానీ MCPలో, LLM ఒక మధ్యవర్తిగా (middleman) పనిచేస్తుంది. ఇది అన్నింటినీ మార్చేస్తుంది:
- LLMలు టూల్ కాల్స్ లేదా పారామీటర్లను తప్పుగా ఊహించవచ్చు (hallucinate).
- యూజర్లు నేరుగా టూల్స్ను కాల్ చేయరు. వారు LLMతో మాట్లాడుతారు, ఆపై LLM మీ సర్వర్తో మాట్లాడుతుంది.
- దురుద్దేశపూరితమైన క్లయింట్లు డిస్కవరీ సమయంలో మీ సర్వర్లో దాగి ఉన్న టూల్స్ కోసం వెతకవచ్చు (probe).
మీ అతిపెద్ద ముప్పు కేవలం హ్యాకర్ మాత్రమే కాదు. మంచి ఉద్దేశంతో ఉన్న ఒక LLM చేసే చిన్న పొరపాటు కూడా మీ సిస్టమ్ను క్రాష్ చేయవచ్చు.
2. API Key మేనేజ్మెంట్
చాలా మంది డెవలపర్లు పనులను సులభతరం చేయడానికి క్వెరీ పారామీటర్లలో (query parameters) API కీలను పంపిస్తారు. ఇది ఒక తప్పు. క్వెరీ పారామీటర్లు ప్రతి సర్వర్ లాగ్ మరియు ప్రాక్సీలో కనిపిస్తాయి.
ఈ నియమాలను పాటించండి:
- హెడర్ అథెంటికేషన్ (
Authorization: Bearer) ఉపయోగించండి. - JSON బాడీలో కీలను పంపడాన్ని నివారించండి.
- ప్రతి క్లయింట్కు వేర్వేరు API కీని ఇవ్వండి. ఇది వినియోగాన్ని ట్రాక్ చేయడానికి మరియు వ్యవస్థను దెబ్బతీయకుండా యాక్సెస్ను రద్దు చేయడానికి (revoke) మీకు సహాయపడుతుంది.
3. కఠినమైన ఇన్పుట్ వాలిడేషన్ (Strict Input Validation)
LLMలు తప్పుగా ఊహించవచ్చు. అవి తప్పుడు డేటా టైప్స్ మరియు అదనపు పారామీటర్లను పంపవచ్చు. మీరు ప్రతి కాల్ను తప్పనిసరిగా వాలిడేట్ చేయాలి:
- ముందుగా టూల్ పేరు మీ జాబితాలో ఉందో లేదో తనిఖీ చేయండి.
- అదనపు పారామీటర్లతో వచ్చే కాల్స్ను తిరస్కరించండి. వాటిని కేవలం విస్మరించవద్దు.
- పారామీటర్ టైప్స్ను ఖచ్చితంగా సరిపోల్చండి. డేటా టైప్స్ను బలవంతంగా మార్చవద్దు (coerce).
- మెమరీ క్రాష్లను నివారించడానికి స్ట్రింగ్స్ మరియు అర్రేలపై కఠినమైన సైజ్ లిమిట్లను విధించండి.
- డైరెక్టరీ ట్రావర్సల్ (directory traversal) నివారించడానికి అన్ని ఫైల్ పాత్లను శానిటైజ్ (sanitize) చేయండి.
4. లేయర్డ్ రేట్ లిమిటింగ్ (Layered Rate Limiting)
ఒక యూజర్ ప్రాంప్ట్ ఒకేసారి పది టూల్ కాల్స్ను ట్రిగ్గర్ చేయవచ్చు. ఇది సెకన్లలో మీ కనెక్షన్ పూల్ను ఖాళీ చేయవచ్చు.
మూడు రకాల రక్షణ పొరలను ఉపయోగించండి:
- క్లయింట్ వినియోగాన్ని నియంత్రించడానికి ప్రతి API కీకి విడివిడిగా లిమిట్లు విధించండి.
- బ్రూట్ ఫోర్స్ దాడులను ఆపడానికి ప్రతి IPకి లిమిట్లు విధించండి.
- బర్స్ట్ ట్రాఫిక్ సమయంలో మీ సర్వర్ పనిచేసేలా చేయడానికి కన్కరెంట్ కనెక్షన్ లిమిట్లను ఉపయోగించండి.
5. ప్రాంప్ట్ ఇంజెక్షన్ రిస్క్లు (Prompt Injection Risks)
ఒక యూజర్ LLMని మోసం చేసి ఏదైనా వినాశకరమైన టూల్ను కాల్ చేసేలా చేయవచ్చు. ఒక యూజర్ "అన్ని నోట్స్ను డిలీట్ చేయి" అని LLMకి చెబితే, అది నిజంగానే చేయవచ్చు.
మిమ్మల్ని మీరు ఇలా రక్షించుకోండి:
- రీడ్ (read) మరియు రైట్ (write) ఆపరేషన్లను వేరు చేయండి.
- ఏదైనా డిలీట్ లేదా అప్డేట్ చర్య కోసం యూజర్ నుండి మాన్యువల్ కన్ఫర్మేషన్ తీసుకోండి.
- మీ డేటాబేస్ యూజర్కు 'ప్రిన్సిపల్ ఆఫ్ లీస్ట్ ప్రివిలేజ్' (principle of least privilege) వర్తింపజేయండి.
సెక్యూరిటీ అనేది నిరంతర ప్రక్రియ. మెరుగైన కీ మేనేజ్మెంట్ మరియు కఠినమైన వాలిడేషన్తో ప్రారంభించండి. ఈ దశలు చాలా సమస్యలను పరిష్కరిస్తాయి.
Optional learning community: https://t.me/GyaanSetuAi
