MCP Linux基础设施-生产就绪基础设施管理
具有MCP和基于SSH密钥的身份验证的PRA(恢复计划)参考体系结构
版本:0.3.0-智能分析+自动学习+插件系统🧠🔌
安全架构
┌─────────────────────────────────────────────────────────────┐
│ CLAUDE (IA) │
└────────────┬────────────────────────────────┬───────────────┘
│ │
│ MCP tool-call │ propose action
│ (observation) │
▼ ▼
┌───────────────┐ ┌─────────────────┐
│ MCP Server │ │ VALIDATION │
│ (SSH client) │ │ HUMAINE │
└───────┬───────┘ └────────┬────────┘
│ │
│ ssh -i mcp-reader.key │ ssh -i pra-exec.key
│ mcp-reader@target │ pra-runner@target
▼ ▼
┌─────────────────────────────────────────────────────┐
│ LINUX TARGET (infra réelle) │
│ │
│ mcp-reader → read-only (diagnostics) │
│ pra-runner → exec contrôlé (actions PRA) │
└─────────────────────────────────────────────────────┘安全原则
✅ 特权的严格分离
2计算SSH区别:
mcp-reader: 只读 (诊断、监测)pra-runner: 执行 (经人类验证的PRA行动)
2个不同的SSH密钥:
mcp-reader.key:身份验证诊断pra-exec.key:身份验证操作
2个置信水平:
- MCP观察→无可能的行动
- PRA执行→人工验证后
✅ 强制命令SSH
# authorized_keys avec command= force
command="/usr/local/bin/mcp-wrapper",no-pty,no-agent-forwarding ssh-ed25519 ...结果:
- 无法打开shell
- 只有一个命令是可能的:包装器
- 包装器中的严格白名单
✅ 审计跟踪完成
- 所有记录的SSH调用(
/var/log/auth.log) - 追踪PRA行动(
/var/log/pra-exec.log) - MCP服务器中的结构化日志记录
- 敏感参数的消毒
项目结构
mcp-linux-infra/
├── src/mcp_linux_infra/ # MCP Server (Python)
│ ├── server.py # Point d'entrée FastMCP (34 tools)
│ ├── config.py # Configuration centralisée
│ ├── audit.py # Logging structuré
│ ├── authorization/ # 🆕 Système d'autorisation
│ │ ├── engine.py # Moteur d'autorisation
│ │ ├── models.py # Modèles d'autorisation
│ │ └── whitelist.py # Whitelist de commandes
│ ├── analysis/ # 🆕 Smart Analysis & Learning
│ │ ├── command_analysis.py # Analyse de sécurité
│ │ └── auto_learning.py # Auto-apprentissage
│ ├── connection/
│ │ ├── ssh.py # SSH connection pooling
│ │ └── ansible.py # Wrapper Ansible CLI
│ ├── tools/
│ │ ├── diagnostics/ # Read-only tools (SSH mcp-reader)
│ │ │ ├── system.py
│ │ │ ├── network.py
│ │ │ ├── services.py
│ │ │ └── logs.py
│ │ ├── pra/ # Exec tools (SSH pra-runner)
│ │ │ ├── validation.py # Validation humaine
│ │ │ ├── actions.py # Actions PRA
│ │ │ └── idempotence.py # Vérification idempotence
│ │ └── execution/ # 🆕 SSH Command Execution
│ │ ├── ssh_executor.py # Exécuteur SSH autorisé
│ │ └── ansible_wrapper.py # Wrapper Ansible remote
│ └── utils/
│ ├── decorators.py # Sécurité, logging
│ └── validation.py
│
├── system/ # Scripts déployés sur targets
│ ├── wrappers/
│ │ ├── mcp-wrapper # Whitelist read-only
│ │ └── pra-exec # Whitelist actions PRA
│ ├── pra-run # Script exécuteur PRA
│ └── sudoers.d/
│ └── pra-runner # Configuration sudo
│
├── ansible/ # Déploiement automatisé
│ ├── playbooks/
│ │ ├── deploy-mcp-infra.yml # Setup complet
│ │ └── rotate-keys.yml # Rotation clés
│ └── roles/mcp_infra/
│ ├── tasks/
│ │ ├── main.yml
│ │ ├── users.yml # Création comptes
│ │ ├── ssh.yml # Config SSH
│ │ └── wrappers.yml # Installation wrappers
│ ├── templates/
│ │ ├── authorized_keys.j2
│ │ ├── mcp-wrapper.j2
│ │ └── pra-exec.j2
│ └── files/
│ └── pra-run
│
├── docs/
│ ├── ARCHITECTURE.md # Architecture détaillée
│ ├── SECURITY.md # Modèle de sécurité
│ ├── PRA-PROCEDURES.md # Procédures PRA
│ └── KEY-ROTATION.md # Rotation des clés
│
├── keys/ # Clés SSH (gitignored)
│ ├── mcp-reader.key # Clé diagnostics
│ ├── mcp-reader.key.pub
│ ├── pra-exec.key # Clé actions
│ └── pra-exec.key.pub
│
├── tests/
│ ├── test_security.py # Tests sécurité
│ ├── test_wrappers.py # Tests whitelist
│ └── test_idempotence.py # Tests idempotence
│
├── pyproject.toml # Configuration projet
├── uv.lock # Lockfile dependencies
└── .env.example # Configuration exemple安装速度快
1.生成SSH密钥
# Clé read-only (diagnostics)
ssh-keygen -t ed25519 -f keys/mcp-reader.key -C "mcp-reader@infra"
# Clé exec (PRA)
ssh-keygen -t ed25519 -f keys/pra-exec.key -C "pra-runner@infra"2.目标部署
# Avec Ansible (recommandé)
cd ansible
ansible-playbook -i inventory/production.ini playbooks/deploy-mcp-infra.yml
# Ou script manuel
./scripts/deploy-manual.sh target.example.com3.配置MCP服务器
# Installation dependencies
uv sync
# Configuration
cp .env.example .env
# Éditer .env avec vos paramètres
# Lancement
uv run mcp-linux-infra4.在Claude桌面中注册
{
"mcpServers": {
"linux-infra": {
"command": "uv",
"args": [
"--directory",
"D:\\infra\\mcp-servers\\mcp-linux-infra",
"run",
"mcp-linux-infra"
],
"env": {
"LINUX_MCP_SSH_KEY_PATH": "D:\\infra\\mcp-servers\\mcp-linux-infra\\keys\\mcp-reader.key",
"LINUX_MCP_PRA_KEY_PATH": "D:\\infra\\mcp-servers\\mcp-linux-infra\\keys\\pra-exec.key",
"LINUX_MCP_LOG_LEVEL": "INFO"
}
}
}
}用法
诊断(自动,无需验证)
# Via MCP tools (read-only, SSH mcp-reader)
mcp.call_tool("diagnose_system", {
"host": "web01.infra",
"checks": ["services", "network", "disk"]
})
mcp.call_tool("get_service_status", {
"host": "web01.infra",
"service": "unbound"
})
mcp.call_tool("fetch_logs", {
"host": "web01.infra",
"service": "caddy",
"lines": 100
})PRA行动(要求验证腐殖质)
# 1. IA détecte un problème
status = mcp.call_tool("diagnose_system", {"host": "web01.infra"})
# Résultat: unbound service inactive
# 2. IA propose une action
proposed_action = {
"action": "restart_unbound",
"host": "web01.infra",
"rationale": "Service unbound inactive, impact sur résolution DNS"
}
# 3. Validation humaine (via interface)
# User: APPROVE
# 4. Exécution via PRA (SSH pra-runner)
result = mcp.call_tool("execute_pra_action", {
"host": "web01.infra",
"action": "restart_unbound",
"approval_token": "user_approved_xyz"
})
# 5. Vérification post-action
verification = mcp.call_tool("verify_service", {
"host": "web01.infra",
"service": "unbound"
})安全
你赢了什么
✅ 严格分离 :诊断≠操作 ✅ 可追溯性 :审计跟踪完成 ✅ 快速撤销 :简单的键旋转 ✅ 零信任 :强制人工验证 ✅ 凭证回放 :非对称SSH密钥 ✅ 监狱SSH :强制命令+白名单 ✅ 兼容堡垒 :架构跳转主机就绪
可用的PRA操作
默认情况下,最小白名单(可扩展):
restart_unbound:重新启动DNSreload_caddy:充值反向代理flush_dns_cache:清除缓存DNSrestart_container:重新启动Podman容器rotate_logs:旋转应用程序日志
添加操作:
- 添加到
system/pra-run(脚本) - 添加到
system/wrappers/pra-exec(白名单) - 测试器幂等性
- 使用Ansible部署
🆕 新功能(v0.2.0)
🧠 智能命令分析与自动学习
管理订单白名单的智能系统:
1.安全分析(analyze_command)
analyze_command(command="htop", host="coreos-11")提供:
- 风险评估(关键/高/中/低)
- 自动分类
- 行动建议(ADD_AUTO、ADD_MANUAL、BLOCK)
- 与类似白名单订单的比较
2.自动学习(get_learning_suggestions)
get_learning_suggestions(min_count=5, min_age_hours=24)系统自动学习:
- 记录所有被阻止的命令
- 识别重复模式
- 建议添加白名单(仅限低风险订单)
- 按使用频率排序
3.统计(get_learning_stats)
get_learning_stats()仪表板组件:
- 被阻止的订单总数
- 按风险级别划分的崩溃
- 十大最被阻止的订单
- 使用指标
4.交互式工作流
当订单被阻止时,自动建议:
❌ COMMAND BLOCKED
Command: htop
Risk Level: LOW
Category: monitoring
💡 SUGGESTIONS:
✅ This command appears SAFE (read-only)
→ analyze_command("htop")
→ propose_pra_action(action="htop", host="...")完整文档 : 命令-分析.md
______________________________________________________________________
🔌 插件系统(v0.3.0)
按家庭组织的订单
136+订单 分布在 8个插件 :
| 插件 | 命令 | 描述 |
|---|---|---|
| 📊 监控 | 10 | htop、iotop、nethogs、眼神。.. |
| 🌐 网络 | 14 | ping、curl、netstat、dig。.. |
| 📁 文件系统 | 17 | ls,grep,猫,找到。.. |
| ⚙️ 系统化 | 15 | systemctl,journalctl。.. |
| 🐳 容器 | 19 | podman,docker(ps/logs/restart)。.. |
| 🔧 POSIX系统 | 24 | uname、主机名、日期、密码。.. |
| ⚡ POSIX进程 | 16 | ps,杀,不错,lsof。.. |
| 📝 POSIX文本 | 21 | sed、awk、cut、sort、tr |
新的MCP工具
# Lister tous les plugins
list_command_plugins()
# Détails d'un plugin avec exemples
get_plugin_details("monitoring")
# Chercher des commandes
search_commands("docker")
search_commands("process")完整文档 : 塞子.md
______________________________________________________________________
路线图
- \[x\] 建筑核心
- \[x\] SSH连接池
- \[x\] 工具诊断只读
- \[x\]具有验证的PRA系统
- \[x\]安全SSH包装器
- \[x\]Ansible部署
- \[x\]🆕 智能命令分析(v0.2.0)
- \[x\]🆕 自动学习系统(v0.2.0)
- \[x\] �� 命令授权引擎(v0.2.0)
- \[x\]🔌 插件系统(v0.3.0)
- \[x\]🔌 8个内置插件-136+个命令(v0.3.0)
- \[x\]🔌 插件自动发现(v0.3.0)
- \[x\]🔧 POSIX插件(系统、进程、文本)(v0.3.0)
- \[\]插件Git命令
- \[\]插件安全/审计
- \[\]Kubernetes插件
- \[\]堡垒/跳跃主机支持
- \[\]全自动测试
- \[\]监测MCP指标
- \[\]与Vault集成(秘密)
- \[\]仪表板验证PRA
- \[\]多租户支持
许可证
麻省理工学院
支持
- 文档:
docs/ - 问题:GitHub问题
- 安全:VoIP
SECURITY.md
