alejandroqh/sudo39

GitHub: alejandroqh/sudo39

一个基于 MPC 的 sudo 提升桥接服务器,通过 MCP 协议安全委派特权操作。

Stars: 0 | Forks: 0

# sudo39 sudo39 是一个使用 [TurboMCP](https://github.com/Epistates/turbomcp) 构建的小型 MCP 服务器。其主要工具是: ``` sudo_run(command, arguments?, mode?) ``` 无害示例 MCP 工具参数: ``` { "command": "id", "mode": "auto" } ``` 优先使用结构化参数(如果可能): ``` { "command": "systemctl", "arguments": ["restart", "nginx"], "mode": "sudo" } ``` ## 提升模型 `sudo39` 故意不接受密码参数。通过 MCP 客户端发送的密码可能最终出现在模型上下文、日志、跟踪、shell 历史记录和转录中。请在主机上配置提升权限: - Linux:在 `auto` 模式下使用 `sudo`,如果 `sudo` 无法运行则使用 `pkexec`。设置 `SUDO39_ASKPASS` 以让 `sudo -A` 通过 askpass 助手请求凭据。 - macOS:`auto` 使用 `osascript` 并调用原生管理员提示。 - Windows:`auto` 使用 PowerShell `Start-Process -Verb RunAs` 触发 UAC。 默认情况下,所有程序都被拒绝。在启动前配置以下选项之一: ``` # 更安全:仅允许命名程序。 export SUDO39_ALLOWED_PROGRAMS=id,whoami,systemctl # 不安全:允许任意提升的程序。 export SUDO39_ALLOW_UNSAFE=1 ``` 启动环境会初始化运行时策略。你也可以通过 MCP 管理工具更改活动策略: - `sudo39_policy()` - `sudo39_add_allowed_program(program, confirmation)` - `sudo39_remove_allowed_program(program, confirmation)` - `sudo39_set_allow_unsafe(enabled, confirmation)` - `sudo39_reload_policy_from_env(confirmation)` 每个修改型管理工具都需要一个确切的确认短语。使用以下 MCP 提示生成显示给用户的短语: - `confirm_add_allowed_program(program)` - `confirm_remove_allowed_program(program)` - `confirm_set_allow_unsafe(enabled)` - `confirm_reload_policy_from_env()` 示例流程: ``` prompt: confirm_add_allowed_program("id") tool: sudo39_add_allowed_program(program: "id", confirmation: "ADD PROGRAM id") ``` 不安全模式也受到限制: ``` prompt: confirm_set_allow_unsafe("true") tool: sudo39_set_allow_unsafe(enabled: true, confirmation: "ENABLE UNSAFE") ``` 这些更改仅存在于内存中。重启服务器会恢复到 `SUDO39_ALLOWED_PROGRAMS` 和 `SUDO39_ALLOW_UNSAFE` 的策略。 `sudo39_reload_policy_from_env` 会用服务器进程环境替换内存中的策略。这仅在 supervisor 或启动器更改了进程环境时有用;在别处编辑 shell 变量不会修改已运行进程的环境。 在执行依赖调用时,请在调用 `sudo_run` 或 `sudo39_policy` 前等待管理工具响应。JSON-RPC 请求可能并发处理,因此同时发送多个请求无法保证策略更新顺序。 运行时限制默认为 30 秒和每个输出流 4 KiB(约 1000 个 LLM token): ``` export SUDO39_TIMEOUT_SECS=30 export SUDO39_OUTPUT_LIMIT_BYTES=4096 ``` 对于 `sudo` 密码提示,请设置 `SUDO39_ASKPASS` 为与 MCP 服务器相同信任边界的 askpass 助手: ``` export SUDO39_ASKPASS=/absolute/path/to/askpass ``` 模式: - `auto` - `sudo` - `pkexec` - `macos_osascript` - `windows_uac` ## 安装 ``` cargo install sudo39 ``` ### 为任意 AI CLI / IDE 安装 安装二进制文件并自动配置所有检测到的 MCP 客户端:**Claude Code**、**Claude Desktop**、**Codex**、**OpenCode**、**OpenClaw**。 ``` curl -fsSL https://raw.githubusercontent.com/alejandroqh/marketplace/main/h39.sh | sh ``` ## 构建 ``` cargo build --release ``` ## MCP 客户端配置 对于 stdio MCP 客户端: ``` { "mcpServers": { "sudo39": { "command": "/absolute/path/to/sudo39", "args": [] } } } ``` ## 注意事项 任何被授予访问权限的 MCP 客户端都可以请求活动策略允许的提升操作。如果客户端可以调用管理工具,它还可以在确认步骤后扩展活动策略。请将客户端、服务器进程环境和 askpass 助手视为管理信任边界。 由于 stdin/stdout 已被用作协议传输,`sudo` 无法在 MCP stdio 上安全地提示输入密码。如果未配置 askpass 助手,`sudo39` 会运行 `sudo -n`,这会直接失败而不是提示输入。这是故意设计的。 命令在不使用 shell 的情况下执行(Linux 和 Windows)。在 macOS 上,管理员提示路径使用 AppleScript 的 `do shell script`;`sudo39` 在传递给 AppleScript 前会对程序和参数向量进行 shell 转义。请使用 `arguments` 数组传递参数;`command` 必须是单个程序路径。 返回的 `launcher_exit_status`、`stdout` 和 `stderr` 来自提升启动器,并受 `SUDO39_OUTPUT_LIMIT_BYTES` 限制:在 Linux 上通常是通过 `sudo` 或 `pkexec` 执行的提升命令;在 macOS 上是 `osascript`;在 Windows 上是 PowerShell `Start-Process` 启动器,而不是对提升子进程输出的可靠捕获。 每次执行或策略更改都会向 stderr 写入一条包含时间戳和相关策略或命令字段的最小审计事件。不会记录 stdout 或 stderr。
标签:AI合规, GitHub Advanced Security, MCP 服务器, SEO: Elevation bridge, SEO: sudo39, sudo, SUDO39_ASKPASS, TurboMCP, 主机配置, 协议分析, 受控执行, 可控运行, 可视化界面, 安全加固, 安全策略, 提示词设计, 服务器监控, 权限提升, 特权 escalation, 确认机制, 管理员工具, 通知系统