SuperAPI AI 工具集

mcp-server-security

安全与审计

查看项目

更新于 10-15 14:23

技能介绍

MCP Server Security 是一份针对 Model Context Protocol(MCP)服务器的综合加固指南。MCP 是连接 AI 智能体与外部工具、数据源和服务的开放标准。由于 MCP 服务器会在真实基础设施上执行真实操作,因此是高价值攻击面。本技能覆盖在生产环境向智能体暴露 MCP 服务器之前所需的各层防御。

一、适用时机

在以下情况应用本技能:向 AI 智能体暴露工具(文件系统、数据库、API)的 MCP 服务器部署;通过 stdio、SSE 或 Streamable HTTP 传输将智能体运行时(Claude Desktop、Cursor、自定义编排器)连接到一个或多个 MCP 服务器;构建多个用户共享同一 MCP 服务器的多租户平台;通过 MCP 资源传递敏感数据(PII、凭据、内部文档);在 SOC 2、HIPAA、PCI-DSS 等要求工具调用可审计的受监管环境中运行。若 MCP 服务器仅在本地通过 stdio 为单个开发者运行且无网络暴露,可放宽部分传输层控制,但输入验证和审计日志仍然适用。

二、MCP 威胁模型

加固前需理解所防御的威胁,包括:未授权工具访问(智能体调用用户无权访问的工具,导致权限提升、数据泄露);通过资源的提示注入(MCP 资源中的恶意内容影响智能体行为,导致任意工具执行);通过结果的数据外泄(工具结果将敏感数据泄露回不可信智能体,导致数据丢失、合规违规);通过 MCP 工具的 SSRF(智能体诱使工具发起内部网络请求,导致内部服务受损);凭据窃取(API 密钥或令牌在 MCP 服务器上存储不安全,导致账户完全接管);拒绝服务(智能体以工具调用或超大负载淹没服务器,导致服务不可用);中间人攻击(智能体与 MCP 服务器之间传输未加密,导致窃听、请求篡改);供应链攻击(恶意 MCP 服务器包或插件,导致任意代码执行)。

三、传输安全

  1. Streamable HTTP 与 SSE 传输的 TLS:每个通过 HTTP 暴露的 MCP 服务器都必须终止 TLS,生产环境绝不运行明文 HTTP。资料提供了 Nginx 反向代理 TLS 终止配置示例,包括 TLSv1.3、指定密码套件、HSTS 头,以及针对 SSE 的 proxy_buffering off、proxy_cache off、proxy_read_timeout 86400s 等设置。

  2. 智能体与服务器之间的 mTLS:高安全环境可要求智能体(客户端)出示证书。资料提供了在 server 块中添加 ssl_client_certificate、ssl_verify_client on、ssl_verify_depth 的配置,以及使用 openssl 创建 CA 和签发智能体客户端证书的命令。

  3. 保护 stdio 传输:对于本地基于 stdio 的服务器,攻击面是进程边界本身。资料提供了 claude_desktop_config.json 示例,通过 NODE_OPTIONS 的 --experimental-permission、--allow-fs-read、--allow-fs-write 限制 stdio 服务器权限。

四、认证与授权

  1. OAuth 2.1 集成:MCP 的 Streamable HTTP 传输支持 OAuth 2.1 进行客户端认证。资料提供了使用 jsonwebtoken 验证 Bearer 令牌的中间件示例,校验 RS256 算法、issuer、audience,并附加 scope 和用户 ID 供下游授权使用。

  2. API 密钥管理:对于较简单的部署,使用服务端存储的哈希 API 密钥。资料提供了使用 crypto 的 createHash 和 timingSafeEqual 的示例,包含 ApiKeyRecord 接口(hashedKey、userId、allowedTools、rateLimit、expiresAt),强调存储哈希密钥而非明文,并包含过期检查。

五、工具授权

  1. 允许列表模式:绝不向每个用户暴露所有工具,需定义显式允许列表。资料提供了 config/tool-policy.yaml 示例,按角色(developer、admin、readonly-agent)定义 allowed_tools 和 denied_tools,并定义 dangerous_tools(execute_command、write_file、query_database)及其风险等级、是否需要审批、每会话最大执行次数、允许的操作。

  2. 按用户执行工具访问控制:资料提供了 src/toolAuth.ts 示例,读取 YAML 策略,实现 isToolAllowed 函数(显式拒绝优先,再检查允许),并通过包装 server.callTool 实现 authorizedToolHandler,在调用前校验用户角色与工具名,拒绝时返回错误。

六、输入验证

  1. 工具参数的 JSON Schema:为每个工具的输入定义严格 schema,拒绝不符合的内容。资料提供了使用 Ajv 和 ajv-formats 的 src/validation.ts 示例,包含 read_file(path 使用正则禁止路径遍历字符、maxLength 256)和 query_database(query、database 枚举、parameters 数组)的 schema,以及 validateToolInput 函数。

  2. SQL 注入防护:绝不将智能体提供的原始字符串传入查询,使用参数化查询和语句级限制。资料提供了 src/safeSql.ts 示例,包含 FORBIDDEN_PATTERNS 正则列表(DROP/ALTER/TRUNCATE 等、UNION SELECT、INTO OUTFILE、LOAD_FILE、xp_cmdshell),sanitizeSqlQuery 函数仅允许 SELECT 语句,以及 handleDatabaseQuery 使用参数化执行。

  3. 文件系统路径注入防护:资料提供了 src/safePath.ts 示例,定义 SANDBOX_ROOT,resolveSafePath 函数将路径解析为绝对路径并验证位于沙箱内,同时通过 realpathSync.native 阻止符号链接逃逸。

七、资源访问控制

  1. 文件系统沙箱:除应用层路径验证外,使用操作系统级控制。资料提供了 run-mcp-sandboxed.sh 示例,使用 unshare 进行 Linux 命名空间沙箱化,创建只读绑定挂载、可写输出目录,并用 tmpfs 屏蔽 /etc/ssh、/root、/home/mcpuser/.ssh 等敏感主机路径。

  2. 数据库查询限制:为 MCP 服务器创建专用只读数据库用户。资料提供了 PostgreSQL 示例,创建 mcp_readonly 角色、仅授予特定 schema 的 SELECT 权限、启用行级安全策略(sensitivity_level < 3)、设置 statement_timeout 和 work_mem 资源限制。

  3. 网络访问控制:防止 MCP 工具访问内部服务(SSRF 缓解)。资料提供了 src/networkPolicy.ts 示例,定义 BLOCKED_CIDRS(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8、169.254.169.254/32 云元数据端点、fd00::/8)和 ALLOWED_DOMAINS,validateOutboundUrl 函数仅允许 HTTPS 且域名在允许列表中。

八、速率限制

  1. 按客户端速率限制:资料提供了 src/rateLimit.ts 示例,使用令牌桶算法,定义 RateBucket 接口、DEFAULT_RATE(每分钟 60 请求)、DEFAULT_BURST(最大突发 10),checkRateLimit 函数根据经过时间补充令牌。资料在此处截断,后续内容暂未提供。

九、限制与说明

资料未提供该技能的收费、价格、平台支持范围、实际效果或完整使用步骤等信息。资料中部分代码示例(如速率限制部分)在结尾处被截断,完整内容暂未提供。