MarketingDotLimited/mcp-sentinel

GitHub: MarketingDotLimited/mcp-sentinel

一个安全加固的 MCP 服务器,允许 AI 云服务在多层认证、审计和审批机制保护下远程管控 Linux 服务器。

Stars: 0 | Forks: 0

# MCP Sentinel 🛡️ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/MarketingDotLimited/mcp-sentinel/actions/workflows/ci.yml) [![Node.js](https://img.shields.io/badge/Node.js-18%2B-green)](https://nodejs.org) [![MCP](https://img.shields.io/badge/MCP-HTTP%2FSSE-blue)](https://modelcontextprotocol.io) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md) 一个**经过安全加固的 MCP (Model Context Protocol) 服务器**,允许 AI 云服务(Claude、ChatGPT、Gemini、Cursor 等)通过 Streamable HTTP 安全地控制和管理您的 Linux 服务器。 ## ✨ 功能 - **32 个 MCP 工具** — 检查和管理文件、服务、用户、数据库、仓库、沙盒代码和警报 - **多层安全** — API key + JWT token + IP 白名单 + 速率限制 + 审计日志 + 路径沙盒化 + scope 强制执行 + HTTPS + Helmet + CORS - **基于角色的访问** — `admin` 拥有完全控制权;`user` 被限制在其 home 目录下的沙盒中 - **按用户划分的 API key** — 为不同的用户/服务签发指定 scope 的 key - **审计日志** — 记录每次工具调用的用户、IP、持续时间和结果(每日轮换的 JSON) - **审批控制平面** — 可选地要求人类管理员在执行确切的高风险 AI 操作之前进行审批 - **引导式工作流** — 为任何兼容 MCP 的 AI 提供用于诊断、安全审查、备份和部署的自然语言提示 - **项目注册表** — 注册已批准的仓库,并为开发者和 AI 编程代理生成安全的部署计划 - **systemd 就绪** — 开机自启动 ## 🚀 快速开始 ``` # 1. Clone git clone https://github.com/MarketingDotLimited/mcp-sentinel.git cd mcp-sentinel # 2. 安装依赖 npm install # 3. 设置(生成 secrets、.env、可选 TLS cert) node setup.js # 4. 启动 npm start # 5. 或作为 system service 运行 cp mcp-server.service /etc/systemd/system/ systemctl enable --now mcp-server ``` ## 🔗 连接您的 AI 客户端 Web 仪表板现在包含 **Connect AI** 功能,可提供当前的 endpoint 和平台无关的配置代码片段。为每个 AI 客户端创建指定 scope 的 key,并为能够进行更改的代理启用审批模式。 ### Claude Desktop ``` { "mcpServers": { "server-control": { "type": "sse", "url": "https://YOUR_SERVER_IP:4444/mcp", "headers": { "X-API-Key": "YOUR_ADMIN_KEY" } } } } ``` ### Cursor / VS Code ``` { "mcpServers": { "server-control": { "url": "https://YOUR_SERVER_IP:4444/mcp", "type": "sse", "headers": { "X-API-Key": "YOUR_ADMIN_KEY" } } } } ``` ## 🛠️ 可用工具 | 类别 | 工具 | |---|---| | **System** | `get_system_info`, `get_processes`, `kill_process` | | **Files** | `read_file`, `write_file`, `delete_file`, `list_directory`, `move_file`, `copy_file`, `get_file_info`, `search_files` | | **Services** | `manage_service`, `get_service_status`, `list_services`, `get_journal_logs`, `manage_firewall` | | **Users** | `list_users`, `get_user_info`, `create_user`, `delete_user`, `set_user_password`, `modify_user`, `manage_ssh_keys` | ## 🔐 安全架构 ``` AI Client → HTTPS → IP Whitelist → API Key/JWT → Rate Limit → Scope Check → Sandbox → Tool ``` | 层级 | 详情 | |---|---| | **HTTPS/TLS** | TLS 1.2+ 及强加密套件 | | **权限分离** | 工具以映射的 Unix 用户 UID/GID 运行(对于普通用户绝不以 root 运行) | | **IP 白名单** | 基于 key 或全局的 CIDR 限制(IPv4 和 IPv6) | | **API Key** | 持久化存储,SHA-256 哈希加密 | | **JWT Token** | HS256 签名,绑定 IP,短期的 bearer token | | **速率与会话限制** | 全局限制、认证限制以及并发会话上限 | | **Scope 强制执行** | 基于 key 的工具访问控制 | | **路径沙盒** | 防范 symlink,用户被限制在 `/home/{username}` 和私有临时目录中 | | **审计日志** | 防篡改的结构化 JSON,并进行密钥脱敏 | ## 📁 项目结构 ``` ├── server.js # Main MCP server (Express + Streamable HTTP) ├── security.js # All auth & security middleware ├── audit.js # Structured audit logging ├── keygen.js # API key generator ├── setup.js # First-time setup wizard ├── mcp-server.service # generated by setup.js when needed ├── .env # generated by setup.js; never commit this file └── tools/ ├── system.js # Shell commands, processes, system info ├── files.js # File system CRUD ├── services.js # systemd & firewall management └── users.js # User & SSH key management ``` ## ⚙️ 配置 运行 `node setup.js` 以创建 `.env`,然后根据需要进行配置: ``` PORT=4444 USE_HTTPS=true JWT_SECRET=<64-byte random hex> ADMIN_API_KEY= ALLOWED_IPS=203.0.113.10,192.168.1.0/24 # optional RATE_LIMIT_MAX_REQUESTS=60 AUDIT_LOG_KEEP_DAYS=30 # 可选 Authelia/OIDC bearer-token 支持。两者必须同时设置,并且 # JWKS endpoint 必须提供受 Node.js 信任的证书。 AUTHELIA_ISSUER=https://auth.example.com AUTHELIA_JWKS_URL=https://auth.example.com/jwks.json OAUTH_RESOURCE_URL=https://mcp.example.com # 可选 control-plane 存储和 project allow-list CONTROL_PLANE_STATE_FILE=./data/control-plane.json GIT_ALLOWED_REPOS=/srv/my-app,/srv/another-app PUBLIC_URL=https://mcp.example.com MCP_POLICY_FILE=./policy.json # 企业运维:在配置每个功能之前,这些是强制性的。 # 使用以下命令生成 CONTROL_PLANE_ENCRYPTION_KEY:openssl rand -hex 32 CONTROL_PLANE_ENCRYPTION_KEY=<64-hex-character-secret> MCP_FLEET_ALLOWED_HOSTS=sentinel-1.example.com,sentinel-2.example.com BACKUP_ALLOWED_PATHS=/etc/my-app,/srv/my-app/config BACKUP_ALLOWED_ROOTS=/var/lib/mcp-sentinel/backups S3_ALLOWED_HOSTS=s3.example.com WEBHOOK_ALLOWED_HOSTS=hooks.example.com PROJECT_HEALTH_ALLOWED_HOSTS=app.example.com ``` 对于企业级的 policy-as-code(策略即代码),请将 [policy.example.json](policy.example.json) 复制到仓库之外或受保护的配置路径中,设置 `MCP_POLICY_FILE`,并通过您常规的配置管理流程审查更改。即使 key 本身允许某项操作,策略也可以拒绝该角色的工具,或者要求进行审批。 ## 企业级运维 MCP Sentinel 维护一个小型、加密的控制平面状态文件(模式为 `0600`),用于记录已注册的 fleet 服务器、备份目标、webhook、审批、项目和计划。请勿将其置于版本控制之下。 - **Fleet:** 注册每个 Sentinel 的健康检查 endpoint。Sentinel 仅对 `MCP_FLEET_ALLOWED_HOSTS` 中明确列出的主机执行定时的 `GET` 请求;它不会通过 fleet 清单公开远程 shell 访问权限。 - **备份:** 备份目标可以是本地白名单目录或兼容 S3 的 endpoint。仅接受最大为 25 MiB 的白名单常规文件。每个备份在到达目标之前都会进行 AES-256-GCM 加密;S3 凭证在静态状态下加密,且绝不会通过 API 返回。 - **Webhook:** 事件仅发送至 `WEBHOOK_ALLOWED_HOSTS`,禁用重定向,具有十秒的超时时间,并附带 `X-MCP-Sentinel-Signature-256: sha256=` 标头。请仅在 Sentinel 中保留密钥,并在接收方验证此 HMAC。 - **部署:** 创建一个包含白名单仓库和服务的已注册项目。`deploy_project` 仅执行 `git pull --ff-only`,重启那个确切的已注册 systemd 服务,然后检查其 host 位于 `PROJECT_HEALTH_ALLOWED_HOSTS` 中的健康状态 URL。它需要 `confirm: true`、管理员身份,并且在启用审批模式时需要 key 级别的审批。 对于非技术操作员,仪表板的 Guided Help、Approvals、Projects、Automations、Connect AI、Teams 和 Security 页面是首选的起始点。对于 AI 客户端,请首先调用 `list_guided_workflows`,在部署之前使用 `plan_project_deployment`,并使用 `request_change_approval` 提交确切的高风险请求。 ## 🔑 生成 API Key ``` # 生成 admin key node keygen.js admin admin # 生成 scoped user key node keygen.js alice user run_command,read_file,write_file ``` ## 📊 监控 ``` # 实时审计日志 tail -f logs/audit-$(date +%Y-%m-%d).log | jq # 查看活动会话 curl -k https://localhost:4444/admin/sessions -H "X-API-Key: YOUR_KEY" # 健康检查 curl -k https://localhost:4444/health ``` ## 要求 - Node.js 18+ - Linux(基于 systemd) - `openssl`(用于 HTTPS) - Root 或 sudo 权限(以使用完整的管理工具) ## 测试 ``` npm test # unit and security tests npm run test:ui # Playwright browser flow (uses an isolated local Sentinel) npm run test:live # creates and removes one temporary no-login OS user; run only on a disposable or approved host ``` 实时测试验证了低权限的 MCP 身份可以读取系统健康状况,但不能读取 `/etc/shadow` 或创建用户。两个集成测试套件均使用临时的状态、密钥、日志和端口。 ## 安全 发现漏洞?请阅读 [SECURITY.md](SECURITY.md) 并私下报告 —— 请勿公开提出 issue。 ## 许可证 [MIT](LICENSE) © 2026 [MarketingDotLimited](https://github.com/MarketingDotLimited)
标签:AI集成, GNU通用公共许可证, Linux服务器管理, MCP服务, MITM代理, Node.js, 安全测试工具, 权限控制, 特征检测, 自定义脚本