æ¬èšäºã¯ 2026 幎 10 æ 5 æ¥ã«å
¬éããã Jaiganesh GirinathanãHarith GaddamanuguãKaustubh PhatakãTed Middleton ã«ãã âProtect MCP Endpoints at the Edge with Amazon CloudFront and AWS WAFâ ã翻蚳ãããã®ã§ãã AWS WAF ã䜿ããšã Model Context Protocol (MCP) ãšã³ããã€ã³ãããšããžã§å®çšçã«ä¿è·ããå¯èŠåã§ããŸããMCP ã¯ã AI ãšãŒãžã§ã³ããããŒã«ãããŒã¿ãšããåãããããã®æšæºçãªæ¹æ³ãšããŠæ¥éã«æ®åããŸãããããšããš MCP ã¯ãé·æéã®ã»ãã·ã§ã³ãæ°žç¶çãªæ¥ç¶ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã€ã³ã¹ã¿ã³ã¹ã®çŽä»ããåæãšããã¹ããŒããã«ãªãããã³ã«ã§ããã 2026 幎 7 æ 28 æ¥ã®æ¹å® ã§ã¯ã MCP ãã¹ããŒãã¬ã¹ãª HTTP ãªã¯ãšã¹ã/ã¬ã¹ãã³ã¹åã®ãããã³ã«ãšããŠåèšèšãããŸãããããã«ããããã¹ãŠã® MCP ãªã¯ãšã¹ãã¯èªå·±å®çµãã POST ãªã¯ãšã¹ããšãªãããããã¯ãŒã¯äžã§ã¯ã»ãã® REST API åŒã³åºããšèŠåããã€ããªã圢ã«ãªããŸããããã®çµæãã»ãã® HTTP API ã®å段ã§ãã§ã«å©çšããŠããã®ãšåãã¬ã€ã€ãŒ 7 ã®æ€æ»ã倿ãæé©åãã MCP ãµãŒããŒã®ã³ãŒãã倿Žããããšãªã CDN ã AWS WAF ã®ã¬ã€ã€ãŒã§é©çšã§ããããã«ãªããŸãã æ¬èšäºã§ã¯ãAmazon CloudFront ãŸã㯠Application Load Balancer (ALB) ã®èåŸã«ãããã€ãã MCP ãšã³ããã€ã³ããã AWS WAF ã§ä¿è·ããå¯èŠåããæ¹æ³ã玹ä»ããŸããæ°ãã仿§ã«ãã£ãŠç°¡åã«é©çšã§ãããæ¬¡ã® 9 ã€ã®ãŠãŒã¹ã±ãŒã¹ãé ã«èª¬æããŸãã ãã¹ãŠã®ãªã¯ãšã¹ãã§ãèš±å¯ããã MCP-Protocol-Version ãå¿
é ã«ãã AWS WAF Bot Control ã§åŒã³åºãå
ãåé¡ããçžæãã©ã®ãšãŒãžã§ã³ããªã®ããææ¡ãã ããã£ãµã€ãºã®ããªãã©ã€ããã§ãã¯ã远å ãã ãšãŒãžã§ã³ããåŒã³åºããããŒã«ã®èš±å¯ãªã¹ããäœæãã query_database ããŒã«ã§ç Žå£ç㪠SQL ããããã¯ãã ããŒã«ã®åŒæ°ã«é ããããµãŒããŒãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãª ( SSRF )ããããã¯ãã ã¯ãšãªåœ¢åŒã®å
¥åã«å«ãŸãã SQL ã€ã³ãžã§ã¯ã·ã§ã³ãæ€åºãã ããŒã«ããšã«ã¬ãŒãå¶éãèšããåäžã®é«ã³ã¹ããªæäœã«ãã£ãŠããã¯ãšã³ãã®ãªãœãŒã¹ãæ¯æžããªãããã«ãã ãªãã·ã§ã³ãšããŠãããŒã«ããšã®å¶éã®äžã«ãå
šäœã®äžéãšãªãã°ããŒãã«ãªã¬ãŒãå¶éãèšãã MCP ããšããžã§æ€æ»ã§ããããã«ãªã£ãçç± 2026 幎 7 æ 28 æ¥ã®æ¹å®ããåã®ä»æ§ã§ã¯ã MCP ã»ãã·ã§ã³ã«ã¯ãã³ãã·ã§ã€ã¯ãå¿
èŠã§ãããã¯ã©ã€ã¢ã³ãã initialize ãéä¿¡ãããšããµãŒããŒã Mcp-Session-Id ãè¿ãã以éã®ãã¹ãŠã®ãªã¯ãšã¹ãã¯ãã®èå¥åãä»ããŠåããµãŒããŒã€ã³ã¹ã¿ã³ã¹ã«éãããŠããŸããããªã¢ãŒãç°å¢ãžã®ãããã€ã§ã¯ãæ¥ç¶ã®åºå® ( ããã³ã° ) ãã¬ããªã«éã§ã®ã»ãã·ã§ã³ç¶æ
ã®å
±æãã¹ããªãŒã ãç¶æããããã®ãããã·ã®éçšãå¿
èŠã§ããããããã³ã«ãã¹ããŒããã«ã§ããªã¯ãšã¹ãã¹ããªãŒã ã®äžèº«ãäžéæã§ãã£ãããããšããžã§ã®æ€æ»ã¯çŸå®çã§ã¯ãããŸããã§ããã æ°ãã仿§ã§ã¯ãã»ãã·ã§ã³ãå®å
šã«å»æ¢ãããŸããã MCP ãªã¯ãšã¹ãã¯ãã©ã®ãµãŒããŒã€ã³ã¹ã¿ã³ã¹ã§ãåŠçã§ããåäžã®èªå·±å®çµãã HTTP POST ãªã¯ãšã¹ãã«ãªã£ãŠããŸãã POST /mcp HTTP/1.1 MCP-Protocol-Version: 2026-07-28 Mcp-Method: tools/call Mcp-Name: query_database Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "query_database", "arguments": { "filter": "id = 42" } } } ãšããžã§ããªã·ãŒãé©çšããããã§éèŠã«ãªãã®ãã Mcp-Method ãš Mcp-Name ã® 2 ã€ã®ããããŒã§ããã©ã¡ãã Streamable HTTP Transport ã§ã¯å¿
é ãšãããŠããŸã ( SEP-2243 ) ããããã®ããããŒã¯ãããŒããã©ã³ãµãŒãã²ãŒããŠã§ã€ããã¡ã€ã¢ãŠã©ãŒã«ãããã£ãè§£æããã«ãæäœã®å
容ã«åºã¥ããŠã«ãŒãã£ã³ã°ã§ããããã«ããããã«çšæãããŠããŸããããããŒãšããã£ã®å
容ãäžèŽããªããªã¯ãšã¹ãããµãŒããŒã¯æåŠããããããããã®ããããŒã¯æå³ã瀺ãä¿¡é Œã§ããã·ã°ãã«ã«ãªããŸãã AWS WAF ã«ãšã£ãŠããã¯ãMCP ãªã¯ãšã¹ãã«é¢ãããã£ãšãéèŠãª 2 ã€ã®æ
å ± ( ã©ã®æäœãå®è¡ãããã®ããã©ã®ããŒã«ãåŒã³åºãããã®ã ) ããããããŒã ãã§ææ¡ã§ããããšãæå³ããŸããããæ·±ãæ€æ»ãå¿
èŠãªå Žåã¯ã JSON ããã£ã® $.params.arguments ãã¹ã察象ã«ãªããŸãããã¹ãŠã® MCP ããŒã«åŒã³åºãã¯ãããŒã«ããšã®åŒæ°ããã®ãã¹ã«æ ŒçŽããŸããäžèšã®ãµã³ãã«ãªã¯ãšã¹ãã§ããã°ã query_database ã«æž¡ããã filter ã®å€ã該åœããŸãã JSON ãã€ããŒãã®ãã以å€ã®éšåã¯ããããã³ã«ã®å®åæ§é ã§ãã ããªã·ãŒãé©çšããå Žæã¯ã MCP ã¯ã©ã€ã¢ã³ãã®å
éš ( ããšãã°ããšãŒãžã§ã³ããåŒã³åºããããŒã«ã®å¶é ) ããããã¯ãŒã¯å¢ç ( ããšãã°ãæ¿èªãããŠããªã MCP ã¡ãœããããããã¯ãããã¡ã€ã¢ãŠã©ãŒã«ã«ãŒã« ) ããããã¯ãµãŒããŒã®å段ã«ãã CDN ã¬ã€ã€ãŒã®ããããã§ããæ¬èšäºã§ã¯ CDN ã¬ã€ã€ãŒ ( ãšããž ) ã«çŠç¹ãåœãŠãŸãã CDN ã¬ã€ã€ãŒã¯ãå©çšè
èªèº«ãå®å
šã«ã³ã³ãããŒã«ã§ããå¯äžã®é©çšãã€ã³ãã§ãããã¬ãŒã ã¯ãŒã¯ããããã¯ãŒã¯çµè·¯ã«é¢ä¿ãªããã¹ãŠã®åŒã³åºãå
ãã«ããŒã§ãã MCP ãµãŒããŒã®ã³ãŒãã倿Žããå¿
èŠããããŸããã AWS WAF ã«ãã MCP ãšã³ããã€ã³ãä¿è·ã®ãªãã¡ã¬ã³ã¹ã¢ãŒããã¯ã㣠ã¢ãŒããã¯ãã£ã¯ãäžè¬ç㪠REST API ã®å段ã§éçšããŠãããã®ãšåãã§ãã Amazon CloudFront ãã£ã¹ããªãã¥ãŒã·ã§ã³ ( ãŸã㯠Application Load Balancer ) ã MCP ãµãŒããŒã®å段ã«é
眮ãã AWS WAF ã®ãŠã§ã ACL ããã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«é¢é£ä»ããŸãããšãŒãžã§ã³ãããå±ãããªã¯ãšã¹ãã AWS WAF ãã€ã³ã©ã€ã³ã§è©äŸ¡ãããã¹ãŠã®ã«ãŒã«ãééãããªã¯ãšã¹ãã ãããªãªãžã³ã«å°éããŸãã远å ã®ãããããããã·å±€ã¯äžèŠã§ã MCP ãµãŒããŒã®ã³ãŒãã倿Žããå¿
èŠããããŸãããå³ 1 ã«ãªã¯ãšã¹ãã®çµè·¯ã瀺ããŸãã å³ 1. AWS WAF ã®ãŠã§ã ACL ãé¢é£ä»ãã Amazon CloudFront ( ãŸã㯠ALB ) ããå MCP ãªã¯ãšã¹ããã€ã³ã©ã€ã³ã§è©äŸ¡ããæ§æããããã¯ã«ãŒã«ã«äžèŽãããªã¯ãšã¹ãã«ã¯ 403 ãè¿ãããééãããªã¯ãšã¹ã㯠MCP ãµãŒããŒã«è»¢éãããŸãã æ€æ»ã®å¢çãçè§£ããïŒãšããžãšãªãªãžã³ Amazon CloudFront ã§ã¯ãAWS WAF 㯠CloudFront Functions ã Lambda@Edge ãå®è¡ãããåã«ãªã¯ãšã¹ããè©äŸ¡ããŸã ( AWS WAF ã®ãªã¯ãšã¹ãè©äŸ¡é åº ) ããã®ããã AWS WAF ã¯ãšããžé¢æ°ã远å ããããããŒãåç
§ã§ãããåŒã³åºãå
ãæåã«éä¿¡ããå
容ã ããåç
§ããŸãã MCP ãã©ãã£ãã¯ã®å Žåãå©çšã§ãããã£ãŒã«ã㯠MCP-Protocol-Version ã Mcp-Method ã Mcp-Name ã Authorization ããããŒã® 4 ã€ã§ãã AWS WAF ã¯æåã® 3 ã€ã«å¯ŸããŠçŽæ¥ãããã³ã°ãã¬ãŒãå¶éãè¡ããŸããäžæ¹ããã¢ã©ãŒããŒã¯ã³ã®æ€èšŒããã³ãŒãã¯ã§ããªããããããŒã¯ã³ã®æ€èšŒã¯ãªãªãžã³ã§è¡ããŸãã ãã®å¢çã«ãã£ãŠãã»ãã¥ãªãã£å¯Ÿç㯠2 ã€ã«åãããŸãããããã³ã«ããªã¯ãšã¹ã圢åŒã«åºã¥ãå¶åŸ¡ ( ããŒãžã§ã³ãã§ãã¯ãããŒã«ã®èš±å¯ãªã¹ããåŒæ°ã®æ€æ»ã SSRF ãã¿ãŒã³ã®æ€åºã SQL ã€ã³ãžã§ã¯ã·ã§ã³ã®æ€åºã IP ããŒã¹ã®ã¬ãŒãå¶é ) 㯠AWS WAF ã§è¡ããŸããã¢ã€ãã³ãã£ãã£ã«åºã¥ãå¶åŸ¡ ( ãŠãŒã¶ãŒããšã®ã¬ãŒãå¶éãããŒã«ã«åºã¥ãããŒã«ãžã®ã¢ã¯ã»ã¹ãããŒã¯ã³ã®æ€èšŒããã现ããªèªå¯ ) ã¯ããã¢ã©ãŒããŒã¯ã³ãæ€èšŒããŠåŒã³åºãå
ãæ¢ç¥ã®ããªã³ã·ãã«ã§ããããšã確èªããããšã«ã MCP ãµãŒããŒã§è¡ããŸãã AWS WAF ã®ã«ãŒã«ã¹ã¿ã㯠AWS WAF ã«ã¯ãããŒã¹ã©ã€ã³ã®ä¿è·ã«åããã«ãŒã«ã®æšå¥šäºé
ãšãã«ãŒã«ã®é åºã«é¢ãããã¹ããã©ã¯ãã£ã¹ããããŸããããŒã¹ã©ã€ã³ãšããŠãããã®ãã¿ãŒã³ã«åŸãããšãããããããŸãããã¡ãã® ããã° ã§ãåèæ
å ±ãšããããŠè©³ãã説æããŠããŸããåã«ãŒã«ã® JSON å
ã«ãã Priority ã¯ãè©äŸ¡é åºãå¶åŸ¡ãã AWS WAF ã®ããããã£ã§ããããšãã°ã軜éãªããããŒãã§ãã¯ãæåã«ã察象ãçµã£ã JSON ããã£ã®æ€æ»ã次ã«ãã¬ãŒãå¶éãæåŸã«é
眮ããŸããæ¬èšäºã§äœ¿çšããŠããåªå
床ã®å€ã¯ããããŸã§äžäŸã§ããéèŠãªã®ã¯é åºã§ãããå
·äœçãªæ°å€ã§ã¯ãããŸãããçªå·ã®ééããããŠç©ºããŠããã®ã¯ãããšããæ°ããã«ãŒã«ã远å ããéã«ããŠã§ã ACL å
šäœã®çªå·ãæ¯ãçŽããªããŠæžãããã«ããããã§ãã ãŠãŒã¹ã±ãŒã¹ 1ïŒæå¹ãª MCP ãããã³ã«ããŒãžã§ã³ãæããªããªã¯ãšã¹ããæåŠãã åŸç¶ã®ãã¹ãŠã®ã«ãŒã«ã¯ã Mcp-Method ãš Mcp-Name ãæå³ã瀺ãã·ã°ãã«ãšããŠä¿¡é ŒããŸãããã®ä¿¡é Œãæ£åœåã§ããã®ã¯ãããããŒãšããã£ã®æŽåæ§æ€èšŒãå¿
é ãšãªããããã³ã«ããŒãžã§ã³ããªã¯ãšã¹ãã宣èšããŠããå Žåã«éãããŸãã 2026 幎 7 æ 28 æ¥ã®ä»æ§æ¹èš ã§ãããã®ããšãæèšãããŠããŸãããã©ãŒãªã³ã°ãããããããŒã«åºã¥ããŠããªã·ãŒãé©çšããäžéè£
眮ã¯ãæ€èšŒãããŠããªãããããŒå€ãä¿¡é Œããã®ã§ã¯ãªãã MCP-Protocol-Version ãå€ããŸãã¯ååšããªããªã¯ãšã¹ããæåŠãã¹ããšãããŠããŸãã ãã®ã«ãŒã«ã¯ãæå¹ãª MCP-Protocol-Version ãæããªã /mcp ãžã®ãªã¯ãšã¹ãããã¹ãŠãããã¯ããŸããåäžã®ããããŒããããã³ã°ããã ãã§ããã£ã®æ€æ»ãè¡ããªããããã¹ã¿ãã¯ã®äžã§ãã£ãšã軜éãªã«ãŒã«ã§ãããå
é ã«é
眮ããŸãã ã«ãŒã«ã®ããžãã¯ïŒ ãã¹ã /mcp ã§å§ãŸããã〠mcp-protocol-version ããããŒã ^2026-07-28$ ã«äžèŽããªãå Žåã«ããã㯠{ "Name": "RequireMCPProtocolVersion", "Priority": 1, "Action": { "Block": {} }, "Statement": { "AndStatement": { "Statements": [ { "ByteMatchStatement": { "SearchString": "/mcp", "FieldToMatch": { "UriPath": {} }, "PositionalConstraint": "STARTS_WITH", "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ] } }, { "NotStatement": { "Statement": { "RegexMatchStatement": { "RegexString": "^2026-07-28$", "FieldToMatch": { "SingleHeader": { "Name": "mcp-protocol-version" } }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ] } } } } ] } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "RequireMCPProtocolVersion" } } æ£èŠè¡šçŸã«ã¯ã¢ã³ã«ãŒãä»ããŠããããããããã«ç°ãªãå€ ( ããšãã° 2026-07-28-preview ) ãæåŠãããŸããæ°ãããªããžã§ã³ããªãªãŒã¹ãããå Žåã¯ã ^(2026-07-28|2026-11-15)$ ã®ããã«ãããããåè£ã远å ããŠãã ããã察象ã /mcp ã«éå®ããŠãããããåããã£ã¹ããªãã¥ãŒã·ã§ã³äžã®ã»ãã®ã³ã³ãã³ãã«ã¯åœ±é¿ããŸããã ãŠãŒã¹ã±ãŒã¹ 2ïŒAWS WAF Bot Control ã§ååŒã³åºãå
ã®ã¢ã€ãã³ãã£ãã£ã«ã©ãã«ãä»ãã ãšãŒãžã§ã³ãã«ãããã©ãã£ãã¯ã¯ããã·ã³ã«ãããã©ãã£ãã¯ã§ãããã·ã³ã®åŒã³åºãå
ã«ä»äžã§ãããã£ãšã匷åãªã·ã°ãã«ã¯ãæ£èŠåãããã¢ã€ãã³ãã£ãã£ã©ãã«ã§ããããã«ããããã©ã®ãšãŒãžã§ã³ããåŒã³åºããŠããã®ãããšãã©ã®ããŒã«ãåŒã³åºããŠããã®ãããçµã¿åãããŠæ±ããŸãããã®çµã¿åããããããã®ã«ãŒã«ã®ç¹é·ã§ãããä»ã®ããã£ãæ€æ»ãããã¹ãŠã®ã«ãŒã«ããåã« Bot Control ãé
眮ããçç±ã§ãã AWS WAF Bot Control ã¯ãåãªã¯ãšã¹ãã«ã©ãã«ãä»äžããŸãã MCP ã«é¢é£ããã©ãã«ã®ãã¡ããªãŒã¯ã Bot Control ã®ã©ãã«ã®ãªãã¡ã¬ã³ã¹ ã«èšèŒãããŠããŸãã åŒã³åºãå
ã®çš®é¡ ã©ãã« åè æ€èšŒæžã¿ã¯ããŒã©ãŒ awswaf:managed:aws:bot-control:bot:name:<name> awswaf:managed:aws:bot-control:bot:verified æ€èšŒæžã¿ãããã«ä»äžãããã©ãã« Web Bot Auth ã䜿çšãããšãŒãžã§ã³ã awswaf:managed:aws:bot-control:bot:web_bot_auth:verified 眲åã®æ€èšŒã«å€±æããå Žå㯠:invalidã:expiredã:unknown_bot èå¥å¯èœãªãã³ã㌠awswaf:managed:aws:bot-control:bot:vendor:<vendor_name> çŸåšã¯ Amazon Bedrock AgentCore ã§ãã¹ããããŠãããšãŒãžã§ã³ãã«ä»äžããã ã¯ã©ãŠãã§ãã¹ããããŠããåŒã³åºãå
awswaf:managed:aws:bot-control:signal:cloud_service_provider:<csp> ãµãã£ãã¯ã¹ã¯ awsãgcpãazureãoracle ã®ãããã ãããã¬ã¹ãã©ãŠã¶ awswaf:managed:aws:bot-control:signal:automated_browser MCP ãšã³ããã€ã³ãã§ã¯äžå¯©ãªãã®ãšããŠæ±ã Bot Control ã®å
±éã®ä¿è·ã¬ãã«ã«ã¯ãããã©ã«ãã®ã¢ã¯ã·ã§ã³ã Block ã«èšå®ããããµãã«ãŒã«ãããã€ãå«ãŸããŠããŸãããã®ãã¡ 5 ã€ã¯ãæ£åœãªãšãŒãžã§ã³ãã®ãã©ãã£ãã¯ã«å¯ŸããŠèª€æ€ç¥ãèµ·ããããã MCP ãšã³ããã€ã³ãã§ã¯ Count ã«ãªãŒããŒã©ã€ãããå¿
èŠããããŸãã SignalNonBrowserUserAgent ã¯ã User-Agent ãå®éã®ãã©ãŠã¶ã§ã¯ãªãåŒã³åºãå
ããããã¯ããŸãããã®ãããæšæºç㪠HTTP ã¯ã©ã€ã¢ã³ã (python-requests ãGo ã® net/http ã Node ã® fetch) ã䜿çšãããšãŒãžã§ã³ããã¬ãŒã ã¯ãŒã¯ã¯ãã¹ãŠããã®ã«ãŒã«ã«åŒã£ããããŸãã CategoryHttpLibrary ã¯ãæ¢ç¥ã® HTTP ã©ã€ãã©ãªãçŽæ¥ãããã¯ããŸãã curl ã wget ã«å ããã»ãšãã©ã® MCP ã¯ã©ã€ã¢ã³ãã®ã³ãŒãããŒã¹ãäŸåããŠãã SDK ã察象ã«ãªããŸãã SignalAutomatedBrowser ã¯ããããã¬ã¹ Chrome ãSelenium ãPlaywright ããããã¯ããŸãããããã¯ããšãŒãžã§ã³ããã¬ãŒã ã¯ãŒã¯ãå
éšã§ããå©çšããŠãããã®ã§ãã CategoryAI ã¯ã AI ãšãŒãžã§ã³ãã®ãã©ãã£ãã¯ã§ããããšãèªãåä¹ããã©ãã£ãã¯ããããã¯ããŸããæ£åœãª MCP ã¯ã©ã€ã¢ã³ãã®ã»ãšãã©ã¯ããã®ã«ããŽãªã«è©²åœããŸãã SignalKnownBotDataCenter ã¯ãæ¢ç¥ã®ã¯ã©ãŠãããŒã¿ã»ã³ã¿ãŒã® IP ç¯å²ããã®åŒã³åºãå
ããããã¯ããŸãã MCP ãšã³ããã€ã³ããžã®ãšãŒãžã§ã³ãã®ãã©ãã£ãã¯ã®å€§åã¯ãäžè¬å®¶åºã® IP ã§ã¯ãªãããŒã¿ã»ã³ã¿ãŒããéä¿¡ãããŸãããã®ããããã®ã«ãŒã«ããã®ãŸãŸæå¹ã«ãããšãæ£åœãªåŒã³åºãå
ã®ã»ãšãã©ããããã¯ãããŠããŸããŸãã ããã 5 ã€ããªãŒããŒã©ã€ãããŠããBot Control ã®ãã以å€ã®ä¿è·æ©èœã¯ç¶æãããŸããå
·äœçã«ã¯ã倧éã®ãªã¯ãšã¹ãã§ãšã³ããã€ã³ããæ»æããããããæ¢ãã Targeted ã®å€§éãªã¯ãšã¹ãåãã«ãŒã« ( TGT_VolumetricSession ã TGT_VolumetricIpTokenAbsent ) ãã¹ã¯ã¬ã€ããŒã SEO ã«ããŽãªã®ãããã¯ããããŠåŸç¶ã®ã¢ã€ãã³ãã£ãã£ãšããŒã«ãçµã¿åãããã«ãŒã«ã®å
¥åãšãªã Web Bot Auth ( WBA ) ã®å€å®ã§ããã°ã«ãŒãå
šäœã«å¯ŸããŠãŠã§ã ACL ã¬ãã«ã§ OverrideAction: Count ãèšå®ããã®ã§ã¯ãªãããããŒãžãã«ãŒã«ã°ã«ãŒãã®ã¹ããŒãã¡ã³ãã§ RuleActionOverrides ã䜿çšããŠãã ãããåè
ã®æ¹æ³ã§ã¯ãã«ãŒã«ã°ã«ãŒãå
šäœã Count ã«ãªããBot Control ã®å©ç¹ã倱ãããŠããŸãããã§ãã ã«ãŒã«ã®ããžãã¯ïŒ æ€æ»ã¬ãã«ã COMMON ã«ãã Bot Control ã«ãŒã«ã°ã«ãŒãã§ããã¹ãŠã®ãªã¯ãšã¹ããè©äŸ¡ããã SignalNonBrowserUserAgent ã CategoryHttpLibrary ã SignalAutomatedBrowser ã CategoryAI ã SignalKnownBotDataCenter ã®åã«ãŒã«ã Count ã«èšå®ãããããã¯ããã«ã©ãã«ã ããä»äž { "Name": "BotControlCommon", "Priority": 2, "OverrideAction": { "None": {} }, "Statement": { "ManagedRuleGroupStatement": { "VendorName": "AWS", "Name": "AWSManagedRulesBotControlRuleSet", "ManagedRuleGroupConfigs": [ { "AWSManagedRulesBotControlRuleSet": { "InspectionLevel": "COMMON" } } ], "RuleActionOverrides": [ { "Name": "SignalNonBrowserUserAgent", "ActionToUse": { "Count": {} } }, { "Name": "CategoryHttpLibrary", "ActionToUse": { "Count": {} } }, { "Name": "SignalAutomatedBrowser", "ActionToUse": { "Count": {} } }, { "Name": "CategoryAI", "ActionToUse": { "Count": {} } }, { "Name": "SignalKnownBotDataCenter", "ActionToUse": { "Count": {} } } ] } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "BotControlCommon" } } 5 ã€ã®ãµãã«ãŒã«ã¯ãã¹ãŠããªãŒããŒã©ã€ãåŸãã©ãã« ( signal:non_browser_user_agent ã bot:category:http_library ã signal:automated_browser ã bot:category:ai ã signal:known_bot_data_center ) ãä»äžããŸãããã®ãããåŸç¶ã®ã«ãŒã«ã§ãããã®ã©ãã«ãåŒãç¶ãå©çšã§ããŸãã Block ã«ãã£ãŠè©äŸ¡ãçµäºããªããªãã ãã§ãã ãããã®ã©ãã«ãå©çšã§ãããããªç¶æ
ã§ãããšãåŸç¶ã®ã«ãŒã«ã§ã¢ã€ãã³ãã£ãã£ã®æ¡ä»¶ãš Mcp-Name ã®ãããã³ã°ãçµã¿åãããããŸããããšãã°ãåŒã³åºãå
ã® Web Bot Auth 眲åãç¡å¹ã§ããã€é«ã³ã¹ããªããŒã«ãåŒã³åºããŠããå Žåã¯ãããã¯ããããšãã£ãã«ãŒã«ããç¬èªã®ãã£ã³ã¬ãŒããªã³ãã£ã³ã°ã®ããžãã¯ãªãã§èšè¿°ã§ããŸããæ¬¡ã®äŸããã®ã«ãŒã«ã§ãã tools/call ã«äžèŽããããŒã«ã expensive-tools ãã¿ãŒã³ã»ããã«å«ãŸããã〠Web Bot Auth ã®ã©ãã«ã invalid ãŸã㯠unknown_bot ã§ããå Žåã«ãããã¯ããŸãã ã«ãŒã«ã®ããžãã¯ïŒ mcp-method ããããŒã tools/call ãšçãããã〠mcp-name ã expensive-tools ãã¿ãŒã³ã»ããã«äžèŽãããã€åŒã³åºãå
ã® Web Bot Auth ã©ãã«ã invalid ãŸã㯠unknown_bot ã§ããå Žåã«ããã㯠{ "Name": "BlockUnverifiedBotOnHighCostTool", "Priority": 4, "Action": { "Block": {} }, "Statement": { "AndStatement": { "Statements": [ { "ByteMatchStatement": { "SearchString": "tools/call", "FieldToMatch": { "SingleHeader": { "Name": "mcp-method" } }, "PositionalConstraint": "EXACTLY", "TextTransformations": [ { "Priority": 0, "Type": "LOWERCASE" } ] } }, { "RegexPatternSetReferenceStatement": { "ARN": "arn:aws:wafv2:us-east-1:123456789012:global/regexpatternset/mcp-expensive-tools/def456", "FieldToMatch": { "SingleHeader": { "Name": "mcp-name" } }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ] } }, { "OrStatement": { "Statements": [ { "LabelMatchStatement": { "Scope": "LABEL", "Key": "awswaf:managed:aws:bot-control:bot:web_bot_auth:invalid" } }, { "LabelMatchStatement": { "Scope": "LABEL", "Key": "awswaf:managed:aws:bot-control:bot:web_bot_auth:unknown_bot" } } ] } } ] } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "BlockUnverifiedBotOnHighCostTool" } } BlockUnverifiedBotOnHighCostTool ã¯ããŸã Count ã¢ãŒãã§ãããã€ããŠãã ããããããŠäžå®ã®èг坿éãèšããŠãåŒã³åºãå
ã«ä»äžãããã©ãã«ã®ååžã確èªããŠããããã®çµã¿åããã«ãŒã«ã Block ã«åãæ¿ããŸããBot Control ã®æéã¯ããµãã¹ã¯ãªãã·ã§ã³æéãšãªã¯ãšã¹ãããšã®è©äŸ¡æéã§æ§æãããŸããæå¹ã«ããå Žåã¯ããã®åã®äºç®ã確ä¿ããŠãã ãããææ°ã®æéã¯ã AWS WAF ã®æéãš Bot Control ã®æéã»ã¯ã·ã§ã³ ãåç
§ããŠãã ããã ãŠãŒã¹ã±ãŒã¹ 3ïŒæ€æ»ã®åã«ãµã€ãºã®å€§ãããããªã¯ãšã¹ãããã£ããããã¯ãã CloudFront ã«ããã AWS WAF ã®ããã£æ€æ»ã®ããã©ã«ãã®äžé㯠16 KB ã§ãããŠã§ã ACL ã® AssociationConfig ã䜿çšãããšããã®äžéã 64 KB ãŸã§åŒãäžããããŸããæ¬èšäºã§ã¯äžéã 32 KB ã«åŒãäžããŠããŸããããã¯ãäžè¬ç㪠MCP ããŒã«ã®åŒæ°ã«ã¯ååãªãµã€ãºã§ããã€ã€ãé倧ãªãã€ããŒããæããªãå€ã§ãã æ³šæïŒ AWS WAF ã Application Load Balancer (ALB) ã«é¢é£ä»ããå Žåãããã£æ€æ»ã®äžé㯠8 KB ã«å¶éãããŠãããåŒãäžããããšã¯ã§ããŸããã MCP ãšã³ããã€ã³ãã®å段㫠ALB ãé
眮ããå Žåã¯ãããŒã«ã®åŒæ°ã 8 KB 以äžã«æããããALB ã®å段㫠CloudFront ãã£ã¹ããªãã¥ãŒã·ã§ã³ãé
眮ã㊠AWS WAF ããã¡ãã«é¢é£ä»ããŠãã ããã èšå®ããäžéãè¶
ããéšåã¯ãåã«ãŒã«ã® OversizeHandling ã®èšå®ã«åŸã£ãŠåŠçãããŸããããã£ãæ€æ»ãããã¹ãŠã®ã«ãŒã«ã§ OversizeHandling: MATCH ãèšå®ãããšå®å
šã§ã¯ãããŸããããã€ãºãå€ããªããŸããæ£åœãªãµã€ãºã®å€§ããããã£ãããã¹ãŠã®ã«ãŒã«ã«åŒã£ããã£ãŠããŸãããã§ãã代ããã«ãæåã®æ®µéã§äžåºŠã ããã§ã€ã«ã¯ããŒãºããæ¹éãåããŸããå
·äœçã«ã¯ã 32 KB ãè¶
ããããã£ãåäžã®ãµã€ãºå¶çŽã«ãŒã«ã§æåŠããŸãããã®èšå®ãããã°ããµã€ãºã®å€§ããããããã£ã¯åŸç¶ã®ã«ãŒã«ã«å°éããªããããåŸç¶ã®ãã¹ãŠã®ã«ãŒã«ã§ OversizeHandling: NO_MATCH ãå®å
šã«äœ¿çšã§ããŸãã ãã®äºåãã§ãã¯ã 32 KB ã§æ©èœãããã«ã¯ããŠã§ã ACL ã®ããã£æ€æ»ã®äžéã 32 KB 以äžã«èšå®ããå¿
èŠããããŸããããã©ã«ãã® 16 KB ã®ãŸãŸã ãšã16 KB ãã 32 KB ã®éã®ãªã¯ãšã¹ãã§ OversizeHandling: MATCH ãçºåãã誀ã£ããããã¯ãçºçããŠããŸããŸãããŠã§ã ACL ã®äœææã«äžéãåŒãäžããŠãã ããã { "Name": "mcp-web-acl", "Scope": "CLOUDFRONT", "AssociationConfig": { "RequestBody": { "CLOUDFRONT": { "DefaultSizeInspectionLimit": "KB_32" } } }, "DefaultAction": { "Allow": {} }, "Rules": [ /* ... */ ] } ããªãã©ã€ããã§ãã¯ã®ã«ãŒã«ã¯æ¬¡ã®ãšããã§ãã { "Name": "MCPBodySizePreflight", "Priority": 5, "Action": { "Block": {} }, "Statement": { "SizeConstraintStatement": { "FieldToMatch": { "Body": { "OversizeHandling": "MATCH" } }, "ComparisonOperator": "GT", "Size": 32768, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ] } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "MCPBodySizePreflight" } } ãŠãŒã¹ã±ãŒã¹ 4ïŒåŒã³åºãå¯èœãªããŒã«ãèš±å¯ãªã¹ãã§å¶éãã çµç¹ã 20 åã®ããŒã«ãå
¬éããŠãããšããŠããããŒã«ã®ã¬ã€ã€ãŒã§æå°æš©éã®ååãé©çšããã®ã§ããã°ããšãŒãžã§ã³ãã«ã¯ç¹å®ã®ã¿ã¹ã¯ã«å¿
èŠãªããŒã«ã®åŒã³åºãã ããèš±å¯ãã¹ãã§ããæ£èŠè¡šçŸãã¿ãŒã³ã»ããã䜿çšããŠåŒã³åºãå¯èœãªç¯å²ãå¶éããŠããã°ãããã³ããã€ã³ãžã§ã¯ã·ã§ã³ã«ãã£ãŠãšãŒãžã§ã³ãã execute_shell ã delete_all_records ãåŒã³åºãããšããŠãããªã¯ãšã¹ãã¯ãšããžã§ 403 ãšããŠæ¢ãããããµãŒããŒã«ã¯å°éããŸããã Mcp-Name ã¯ãã¡ãŒã¹ãã¯ã©ã¹ã®ããããŒã§ããããããã®ã«ãŒã«ã¯ããã£ãè§£æããªããçŽç²ãªããããŒã«ãŒã«ã«ãªããŸãã ãã®ã«ãŒã«ã¯ã åçã©ãã«è£é ã䜿çšããŠãAWS WAF ã®ãªã¯ãšã¹ã ID ãå«ã JSON 圢åŒã® 403 ã¬ã¹ãã³ã¹ããã£ãè¿ããŸãã ${awswaf:request_id:} ãšãããã¬ãŒã¹ãã«ããŒã¯è©äŸ¡æã«å®éã®ãªã¯ãšã¹ã ID ã«çœ®ãæãããŸããããã«ãããåŒã³åºãå
ã¯ãµããŒãã«äŒããã¹ãåäžã®ãã£ãŒã«ããææ¡ã§ãããªã³ã³ãŒã«æ
åœè
ã¯ãã°å
ãçŽæ¥ grep ã§æ€çŽ¢ã§ããŸãã ã«ãŒã«ã®ããžãã¯ïŒ ãªã¯ãšã¹ãããããŒã® mcp-method ã tools/call ãšçãããã〠mcp-name ãèš±å¯ãããããŒã«ã®æ£èŠè¡šçŸãã¿ãŒã³ã»ããã«äžèŽããªãå Žåã«ããã㯠{ "Name": "BlockUnapprovedMCPTools", "Priority": 10, "Action": { "Block": { "CustomResponse": { "ResponseCode": 403, "CustomResponseBodyKey": "McpBlockedTool", "ResponseHeaders": [ { "Name": "x-mcp-waf-request-id", "Value": "${awswaf:request_id:}" } ] } } }, "Statement": { "AndStatement": { "Statements": [ { "ByteMatchStatement": { "SearchString": "tools/call", "FieldToMatch": { "SingleHeader": { "Name": "mcp-method" } }, "PositionalConstraint": "EXACTLY", "TextTransformations": [ { "Priority": 0, "Type": "LOWERCASE" } ] } }, { "NotStatement": { "Statement": { "RegexPatternSetReferenceStatement": { "ARN": "arn:aws:wafv2:us-east-1:123456789012:global/regexpatternset/mcp-allowed-tools/abc123", "FieldToMatch": { "SingleHeader": { "Name": "mcp-name" } }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ] } } } } ] } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "BlockUnapprovedMCPTools" } } åç
§å
ã®ã¬ã¹ãã³ã¹ããã£ã¯ãŠã§ã ACL ã¬ãã«ã§äžåºŠã ãå®çŸ©ãããããã»ãã® Block ã¢ã¯ã·ã§ã³ã§ãåå©çšã§ããŸãã { "CustomResponseBodies": { "McpBlockedTool": { "ContentType": "APPLICATION_JSON", "Content": "{\"error\":\"tool_not_allowed\",\"waf_request_id\":\"${awswaf:request_id:}\",\"client_ip\":\"${awswaf:ip:}\"}" } } } æ£èŠè¡šçŸãã¿ãŒã³ã»ããã¯ããµãŒããŒã® tools/list ã¬ã¹ãã³ã¹ããçæããããããããã§ã¹ããšåžžã«åæããç¶æ
ãä¿ãŠãŸããåæã®å
容ã¯ãããŒã«åãã¢ã³ã«ãŒä»ãã®éžæè¢ãšããŠé£çµãããã®ã§ãïŒ ^(query_database|get_document|send_notification)$ ãŠãŒã¹ã±ãŒã¹ 5ïŒquery_database ããŒã«ã§ç Žå£ç㪠SQL ããããã¯ãã å€ãã® MCP ãµãŒããŒã¯ãããŒã¿ããŒã¹ã«ã¯ãšãªãå®è¡ããããŒã«ãå
¬éããŠããŸãã query åŒæ°ã«ã¯ã LLM ãçµã¿ç«ãŠãçã® SQL ãå«ãŸããŸããããã³ããã€ã³ãžã§ã¯ã·ã§ã³ã«ãã£ãŠã SELECT ã DROP TABLE ã«æžãæããããŠããŸãå¯èœæ§ããããŸãã AWS WAF ã䜿ãã°ããªã¯ãšã¹ãããµãŒããŒã«å°éããåã«ãç Žå£çãªãã¿ãŒã³ããšããžã§æåŠã§ããŸãã ãã®ã«ãŒã«ã¯ããããŒãžãã«ãŒã«ã°ã«ãŒãã® AWSManagedRulesSQLiRuleSet ãšã¯ç°ãªããŸãããã®ãããŒãžãã«ãŒã«ã°ã«ãŒãã¯ãæ¬æ¥ SQL ãå«ãŸããã¹ãã§ã¯ãªããã£ãŒã«ãåãã«äœãããŠããŸãããã®ããæ§æããŒãµãŒã䜿çšããŠãæŽã£ã圢åŒã® SQL ãèŠã€ãããšãã¹ãŠæ€åºããŠããŸããŸããããã«ã¯ãããŒã«ãæ¬æ¥å®è¡ãã¹ãæ£åœãª SELECT ã¯ãšãªãå«ãŸããŸããããã§èª¬æããã«ãŒã«ã¯ããéå®çã§ãã query åŒæ°ã¯ SQL ãæ±ãããšãç®çãªã®ã§ SQL èªäœã¯èš±å¯ãã€ã€ãèªã¿åãå°çšã®ããŒã«ãçºè¡ããå¿
èŠã®ãªããµãã»ãã ( DROP ã TRUNCATE ã ALTER ã GRANT ã DELETE FROM ã UPDATEâŠSET ) ããããã¯ããŸãã å®è£
ïŒ ã©ãã«ä»ãã«ãŒã«ã¯ã Mcp-Name ããããŒãäžèŽããå Žåã« mcp:tool:query_database ãšããã©ãã«ãä»äžããŸãããããã¯ã«ãŒã«ã¯ããã®ã©ãã«ãååšããã〠query åŒæ°ã«ç Žå£çãªããŒã¯ãŒããå«ãŸããŠããå Žåã«ã®ã¿çºåããŸãã ã«ãŒã«ã®ããžã㯠( 2 ã€ã®ã«ãŒã«ã®çµã¿åãã ) ïŒ mcp-name ã query_database ãšçããå Žåã« mcp:tool:query_database ã®ã©ãã«ãä»äžãããæ¬¡ã«ããã®ã©ãã«ãä»äžãããŠããŠãã〠/params/arguments/query ãç Žå£ç㪠SQL ããŒã¯ãŒãã«äžèŽããå Žåã«ããã㯠{ "Name": "LabelToolQueryDatabase", "Priority": 15, "Action": { "Count": {} }, "RuleLabels": [ { "Name": "mcp:tool:query_database" } ], "Statement": { "ByteMatchStatement": { "SearchString": "query_database", "FieldToMatch": { "SingleHeader": { "Name": "mcp-name" } }, "PositionalConstraint": "EXACTLY", "TextTransformations": [ { "Priority": 0, "Type": "LOWERCASE" } ] } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "LabelToolQueryDatabase" } } { "Name": "BlockDestructiveSQL", "Priority": 20, "Action": { "Block": {} }, "Statement": { "AndStatement": { "Statements": [ { "LabelMatchStatement": { "Scope": "LABEL", "Key": "mcp:tool:query_database" } }, { "RegexMatchStatement": { "RegexString": "\\b(DROP|TRUNCATE|ALTER|GRANT|REVOKE|CREATE|DELETE\\s+FROM|INSERT\\s+INTO|UPDATE\\s+.+\\s+SET)\\b", "FieldToMatch": { "JsonBody": { "MatchPattern": { "IncludedPaths": [ "/params/arguments/query" ] }, "MatchScope": "VALUE", "InvalidFallbackBehavior": "MATCH", "OversizeHandling": "NO_MATCH" } }, "TextTransformations": [ { "Priority": 0, "Type": "COMPRESS_WHITE_SPACE" }, { "Priority": 1, "Type": "UPPERCASE" } ] } } ] } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "BlockDestructiveSQL" } } ãã®ããŒã«ã¯ãããŒã¿ãèªã¿åãããã®ãã®ã§ãã query åŒæ°ã«æžã蟌ã¿ãåé€ã®ããŒã¯ãŒããå«ãŸããŠããã®ã§ããã°ãäžæµã®ã©ããã§äœããæ¹ãããããŠããŸãããã£ãšãå¯èœæ§ãé«ãã®ã¯ãããã³ããã€ã³ãžã§ã¯ã·ã§ã³ã§ãã COMPRESS_WHITE_SPACE ã«ãã£ãŠããD R O Pãã®ãããªåé¿ã®è©Šã¿ãæ€åºã§ããŸãã InvalidFallbackBehavior: MATCH ãæå®ãããšã query åŒæ°èªäœãå«ãŸããŠããªããªã¯ãšã¹ãããããã¯ãããŸããæ¬ èœãããã£ãŒã«ããæ€æ»ãªãã§ééãããã®ã§ã¯ãªããããªã·ãŒéåãšããŠæ±ãããã§ãã ãŠãŒã¹ã±ãŒã¹ 6ïŒããŒã«ã®åŒæ°ã«é ããã SSRF ãæ€åºããŠãããã¯ãã åŒã³åºãå
ãæå®ããå®å
ã«å¯ŸããŠããŒã¿ãååŸ (fetch) ãåå解決 (resolve) ãéä¿¡ (post) ãã MCP ããŒã«ã¯ã SSRF ã®æ»æå¯Ÿè±¡ã«ãªãããããã®ã§ããå
éš IP ãã¯ã©ãŠãã®ã¡ã¿ããŒã¿ãšã³ããã€ã³ãããµãŒãã¹å
éšã® DNS åãæå®ããåŒæ°ã¯ãããèŠããããã¿ãŒã³ã§ããããã£ãæ€æ»ããåäžã®ã«ãŒã«ã§ãäžè¬çãªãã¿ãŒã³ãã«ããŒã§ããŸããå
·äœçã«ã¯ãã€ã³ã¹ã¿ã³ã¹ã¡ã¿ããŒã¿ãµãŒãã¹ (IMDS) ã®ãšã³ããã€ã³ã ( 169.254.169.254 ) ã IPv4 ã®ãã©ã€ããŒãã¢ãã¬ã¹ç¯å²ã IPv6 ã®ã«ãŒãããã¯ããã³ãŠããŒã¯ããŒã«ã«ã®ãã¬ãã£ãã¯ã¹ãã¯ã©ã¹ã¿ãŒå
éšã®ãµãŒãã¹ã«å°éããããã® DNS åã§ãããããã³ã°ã®åã« URL_DECODE ãé©çšããŠã 1 ååã®ããŒã»ã³ããšã³ã³ãŒãã£ã³ã°ãå±éããŸãã ã«ãŒã«ã®ããžãã¯ïŒ mcp-method ã tools/call ãšçãããã〠/params/arguments å
ã®ããããã®å€ããã©ã€ããŒã IP ãIMDS ãšã³ããã€ã³ããå
éš DNS åã«äžèŽããå Žåã«ããã㯠{ "Name": "BlockMCPSSRF", "Priority": 30, "Action": { "Block": {} }, "Statement": { "AndStatement": { "Statements": [ { "ByteMatchStatement": { "SearchString": "tools/call", "FieldToMatch": { "SingleHeader": { "Name": "mcp-method" } }, "PositionalConstraint": "EXACTLY", "TextTransformations": [ { "Priority": 0, "Type": "LOWERCASE" } ] } }, { "OrStatement": { "Statements": [ { "RegexMatchStatement": { "RegexString": "(169\\.254\\.169\\.254|metadata\\.google\\.internal|kubernetes\\.default(\\.svc)?|\\.(local|internal)([^a-z0-9.-]|$))", "FieldToMatch": { "JsonBody": { "MatchPattern": { "IncludedPaths": [ "/params/arguments" ] }, "MatchScope": "VALUE", "InvalidFallbackBehavior": "NO_MATCH", "OversizeHandling": "NO_MATCH" } }, "TextTransformations": [ { "Priority": 0, "Type": "URL_DECODE" }, { "Priority": 1, "Type": "LOWERCASE" } ] } }, { "RegexMatchStatement": { "RegexString": "\\b(10|127|169\\.254|172\\.(1[6-9]|2[0-9]|3[01])|192\\.168)\\.\\d{1,3}\\.\\d{1,3}\\b", "FieldToMatch": { "JsonBody": { "MatchPattern": { "IncludedPaths": [ "/params/arguments" ] }, "MatchScope": "VALUE", "InvalidFallbackBehavior": "NO_MATCH", "OversizeHandling": "NO_MATCH" } }, "TextTransformations": [ { "Priority": 0, "Type": "URL_DECODE" } ] } }, { "RegexMatchStatement": { "RegexString": "(::1|::ffff:|f[cd][0-9a-f]{2}:|fe80:)", "FieldToMatch": { "JsonBody": { "MatchPattern": { "IncludedPaths": [ "/params/arguments" ] }, "MatchScope": "VALUE", "InvalidFallbackBehavior": "NO_MATCH", "OversizeHandling": "NO_MATCH" } }, "TextTransformations": [ { "Priority": 0, "Type": "URL_DECODE" }, { "Priority": 1, "Type": "LOWERCASE" } ] } } ] } } ] } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "BlockMCPSSRF" } } ããã§ 2 ã€ã®æ³šæç¹ãæããŠãããŸãã 1 ã€ç®ã«ããã®ã«ãŒã«ã¯å€å±€é²åŸ¡ã®äžéšã§ããã SSRF ã«å¯Ÿããäž»èŠãªå¯Ÿçã§ã¯ãããŸããã AWS WAF ã®ããã¹ãå€æã¯ 1 åããå®è¡ãããªãããã 10 鲿°ã 8 鲿°ã«ãã IP ã®ãšã³ã³ãŒãã£ã³ã°ã DNS ãªãã€ã³ãã£ã³ã°ããã«ããã¹ãšã³ã³ãŒãã£ã³ã°ã¯ããã®ã«ãŒã«ãããæããŠããŸããŸããäž»èŠãªå¯Ÿçã¯ãããã¯ãŒã¯ã¬ãã«ã§è¡ããŸããããŒã«ãå®è¡ããç°å¢ã§ IMDSv2 ãå¿
é ã«ããã»ãã¥ãªãã£ã°ã«ãŒãã VPC ãšã³ããã€ã³ãããªã·ãŒã§éä¿¡å
ãå¶éããŠãã ããã 2 ã€ç®ã«ãæ£åœãªçç±ã§ãã©ã€ããŒãã¢ãã¬ã¹ãšéä¿¡ããããŒã« ( ããšãã°ã Kubernetes ã¯ã©ã¹ã¿ãŒã®ã€ã³ããã¹ãã¯ã·ã§ã³ããŒã« ) ãããå Žåã¯ãã©ãã«ã®ãããã³ã°ã䜿ã£ãŠé€å€ããŠãã ãããã°ããŒãã«ãªã«ãŒã«ãç·©ããããããããã®ç¹å®ã®ããŒã«ã¯ .svc.cluster.local ãžã®å°éãèš±å¯ããããšå®çŸ©ããæ¹ãã倿ã容æã«ãªããŸãã ãŠãŒã¹ã±ãŒã¹ 7ïŒã¯ãšãªåœ¢åŒã®å
¥åã«å«ãŸãã SQL ã€ã³ãžã§ã¯ã·ã§ã³ãæ€åºãã AWS WAF ã« SQL ã€ã³ãžã§ã¯ã·ã§ã³ã®æ€åºãçµã¿èŸŒãæ¹æ³ã¯ 2 ã€ãããŸããAWS ãããŒãžãã«ãŒã«ã°ã«ãŒãã® AWSManagedRulesSQLiRuleSet ã䜿çšããæ¹æ³ãšãçµã¿èŸŒã¿ã®ããªããã£ãã§ãã SqliMatchStatement ã䜿çšããæ¹æ³ã§ãããããŒãžãã«ãŒã«ã°ã«ãŒãã¯çã®ããã£ãã«ãŒã«ã»ãããšç
§åããŠæ€æ»ãããããHTML ãã©ãŒã ã URL ãšã³ã³ãŒãããã API ã«å¯ŸããŠã¯é©åãªããã©ã«ãã®éžæè¢ã§ããããã MCP ã®å Žåããã€ããŒã㯠JSON ã§ãããè匱æ§ã®ãããã£ãŒã«ã ( sql ã query ã filter ãªã© ) 㯠$.params.arguments å
ã®æååã§ããJSON ãšã³ã³ãŒããããŠãæå¹ãªãŸãŸã®å
žåçãªã€ã³ãžã§ã¯ã·ã§ã³ãã€ããŒãã¯ãçã®ããã£ã®æ€æ»ãããæããå¯èœæ§ããããŸããããšãã°ãå€ãšããŠåã蟌ãŸãã 1 UNION SELECT username, password FROM users ã¯åšå²ã® JSON æ§é ã«ãã£ãŠåœè£
ãããŠããŸããŸãã MCP ã«ãããŠä¿¡é Œæ§ã®é«ãã¢ãããŒãã¯ã AWS WAF ã® SQL ããŒãµãŒã arguments ãã£ãŒã«ãã«çŽæ¥åããããšã§ãã JsonBody ã«å¯Ÿã㊠SqliMatchStatement ã䜿çšãããšããŸãæå®ãã JSON ãã¹ã«ããæååã®å€ãæœåºããæ¬¡ã«ããããã®å€ã«å¯Ÿã㊠SQL ã®æ§æããŒãµãŒãå®è¡ããŸããJSON ã®ã©ãããŒã§ã¯ãªããå®éã® SQL ã®å
å®¹ãæ€æ»ãããšããããšã§ããããã£ãæ€æ»ããã»ãã®ã«ãŒã«ãšåæ§ã«ã tools/call ã«ã¹ã³ãŒããéå®ãã SQL ãæ£åœã«åãä»ããããŒã«ãã©ãã«ãã§ãŒã³ã§é€å€ããŸãã ã«ãŒã«ã®ããžãã¯ïŒ mcp-method ã tools/call ãšçãããã〠mcp:tool:execute_sql ã®ã©ãã«ãä»äžãããŠããããã〠/params/arguments ãæåºŠ LOW ã® SQL ã€ã³ãžã§ã¯ã·ã§ã³ããŒãµãŒã«æ€åºãããå Žåã«ããã㯠{ "Name": "MCPSQLiProtection", "Priority": 40, "Action": { "Block": {} }, "Statement": { "AndStatement": { "Statements": [ { "ByteMatchStatement": { "SearchString": "tools/call", "FieldToMatch": { "SingleHeader": { "Name": "mcp-method" } }, "PositionalConstraint": "EXACTLY", "TextTransformations": [ { "Priority": 0, "Type": "LOWERCASE" } ] } }, { "NotStatement": { "Statement": { "LabelMatchStatement": { "Scope": "LABEL", "Key": "mcp:tool:execute_sql" } } } }, { "SqliMatchStatement": { "FieldToMatch": { "JsonBody": { "MatchPattern": { "IncludedPaths": [ "/params/arguments" ] }, "MatchScope": "VALUE", "InvalidFallbackBehavior": "NO_MATCH", "OversizeHandling": "NO_MATCH" } }, "SensitivityLevel": "LOW", "TextTransformations": [ { "Priority": 0, "Type": "URL_DECODE" }, { "Priority": 1, "Type": "HTML_ENTITY_DECODE" }, { "Priority": 2, "Type": "LOWERCASE" } ] } } ] } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "MCPSQLiProtection" } } SensitivityLevel ã¯æ
éã«èšå®ããå¿
èŠããããŸããHIGH ã®å ŽåãAWS WAF ã® SQL ããŒãµãŒã¯æŽã£ã圢åŒã® SQL ããã¹ãŠãã©ã°ä»ãããŸããåçŽãª SELECT id FROM users LIMIT 10 ã§ãã£ãŠããSQL ã§ãããšããã ãã§åé¡ãšããŠæ±ãããŸããããã¯ãåŒã³åºãå
ã SQL ãäžåéä¿¡ãã¹ãã§ã¯ãªããšã³ããã€ã³ãã«ã¯é©ããŠããŸããããã£ã«ã¿ãŒåŒãåãä»ããããŒã«ã«ã¯é©ããŠããŸãããMCP ã«ãããŠå®çšçãªèšå®ã¯ LOW ã§ããLOW ã§ã¯ãå
žåçãªã€ã³ãžã§ã¯ã·ã§ã³ããŒã«ãŒ ( OR 1=1 ã UNION SELECT ã ; ã«ããè€æ°ã¹ããŒãã¡ã³ãã®é£çµã EXEC xp_cmdshell ) ãæ€åºãã€ã€ãéåžžã®ãã£ã«ã¿ãŒå€ã«ã¯ãã©ã°ãç«ãŠãŸããã ããã«é¢é£ããŠãããã§è¿°ã¹ãŠããã¹ãèšèšäžã®ãã€ã³ãããããŸããããŒã«ãåŒã³åºãå
ããä»»æã®çã® SQL ãåãä»ããå ŽåãAWS WAF ã®æåºŠèšå®ã§ã¯ãå®å
šãª SELECT ããšãæå³ããªã SELECT ããåºå¥ã§ããŸãããå®å
šãª SQL ã¹ããŒãã¡ã³ãã¯æ§æçã« SQL ã§ãããããŒãµãŒã¯ SQL ãšããŠæ±ããããåŸãŸããã MCP ããŒã«ã¯ãå®å
šãª SQL ã¹ããŒãã¡ã³ãã§ã¯ãªããæ§é åãããåŒæ° ( ããŒãã«åããã£ã«ã¿ãŒåŒãåã®ãªã¹ã ) ãåãåãããã«èšèšããŠãã ãããçã® SQL ãæ±ãããŒã«ã¯ã管çè
åãã® execute_sql ã®ããã«ãéå®çãã€é€å€ããããã¹ã«éå®ããŸãããªãã¡ã¬ã³ã¹å®è£
ã§ã¯ã query_database 㯠filter åŒæ° ( WHERE å¥åœ¢åŒã®åŒ ) ãåãåãã execute_sql ã¯ã©ãã«ã«ãã£ãŠé€å€ãããçã® SQL çšã®ããŒã«ã«ãªã£ãŠããŸãããããç§ãã¡ã®æšå¥šãããã¿ãŒã³ã§ãã ãŠãŒã¹ã±ãŒã¹ 8ïŒé«ã³ã¹ããªããŒã«ã«ã¬ãŒãå¶éãèšãã Mcp-Name ã䜿ãã°ãããŒã«ããšã®ã¬ãŒãå¶éãç°¡åã«å®è£
ã§ããŸãã expensive-tools ã®ãã¿ãŒã³ã»ããã«å«ãŸããããŒã« ( ããŒã¿ããŒã¹ã¯ãšãªãææ APIã倧éã®èšç®åŠç ) ã«ã¯æ§ãããªå¶éãèšå®ããäœã³ã¹ããªããŒã«ã«ã¯ããç·©ãå¶éãèšå®ããŸããAWS WAF ã® RateBasedStatement ã¯ãããã©ã«ãã§ã¯ IP ããšã«éèšããŸããMCP ã®å Žåã¯ã ã«ã¹ã¿ã éçŽã㌠ã䜿çšããŠããŒã«ã®ããããŒã§éèšããç¹å®ã®æäœã«äžéãèšããŸãã EvaluationWindowSec ã«ã¯ 60ã120ã300ã600 ç§ã®ãããããæå®ã§ããŸãããã®äŸã§ã¯ 300 ( 5 å ) ã䜿çšããŠããŸãã ã«ãŒã«ã®ããžãã¯ïŒ mcp-name ã expensive-tools ã®ãã¿ãŒã³ã»ããã«äžèŽãããã€åã mcp-name ãšéä¿¡å
IP ã®çµã¿åããã«ãããªã¯ãšã¹ãã 300 ç§éã« 200 ä»¶ãè¶
ããå Žåã«ããã㯠{ "Name": "MCPExpensiveToolRateLimit", "Priority": 50, "Action": { "Block": {} }, "Statement": { "RateBasedStatement": { "Limit": 200, "EvaluationWindowSec": 300, "AggregateKeyType": "CUSTOM_KEYS", "CustomKeys": [ { "Header": { "Name": "mcp-name", "TextTransformations": [ { "Priority": 0, "Type": "LOWERCASE" } ] } }, { "IP": {} } ], "ScopeDownStatement": { "RegexPatternSetReferenceStatement": { "ARN": "arn:aws:wafv2:us-east-1:123456789012:global/regexpatternset/mcp-expensive-tools/def456", "FieldToMatch": { "SingleHeader": { "Name": "mcp-name" } }, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ] } } } }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "MCPExpensiveToolRateLimit" } } Mcp-Name ãšéä¿¡å
IP ã®çµã¿åããã§éèšããŠããã®ã¯ãåäžã®åŒã³åºãå
ãããŒã«å
šäœã®å²ãåœãŠäºç®ã䜿ãåã£ãŠããŸãããšãé²ãã€ã€ã倿°ã®æ£åœãªåŒã³åºãå
ãããããèªåã®å²ãåœãŠåãå©çšã§ããããã«ããããã§ããããã¯ãOAuth ããŒã¯ã³ããã³ãŒãããã« AWS WAF ã§å®çŸã§ãããåŒã³åºãå
ããšã»ããŒã«ããšãã®å¶éã«ãã£ãšãè¿ãæ¹æ³ã§ããããšããžã«ããã劥åœãªããã©ã«ãã§ãããã ããIP ã¯ã¢ã€ãã³ãã£ãã£ã®ä»£ãããšããŠã¯å€§ãŸããªææšã«ãããŸããããšãŒãžã§ã³ãã®ãã©ãã£ãã¯ã¯å°æ°ã®ããŒã¿ã»ã³ã¿ãŒã®éä¿¡å
IP ç¯å²ããéãããåŸåããããäœåãã®ç°ãªããŠãŒã¶ãŒãããããªæ°ã® IP ã®èåŸã«ãŸãšãŸã£ãŠããŸãããšããããŸããçã®ãŠãŒã¶ãŒããšã®ã¬ãŒãå¶éãè¡ãã¹ãã¬ã€ã€ãŒã¯ãªãªãžã³ã§ããããã¢ã©ãŒããŒã¯ã³ãæ€èšŒããŠãŠãŒã¶ãŒã®ã¢ã€ãã³ãã£ãã£ã確ç«ãããåŸã«è¡ãã¹ãã§ãã ãŠãŒã¹ã±ãŒã¹ 9 ( ãªãã·ã§ã³ )ïŒIP ããšã®ã°ããŒãã«ãªã¬ãŒãå¶é ããŒã«ããšã®å¶éã«å ããŠã /mcp ãã¹ã察象㫠IP åäœã§éèšããã°ããŒãã«ãª RateBasedStatement ãèšå®ãããšãå
šäœã®äžéãèšããããŸããããã«ãããæ€èšŒæžã¿ãã©ããã«ããããããåäžã®éä¿¡å
ãè©äŸ¡ãŠã£ã³ããŠå
ã« N ä»¶ãè¶
ãããªã¯ãšã¹ããéä¿¡ã§ããªããªããŸãã AWS WAF ã§ã¯ EvaluationWindowSec ã®å€ãšã㊠60ã120ã300ã600 ããµããŒãããŠããããããã©ãã£ãã¯ã«å¯Ÿããèãæ¹ã«åã£ããŠã£ã³ããŠãéžæã§ããŸããäžè¬çãªèšå®ã¯ãIP ããšã« 5 åéã®ãŠã£ã³ããŠã§ 5,000 ãªã¯ãšã¹ãã§ãããã®èšå®ã§ããã°ãæ£åœãªãšãŒãžã§ã³ãã®ã¯ãŒã¯ããŒãã劚ããããšãªããæŽèµ°ããã«ãŒããæããã«æªæã®ãã倧éã®ãªã¯ãšã¹ããæ€åºã§ããŸãããŠã£ã³ããŠãçã ( 60 ç§ ) ãããšãããŒã¹ããžã®åå¿ã¯éããªããŸãããéåžžã®ãã©ãã£ãã¯ã®å€åã«å¯Ÿãã蚱容床ã¯äœããªããŸãã å¯èŠ³æž¬æ§ (Observability) ãããã¯ã«ãŒã«ã¯å
šäœåã®ååã«ãããŸããã AWS WAF ã®ãã°èšé² ( Amazon CloudWatch LogsãAmazon S3ãAmazon Data Firehose ãžã®åºå ) ã䜿çšãããšããªã¯ãšã¹ãããšã®èšé²ãååŸã§ããŸããã¬ã³ãŒãã«ã¯ããããŒãçµäºã«ãŒã«ãé©çšãããã©ãã«ãæçµã¢ã¯ã·ã§ã³ãå«ãŸããŸãã Mcp-Method ãš Mcp-Name 㯠httpRequest.headers ã«å«ãŸããŠãããããåãã°ãšã³ããªãèŠãã°ãã©ã®ããŒã«ãåŒã³åºããããããã©ãåŠçãããã®ããããããŸãã ããŒã«åã®æœåºïŒ AWS WAF ã®ãã°ã§ã¯ã httpRequest.headers 㯠{name, value} ãªããžã§ã¯ãã®é
åã§ããæ¬¡ã® Amazon CloudWatch Logs Insights ã®ã¯ãšãªã¯ãããŒã«ããšã«æœåºã»éèšããŸãã fields @timestamp, action, terminatingRuleId, @message | parse @message /"name":"[Mm][Cc][Pp]-[Nn][Aa][Mm][Ee]","value":"(?<tool>[^"]+)"/ | filter ispresent(tool) | stats count() as invocations by tool | sort invocations desc | limit 10 å³ 2. åŒã³åºãåæ°ã®å€ãããŒã«ã衚瀺ãããµã³ãã«ããã·ã¥ããŒã ããŒã«ã®åææ»æã®æ€åºïŒ æ£åžžã«åäœããŠãã MCP ã¯ã©ã€ã¢ã³ãã¯ã2ã3 åã®ããŒã«ãäºæž¬å¯èœãªãã¿ãŒã³ã§ç¹°ãè¿ãåŒã³åºããŸããããã³ããã€ã³ãžã§ã¯ã·ã§ã³ã«ãã£ãŠãšãŒãžã§ã³ããèœåæ¢çŽ¢ãžãšèªå°ããããšãéä¿¡å
IP ããšã®åŒã³åºãããŒã«ã®çš®é¡æ°ãæ¥å¢ããŸããæ°åã®ãã¡ã« 3 çš®é¡ãã 15 çš®é¡ãžãšåŒã³åºãããŒã«ãå¢ãã IP ã¯ãæ¯ãèãã®åœ¢ç¶ãå€åããŠããŸãããã®ã¯ãšãªã§ã¯ãæ¿èªæžã¿ããŒã«ã«å¯Ÿãããã©ã¡ãŒã¿ãŒã®æ¹ããã®ãããªãããå·§åŠãªææ³ã¯æ€åºã§ããŸãããããã§ããåãªãã¹ã«ãŒãããã§ã¯ãªãæå³ã®å€åãæãããããããæ©æèŠåãšããŠåœ¹ç«ã¡ãŸãã æ¬¡ã®ã¯ãšãªã¯ã5 çš®é¡ãè¶
ããããŒã«ãåŒã³åºããŠãã IP ãæœåºããŸãã parse @message /"name":"[Mm][Cc][Pp]-[Nn][Aa][Mm][Ee]","value":"(?<tool>[^"]+)"/ | parse @message /"clientIp":"(?<ip>[^"]+)"/ | filter ispresent(tool) | stats countDistinct(tool) as tools_called_by_ip, count() as total_reqs_by_ip by ip | filter tools_called_by_ip > 5 | sort tools_called_by_ip desc å³ 3. éä¿¡å
IP ããšã®åŒã³åºãããŒã«ã®çš®é¡æ°ãåäžã® IP ããåŒã³åºãããããŒã«ã®çš®é¡æ°ãæ¥å¢ããŠããå Žåãããã³ããã€ã³ãžã§ã¯ã·ã§ã³ã«ããèœåæ¢çŽ¢ãè¡ãããŠããå¯èœæ§ããããŸãã æ¯ãèãã®ããŒã¹ã©ã€ã³ïŒãšãŒãžã§ã³ãã®ã¢ã€ãã³ãã£ã㣠à ããŒã«ã®ãã£ã³ã¬ãŒããªã³ãïŒ Bot Control ã® CategoryAI ã«ãŒã«ã¯ããšã³ããã€ã³ããåŒã³åºããŠããæ€èšŒæžã¿ã® AI ããããæ€åºããŸããéåžžã®éçšã§ã¯ãæ€èšŒæžã¿ã®ãšãŒãžã§ã³ããšããã®ãšãŒãžã§ã³ããåŒã³åºãããŒã«ã®é¢ä¿ã¯å®å®ããŠããŸããæªæ€èšŒãŸãã¯ãªãããŸãã®ãšãŒãžã§ã³ãã«ã¯ bot:name ã©ãã«ãä»äžãããªãããããã®æ¹æ³ã§ã¯ããããæ€åºã§ããŸãããããã§ããæšæ¥ãŸã§ååšããªãã£ãæ°ãã ( ãšãŒãžã§ã³ããããŒã« ) ãã¢ãåºçŸããå Žåãäžæµã§äœããå€åããããšã瀺ããããæçšãªããŒã¹ã©ã€ã³ã«ãªããŸããæ¬¡ã®ã¯ãšãªã¯ããã®å¯Ÿå¿é¢ä¿ãäœæããŸãã parse @message /awswaf:managed:aws:bot-control:bot:category:(?<category>[^"]+)/ | parse @message /awswaf:managed:aws:bot-control:bot:name:(?<bot_name>[^"]+)/ | parse @message /"name":"[Mm][Cc][Pp]-[Nn][Aa][Mm][Ee]","value":"(?<tool>[^"]+)"/ | filter category = "ai" and ispresent(tool) | stats count() as calls by bot_name, tool | sort calls desc å³ 4. MCP ãšã³ããã€ã³ããžã®æ€èšŒæžã¿ãšæªæ€èšŒã®ãšãŒãžã§ã³ãã®ãã©ãã£ãã¯ã瀺ã AI ãã©ãã£ãã¯åæããã·ã¥ããŒã AWS WAF ã³ã³ãœãŒã«ã§ç¡æã§å©çšã§ãã AI ãã©ãã£ãã¯åæããã·ã¥ããŒã ã䜿çšããŠã MCP ãšã³ããã€ã³ããžã®æ€èšŒæžã¿ãšæªæ€èšŒã®ãšãŒãžã§ã³ãã®ãã©ãã£ãã¯ãåæããããšãã§ããŸãã å³ 5. ãªã¯ãšã¹ãæ°ãšã«ããŽãªå¥ã®äžäœã®ãããã¯ããŒã©ãŒãMCP ãšã³ããã€ã³ãã«ã¢ã¯ã»ã¹ããŠãã BedrockbotãClaudebotãGPTBot ãªã©ã®æ€èšŒæžã¿ AI ãšãŒãžã§ã³ããèå¥ããŠããŸãã ç°åžžæ€åºïŒ ã©ãã«ä»ãã«ãŒã«ã®ã¡ããªã¯ã¹ã«å¯Ÿã㊠Amazon CloudWatch ç°åžžæ€åºã䜿çšããéå»ã®ç¯å²ããã®éžè±ãæ€ç¥ããŸããã¢ãŒã«ã€ããããã°ã«å¯Ÿã㊠Amazon Athena ã®æ¥æ¬¡ã¯ãšãªãå®è¡ãããããŒã«ã®çš®é¡æ°ãã®ã·ã°ãã«ã確èªããŸãã1 æ¥ã®ãã¡ã«åŒã³åºãããŒã«ã®çš®é¡æ°ã 3 ãã 15 ã«æ¥å¢ãããšãŒãžã§ã³ãã¯ãæ¯ãèãã®åœ¢ç¶ãå€åããŠããŸããããã¯ãéåžžã®ãªã¯ãšã¹ãéããã匷åãªããã³ããã€ã³ãžã§ã¯ã·ã§ã³ã®å
åã§ãããããã¯ããã mcp-name ã®å€ã«ã€ããŠãäžäœã³ã³ããªãã¥ãŒã¿ãŒãç¶ç¶çã«ææ¡ããã«ã¯ Amazon CloudWatch Contributor Insights ã䜿çšããŸãã ã¢ã©ãŒãïŒããŒãžã³ã° ( åŒã³åºã ) ã«å€ããã¢ã©ãŒãã¯ãæç€ºçãªãããã¯ã«çŽã¥ããããŠããŸãïŒ SSRF ã®ããã㯠ïŒå³åº§ã«ããŒãžã³ã°ãSSRF ã®ãããã¯ã¯ãå
éšã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãžã®å°éãå®éã«è©Šã¿ãããŠããããšã瀺ããŸãã æªæ¿èªããŒã«ã®ãããã¯ã®æ¥å¢ ïŒããã³ããã€ã³ãžã§ã¯ã·ã§ã³ã®å¯èœæ§ãããã€ãã³ããšããŠèª¿æ»ããŸãããããã¯ãããããŒã«åŒã³åºããæ¥å¢ããŠããå ŽåããšãŒãžã§ã³ããæäœãããŠããå¯èœæ§ããããŸãã ã¬ãŒãå¶éãžã®ç¶ç¶çãªå°é ïŒäººã«ããã¬ãã¥ãŒã«ãšã¹ã«ã¬ãŒã·ã§ã³ããŸããã°ããŒãã«ãªã¬ãŒãäžéã«ç¶ç¶çã«éããŠããåŒã³åºãå
ã¯ãæåã§èª¿æ»ãã¹ãã»ã©ç°åžžãªåäœãããŠããŸãã å®å
šã«ãããã€ãã ãã¹ãŠã®ã«ãŒã«ã¯ãBlock ãæå¹ã«ããåã« Count ã¢ãŒãã§ãããã€ããŠãã ãããCount ã¢ãŒãã§ã¯ããã©ãã£ãã¯ããããã¯ããã«ãªã¯ãšã¹ããè©äŸ¡ããäžèŽããçµæã Amazon CloudWatch ã®ã¡ããªã¯ã¹ã«èšé²ããŸã ( ãã¹ããšãã¥ãŒãã³ã° ) ããµã³ããªã³ã°ããããªã¯ãšã¹ãã確èªããŠèª€æ€ç¥ãç¹å®ããã¹ã³ãŒãããŠã³ã¹ããŒãã¡ã³ããã©ãã«ã«åºã¥ãé€å€ã§ãã¥ãŒãã³ã°ããŸã ( ãµã³ããªã³ã°ããããªã¯ãšã¹ã ) ã圱é¿ãåãåããå¿
èŠã«å¿ããŠåå¥ã®ã«ãŒã«ãå
ã«æ»ããããã«ãã«ãŒã«ã¯ 1 ã€ã〠Block ã«åãæ¿ããŠãã ãããBlock ã«åãæ¿ããããšãã SampledRequestsEnabled 㯠true ã®ãŸãŸã«ããŠãããŸãã AWS WAF ã¯ãã«ãŒã«ããšã«äžèŽãããªã¯ãšã¹ãã®ããŒã¿ã 3 æéä¿æããŸãã ãŸãšã 2026 幎 7 æ 28 æ¥ã®æ¹å®ã«ããã MCP ã¯ããããŒã«ååãªæ§é åã¡ã¿ããŒã¿ãæã€ HTTP ãããã³ã«ãšãªãããšããžã§ã®ã»ãã¥ãªãã£å¯ŸçãçŸå®çãªéžæè¢ã«ãªããŸãããé©åãªé åºã§æ§æãã AWS WAF ã®ã¹ã¿ãã¯ã䜿ãã°ã MCP ãµãŒããŒã®ã³ãŒãã倿Žããããšãªããå
ç¢ãªå¢çé²åŸ¡ãå®çŸã§ããŸãã AWS WAF ã®ãã°ãšã©ãã«ãããšã«æ§ç¯ããå¯èŠ³æž¬æ§ã®ã¬ã€ã€ãŒã«ããããã®å¢çå
šäœã§ãšãŒãžã§ã³ããäœãããŠããã®ããææ¡ã§ããŸãããŠãŒã¶ãŒããšã®ã¬ãŒãå¶éã¯ãæå³çã«ãšããžã§ã¯è¡ã£ãŠããŸããããŠãŒã¶ãŒããšã®ã¬ãŒãå¶éã¯ããã¢ã©ãŒããŒã¯ã³ãæ€èšŒããåŒã³åºãå
ã® ID ãæç¢ºã«æ±ãããªãªãžã³ã§è¡ãã¹ããã®ã§ãããŠãŒã¶ãŒã IP ã«åºã¥ãã¬ãŒãå¶éãå®çŸããããŸããŸãªææ³ã«ã€ããŠã¯ãã»ãã«ãããã€ãã®ããã°ã§ç޹ä»ããŠããŸããããšãã°ã Limiting requests to a web application using a Gatekeeper Solution ãåç
§ããŠãã ããã èè
ã«ã€ã㊠Jaiganesh Girinathan Jaiganesh Girinathan ã¯ãAWS ã®ã³ã³ãã³ãé
ä¿¡ãããã¯ãŒã¯ãšãšããžã³ã³ãã¥ãŒãã£ã³ã°ã®æ©èœãå°éãšããããªã³ã·ãã«ãšããžã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ããéå» 20 幎ã«ãããäžçäžã®ã¡ãã£ã¢æ¥çã®ã客æ§ãæ¯æŽãããã©ãããã©ãŒã ã®ã¢ããã€ãºãšæ¡åŒµã«åãçµãã§ããŸãããã客æ§ã®éèŠãªããŒãºã«å¿ãããœãªã¥ãŒã·ã§ã³ã®æ§ç¯ã«æ
ç±ã泚ãã§ããŸããä»äºä»¥å€ã§ã¯ããããŠãæç©ºãçºããŠããŸãã Harith Shantan Gaddamanugu Harith ã¯ãAWS ã®ã·ãã¢ãšããžã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ããäžçäžã®äœçŸäžäººãã®ãŠãŒã¶ãŒãå©çšãããéèŠãªã€ã³ãã©ã¹ãã©ã¯ãã£ãšã»ãã¥ãªãã£ã®ãœãªã¥ãŒã·ã§ã³ãèšèšããŠããŸããã¯ã©ãŠãã®å¢çé²åŸ¡ãšãŠã§ãã®é«éåã«é¢ãã 10 幎ã®å°éç¥èãæŽ»ãããã¬ãžãªãšã³ããªã¢ãŒããã¯ãã£ãæ§ç¯ããå€§äŒæ¥ãæ¯æŽããŠããŸããä»äºä»¥å€ã§ã¯ãå®¶æãšã®ãã€ãã³ã°ã颚æ¯åçã®æ®åœ±ã楜ããã§ããŸãã Kaustubh Phatak Kaustubh ã¯ãAI/ML ã·ã¹ãã ãšãšã³ã¿ãŒãã©ã€ãºåãã»ãã¥ãªãã£ãœãªã¥ãŒã·ã§ã³ãå°éãšãããããã¯ããªãŒããŒã§ããAI ãæŽ»çšãããããã¯ããå€§èŠæš¡ã«å±éããéšé暪æããŒã ãçããã»ãã¥ãªãã£ã¢ãŒããã¯ãã CISO ãšç·å¯ã«é£æºããªãããAI ã®ã€ãããŒã·ã§ã³ãšãµã€ããŒã»ãã¥ãªãã£ãªã¹ã¯ã亀ããé åã®èª²é¡ã«åãçµãã§ããŸããããšãã«ãåŸæ¥ã®ãã¬ãŒã ã¯ãŒã¯ãéçšããªãæ°ããæè¡é åã«ãããŠãè€éãªæè¡çæ©èœãããžãã¹äŸ¡å€ãžãšçµã³ã€ããããšã«æ³šåããŠããŸãã Ted Middleton Ted Middleton ã¯ãAWS ã®ãšããžã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãããŒã ã®ã°ããŒãã«ãªãŒããŒã§ããã以å㯠CloudFront ããŒã ã®ããªã³ã·ãã«ãããã¯ããããŒãžã£ãŒãåããŠããŸãããCDN ãšãšããžãµãŒãã¹ã«ãã㊠20 幎以äžã®çµéšãæã£ãŠããŸãã 翻蚳ã¯ãããã§ãã·ã§ãã«ãµãŒãã¹ã®éŽæšïŒéïŒãæ
åœããŸããã