mcp-use权限控制详解:细粒度访问管理
【免费下载链接】mcp-use 项目地址: https://gitcode.com/gh_mirrors/mc/mcp-use
MCP (Micro-Control Protocol) 系统的权限控制是保障数据安全和操作合规性的核心环节。随着企业级应用中多用户协作需求的增长,细粒度的访问管理已成为必备能力。本文将系统介绍mcp-use的权限控制体系,包括API密钥管理、服务器访问限制、代理权限配置及审计监控等关键环节,帮助运营和技术人员构建安全可控的MCP应用环境。
权限控制体系架构
mcp-use采用分层权限控制模型,从基础设施层到应用层实现全链路安全防护。该模型基于"最小权限原则"设计,确保每个用户、服务和进程仅能访问完成其工作所需的最小资源集合。
权限控制体系包含四个核心层级:
- 网络层:通过IP白名单、TLS加密和网络策略限制通信范围
- 服务层:基于OAuth 2.0和API密钥实现服务间身份验证
- 资源层:对文件系统、数据库等资源实施路径和操作限制
- 操作层:精确控制工具调用权限和执行范围
API密钥安全管理
API密钥是MCP系统最基础的安全边界,不当的密钥管理将导致严重安全风险。mcp-use提供多层次密钥保护机制,满足从开发环境到生产环境的不同安全需求。
环境变量配置
开发环境中,应使用环境变量而非硬编码方式存储密钥:
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文件结构:
# 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
重要:务必将.env文件添加到.gitignore中,防止密钥泄露:
# 环境变量文件
.env
.env.local
.env.*.local
# 密钥和证书
*.pem
*.key
secrets/
企业级密钥管理
生产环境中,应使用专业密钥管理服务替代文件存储:
AWS Secrets Manager集成
import boto3
from botocore.exceptions import ClientError
def get_secret(secret_name, region_name="us-east-1"):
session = boto3.session.Session()
client = session.client('secretsmanager', region_name=region_name)
try:
response = client.get_secret_value(SecretId=secret_name)
return response['SecretString']
except ClientError as e:
raise e
# 使用示例
openai_key = get_secret("prod/mcp-use/openai-key")
HashiCorp Vault集成
import hvac
client = hvac.Client(url='https://vault.example.com')
client.token = os.getenv('VAULT_TOKEN')
# 读取密钥
response = client.secrets.kv.v2.read_secret_version(
path='mcp-use/api-keys'
)
openai_key = response['data']['data']['openai_key']
MCP服务器权限配置
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"
}
}
}
}
关键安全参数说明:
--readonly: 启用只读模式,防止文件篡改--max-file-size: 限制单个文件操作大小--allowed-extensions: 限制可操作文件类型FILESYSTEM_ROOT: 定义文件系统访问根目录,防止路径遍历
数据库访问权限控制
数据库服务器配置应遵循最小权限原则,根据业务需求限制操作范围:
{
"mcpServers": {
"postgres": {
"command": "mcp-server-postgres",
"env": {
"DATABASE_URL": "${DATABASE_URL}",
"CONNECTION_TIMEOUT": "30",
"MAX_CONNECTIONS": "5",
"READONLY_MODE": "true",
"ALLOWED_SCHEMAS": "public,reporting",
"BLOCKED_TABLES": "users,passwords,secrets"
}
}
}
}
安全配置要点:
READONLY_MODE: 对不需要写入的场景启用只读模式ALLOWED_SCHEMAS: 明确指定可访问的数据库模式BLOCKED_TABLES: 阻止敏感表的访问MAX_CONNECTIONS: 限制并发连接防止DoS攻击
网络访问控制
Web访问型服务器需限制目标域名和资源类型,防止数据泄露:
{
"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"
}
}
}
}
代理(Agent)权限控制
MCP代理作为业务逻辑执行单元,其权限控制直接关系到操作安全性。通过工具访问限制、输入验证和执行控制,可以有效降低操作风险。
工具访问权限控制
通过白名单机制精确控制代理可使用的工具集:
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
执行控制与速率限制
通过执行步数限制、超时控制和速率限制防止滥用:
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"速率限制 exceeded: {self.max_requests}次请求/{self.window_seconds}秒"
# 记录本次请求
self.requests[user_id].append(now)
return True, ""
审计日志与监控
完善的审计日志和实时监控是权限控制的重要补充,通过记录关键操作和异常行为,可以及时发现并响应安全事件。
安全日志实现
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"Agent started - User: {user_id}, Query: {query[:100]}...")
def log_tool_usage(self, user_id: str, tool_name: str, success: bool):
"""记录工具使用情况"""
status = "SUCCESS" if success else "FAILED"
self.logger.info(f"Tool used - User: {user_id}, Tool: {tool_name}, Status: {status}")
def log_security_violation(self, user_id: str, violation_type: str, details: str):
"""记录安全违规事件"""
self.logger.warning(f"SECURITY VIOLATION - User: {user_id}, Type: {violation_type}, Details: {details}")
def log_error(self, user_id: str, error: str):
"""记录错误事件"""
self.logger.error(f"Error - User: {user_id}, Error: {error}")
安全监控指标
通过Prometheus等工具监控关键安全指标:
from prometheus_client import Counter, Histogram, start_http_server
import time
# 定义监控指标
REQUEST_COUNT = Counter('mcp_requests_total', '总请求数', ['user_id', 'status'])
REQUEST_DURATION = Histogram('mcp_request_duration_seconds', '请求持续时间')
SECURITY_VIOLATIONS = Counter('mcp_security_violations_total', '安全违规次数', ['type'])
async def monitored_agent_execution(user_id: str, query: str):
start_time = time.time()
try:
# 安全检查
is_valid, error = validator.validate_query(query)
if not is_valid:
SECURITY_VIOLATIONS.labels(type='invalid_query').inc()
raise ValueError(error)
# 速率限制检查
allowed, message = rate_limiter.is_allowed(user_id)
if not allowed:
SECURITY_VIOLATIONS.labels(type='rate_limit').inc()
raise ValueError(message)
# 执行代理任务
agent = await create_secure_agent()
result = await agent.run(query)
REQUEST_COUNT.labels(user_id=user_id, status='success').inc()
return result
except Exception as e:
REQUEST_COUNT.labels(user_id=user_id, status='error').inc()
raise
finally:
REQUEST_DURATION.observe(time.time() - start_time)
# 启动指标服务器
start_http_server(8000)
权限控制最佳实践
安全检查清单
- [ ] API密钥存储在环境变量或密钥管理器中 - [ ] 源代码中无硬编码凭证 - [ ] .env文件已添加到.gitignore - [ ] 已实施定期API密钥轮换机制 - [ ] API密钥采用最小权限原则配置 - [ ] 文件系统访问限制在安全目录 - [ ] 网络访问限制在必要域名 - [ ] 数据库连接使用只读账户(如适用) - [ ] 所有服务器参数均实施输入验证 - [ ] 已配置资源限制(超时、文件大小等) - [ ] 使用允许/禁止列表限制工具访问 - [ ] 已限制最大执行步骤 - [ ] 已配置代理操作超时 - [ ] 已实施输入验证 - [ ] 已启用速率限制常见安全漏洞防范
路径遍历防护
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)
命令注入防护
import shlex
from typing import List
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
总结与展望
mcp-use提供了全面的权限控制能力,通过分层的安全策略和细粒度的访问管理,可以构建安全可控的MCP应用环境。权限控制是一个持续过程,建议定期审查安全配置、更新访问策略,并关注官方安全更新。
官方安全文档:Security Best Practices
安全检查工具:安全自查清单
安全部署指南:Production Deployment Security
【免费下载链接】mcp-use 项目地址: https://gitcode.com/gh_mirrors/mc/mcp-use
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




