终极mcp-use网络安全配置指南:10个关键步骤防御常见攻击
【免费下载链接】mcp-use 项目地址: https://gitcode.com/gh_mirrors/mc/mcp-use
mcp-use作为强大的MCP服务器和LLM代理框架,在提供强大功能的同时也面临着严峻的网络安全挑战。通过正确的配置和最佳实践,你可以有效保护你的应用程序、数据和基础设施免受常见攻击。🚀
为什么mcp-use安全配置如此重要?
MCP服务器拥有强大的能力,包括文件系统访问、网络请求和代码执行权限。一个配置不当的mcp-use实例可能成为攻击者入侵系统的跳板。mcp-use安全配置的核心在于平衡功能性和安全性,确保在发挥框架优势的同时最小化安全风险。
API密钥管理:安全第一道防线
环境变量保护
永远不要在源代码中硬编码API密钥。使用环境变量是保护敏感信息的最佳实践:
import os
from dotenv import load_dotenv
# 从.env文件加载环境变量
load_dotenv()
# 安全访问API密钥
openai_key = os.getenv("OPENAI_API_KEY")
anthropic_key = os.getenv("ANTHROPIC_API_KEY")
if not openai_key:
raise ValueError("OPENAI_API_KEY环境变量是必需的")
.env文件安全配置
创建安全的.env文件时,确保包含必要的安全设置:
# LLM提供商密钥
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GROQ_API_KEY=gsk_...
# MCP服务器配置
FILESYSTEM_ROOT=/safe/workspace
DATABASE_URL=postgresql://user:pass@localhost/db
# 可选:安全设置
MCP_TIMEOUT=30
MAX_TOOL_CALLS=10
ALLOWED_DOMAINS=example.com,api.service.com
MCP服务器安全配置
文件系统服务器防护
当使用文件系统服务器时,限制访问安全目录至关重要:
{
"mcpServers": {
"filesystem": {
"command": "mcp-server-filesystem",
"args": [
"/workspace/safe-directory",
"--readonly",
"--max-file-size", "10MB",
"--allowed-extensions", ".txt,.md,.json,.py"
],
"env": {
"FILESYSTEM_READONLY": "true",
"MAX_FILE_SIZE": "10485760"
}
}
}
}
网络访问限制
为基于Web的MCP服务器限制网络访问:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
"env": {
"PLAYWRIGHT_HEADLESS": "true",
"ALLOWED_DOMAINS": "example.com,api.trusted-service.com",
"BLOCK_PRIVATE_IPS": "true",
"DISABLE_JAVASCRIPT": "false",
"TIMEOUT": "30000"
}
}
}
}
代理安全配置策略
工具访问限制
通过定义允许和禁止的工具列表来限制代理可以使用的工具:
from mcp_use import MCPAgent, MCPClient
from langchain_openai import ChatOpenAI
# 定义允许和禁止的工具
ALLOWED_TOOLS = [
"file_read",
"file_write",
"web_search",
"web_scrape"
]
DISALLOWED_TOOLS = [
"system_execute",
"network_request",
"database_write",
"file_delete"
]
async def create_secure_agent():
client = MCPClient.from_config_file("secure_config.json")
llm = ChatOpenAI(model="gpt-4")
agent = MCPAgent(
llm=llm,
client=client,
allowed_tools=ALLOWED_TOOLS,
disallowed_tools=DISALLOWED_TOOLS,
max_steps=20, # 限制执行步骤
timeout=300, # 5分钟超时
use_server_manager=True
)
return agent
输入验证机制
在处理用户输入前进行验证:
import re
from typing import List, Optional
class InputValidator:
def __init__(self):
self.max_length = 1000
self.blocked_patterns = [
r'rm\s+-rf', # 危险命令
r'sudo', # 权限提升
r'chmod\s+777', # 权限变更
r'\.\./', # 路径遍历
r'<script', # XSS尝试
r'DROP\s+TABLE', # SQL注入
]
def validate_query(self, query: str) -> tuple[bool, Optional[str]]:
"""验证用户查询是否存在安全问题"""
# 检查长度
if len(query) > self.max_length:
return False, f"查询过长(最多{self.max_length}个字符)"
# 检查被阻止的模式
for pattern in self.blocked_patterns:
if re.search(pattern, query, re.IGNORECASE):
return False, f"查询包含被阻止的模式:{pattern}"
# 检查可疑字符
suspicious_chars = ['&', '|', ';', '`', '$']
if any(char in query for char in suspicious_chars):
return False, "查询包含潜在危险字符"
return True, None
# 使用
validator = InputValidator()
async def secure_query_handler(user_query: str):
is_valid, error = validator.validate_query(user_query)
if not is_valid:
raise ValueError(f"无效查询:{error}")
agent = await create_secure_agent()
return await agent.run(user_query)
速率限制实现
实施速率限制以防止滥用:
import time
from collections import defaultdict
from typing import Dict, Tuple
class RateLimiter:
def __init__(self, max_requests: int = 10, window_seconds: int = 60):
self.max_requests = max_requests
self.window_seconds = window_seconds
self.requests: Dict[str, List[float]] = defaultdict(list)
def is_allowed(self, user_id: str) -> Tuple[bool, str]:
"""检查用户是否在速率限制范围内"""
now = time.time()
window_start = now - self.window_seconds
# 清理旧请求
self.requests[user_id] = [
req_time for req_time in self.requests[user_id]
if req_time > window_start
]
# 检查是否在限制内
if len(self.requests[user_id]) >= self.max_requests:
return False, f"超出速率限制:{self.max_requests} 请求每 {self.window_seconds} 秒"
# 记录此请求
self.requests[user_id].append(now)
return True, ""
# 使用
rate_limiter = RateLimiter(max_requests=5, window_seconds=60)
async def rate_limited_query(user_id: str, query: str):
allowed, message = rate_limiter.is_allowed(user_id)
if not allowed:
raise ValueError(message)
agent = await create_secure_agent()
return await agent.run(query)
安全监控和日志记录
综合安全日志
实施全面的安全日志记录:
import logging
import json
from datetime import datetime
from typing import Any, Dict
class SecurityLogger:
def __init__(self, log_file: str = "security.log"):
self.logger = logging.getLogger("mcp_security")
handler = logging.FileHandler(log_file)
formatter = logging.Formatter(
'%(asctime)s - %(levelname)s - %(message)s'
)
handler.setFormatter(formatter)
self.logger.addHandler(handler)
self.logger.setLevel(logging.INFO)
def log_agent_start(self, user_id: str, query: str):
"""记录代理开始处理时"""
self.logger.info(f"代理已启动 - 用户:{user_id}, 查询:{query[:100]}...")
def log_tool_usage(self, user_id: str, tool_name: str, success: bool):
"""记录工具使用尝试"""
status = "成功" if success else "失败"
self.logger.info(f"工具已使用 - 用户:{user_id}, 工具:{tool_name}, 状态:{status}")
def log_security_violation(self, user_id: str, violation_type: str, details: str):
"""记录安全违规"""
self.logger.warning(f"安全违规 - 用户:{user_id}, 类型:{violation_type}, 详情:{details}")
def log_error(self, user_id: str, error: str):
"""记录错误"""
self.logger.error(f"错误 - 用户:{user_id}, 错误:{error}")
# 使用
security_logger = SecurityLogger()
async def monitored_agent_run(user_id: str, query: str):
security_logger.log_agent_start(user_id, query)
try:
agent = await create_secure_agent()
result = await agent.run(query)
security_logger.log_tool_usage(user_id, "agent_complete", True)
return result
except Exception as e:
security_logger.log_error(user_id, str(e))
raise
生产环境安全部署
容器安全配置
使用安全的容器配置:
FROM python:3.9-slim
# 创建非root用户
RUN groupadd -r mcpuser && useradd -r -g mcpuser mcpuser
# 安装安全更新
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y --no-install-recommends \
ca-certificates && \
rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 复制requirements并安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用程序代码
COPY . .
# 设置所有权和权限
RUN chown -R mcpuser:mcpuser /app
USER mcpuser
# 暴露端口
EXPOSE 8000
# 运行应用程序
CMD ["python", "main.py"]
常见安全漏洞防护
路径遍历预防
import os
from pathlib import Path
def secure_file_path(base_dir: str, user_path: str) -> str:
"""安全解析用户提供的文件路径"""
base = Path(base_dir).resolve()
target = (base / user_path).resolve()
# 确保目标在基础目录内
if not str(target).startswith(str(base)):
raise ValueError("检测到路径遍历尝试")
return str(target)
# 在MCP服务器配置中使用
safe_workspace = secure_file_path("/workspace", user_provided_path)
命令注入防护
import shlex
def secure_command_args(command: str, args: List[str]) -> List[str]:
"""安全构建命令参数"""
# 白名单允许的命令
allowed_commands = ["node", "python", "npm", "pip"]
if command not in allowed_commands:
raise ValueError(f"命令'{command}'不被允许")
# 转义参数
safe_args = [shlex.quote(arg) for arg in args]
return [command] + safe_args
终极安全配置清单
✅ API密钥安全
- API密钥存储在环境变量或密钥管理器中
- 源代码中没有硬编码的凭据
- .env文件已添加到.gitignore
- 定期API密钥轮换已实施
- API密钥采用最小权限访问
✅ MCP服务器安全
- 文件系统访问限制在安全目录
- 网络访问限制在必要域名
- 数据库连接尽可能使用只读账户
- 所有服务器参数都进行了输入验证
- 资源配置了资源限制(超时、文件大小等)
✅ 代理配置
- 使用允许/禁止列表限制工具访问
- 限制了最大执行步骤
- 为代理操作配置了超时
- 实施了输入验证
- 设置了速率限制
✅ 监控和日志记录
- 记录了安全事件
- 配置了监控面板
- 为安全违规设置了警报
- 实施了日志保留策略
- 安排了定期安全审计
持续安全维护策略
安全是一个持续的过程。定期审查和更新你的安全实践,监控新的漏洞,并保持所有依赖项的最新状态。通过实施这些mcp-use安全配置最佳实践,你可以显著降低安全风险,同时充分利用这个强大框架的功能优势。🛡️
【免费下载链接】mcp-use 项目地址: https://gitcode.com/gh_mirrors/mc/mcp-use
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考







