cskwork/ssh-llm-connect

GitHub: cskwork/ssh-llm-connect

为LLM编程代理提供安全的SSH连接方案,通过只读命令防护和强制挂钩防止误操作导致的服务器损害。

Stars: 0 | Forks: 0

# ssh-llm-连接 面向 LLM 编程代理的安全 SSH 方案。多主机助手 + 只读命令防护 + 强制执行的挂钩,防止代理绕过它。 ## 为什么 LLM 编程代理(如 Claude Code、Cursor 等)可以执行任意的 Shell 命令。通过纯文本 `ssh user@host "rm -rf ..."` 连接远程服务器,一次失误就可能导致灾难。本仓库为您提供: 1. 一个轻量的连接助手 (`connect.sh`),它会加载每个主机的 `.env` 文件,确保代理永远无法直接看到内联的凭据。 2. 助手内部内置了一个只读命令防护,用于拒绝危险命令(`rm`, `mv`, `sudo`, `>`, `>>`, `systemctl restart`, `curl -X POST`, 软件包安装,以及带有 `-c` 的解释器等)。 3. 一个 Claude Code **PreToolUse 挂钩** (`ssh-guard.sh`),由工具管理器在每次 Bash 调用*之前*运行。它会阻止代理直接调用 `ssh` / `scp` / `sftp`,或者向助手传递绕过标志——这是代理无法重写以绕过的强制措施。 ## 它**不是**什么 - **不是沙箱。** 它无法阻止拥有客户端 root 权限的恶意行为者。它无法阻止服务器端被攻破。 - **不能替代服务器端加固。** 为了实现真正的隔离,请结合使用 `~/.ssh/authorized_keys` 中的 `ForceCommand`、`rbash` 或专用的只读 SSH 用户。 它是“防止 AI 代理犯下无意错误的安全护栏”。仅此一点就价值巨大。 ## 安装 ``` git clone https://github.com/cskwork/ssh-llm-connect.git cd ssh-llm-connect ./install.sh /path/to/your/project ``` 安装脚本会: - 将 `bin/connect.sh` 复制到 `/ssh/connect.sh` - 将 `hosts/_template.env` 复制到 `/ssh/hosts/_template.env` - 将 `hooks/ssh-guard.sh` 复制到 `/.claude/hooks/ssh-guard.sh` - 将 `/ssh/hosts/*.env` 追加到 `/.gitignore` 中,确保凭据永远不会被提交 - 打印一段用于 `/.claude/settings.json` 的代码片段(您需要手动粘贴——安装程序不会编辑您的代理配置) ## 添加主机 ``` cp ssh/hosts/_template.env ssh/hosts/prod-app.env $EDITOR ssh/hosts/prod-app.env ``` 最小必填字段: ``` SSH_HOST=10.0.0.10 SSH_PORT=22 SSH_USER=deploy SSH_KEY_PATH=~/.ssh/id_ed25519 # OR SSH_PASSWORD=... (sshpass required) ``` 可选项:`SSH_PROXY_JUMP`, `SSH_LOCAL_FORWARD`, `SSH_REMOTE_FORWARD`, `SSH_EXTRA_OPTS`。 ## 使用 ``` # 默认 — 强制只读 ./ssh/connect.sh prod-app "tail -100 /var/log/app.log" ./ssh/connect.sh prod-app "ps aux | grep java" # 被拒绝 ./ssh/connect.sh prod-app "rm /tmp/x" ./ssh/connect.sh prod-app "echo hi > /tmp/x" ./ssh/connect.sh prod-app "systemctl restart app" # 绕过 (仅限人工 — 代理被钩子阻止) ./ssh/connect.sh --shell prod-app ./ssh/connect.sh --allow-write prod-app "systemctl restart app" ``` ## 挂钩工作原理 `ssh-guard.sh` 是一个针对 `Bash` 匹配器的 Claude Code [PreToolUse 挂钩](https://docs.claude.com/en/docs/claude-code/hooks)。Claude Code 的工具管理器会在每次 Bash 工具调用前运行它。如果挂钩以退出码 `2` 退出,Bash 调用将在运行前被拒绝,并且标准错误输出将显示给代理。 挂钩会拒绝: - 任何直接的 `ssh`, `scp`, `sftp`, 或 `sshpass` 调用(`ssh-keyscan` / `ssh-keygen` / `ssh-add` / `ssh-copy-id` 等本地工具除外)。 - 任何 `connect.sh --shell` 或 `connect.sh --allow-write` 的调用。 所有其他调用会传递到助手脚本自身的 `check_readonly` 函数进行处理。 ## 防御层级 | 层级 | 强制执行者 | 阻止目标 | |---|---|---| | 1 — PreToolUse 挂钩 | Claude Code 工具管理器(代理无法绕过) | 直接的 ssh/scp/sftp 调用,绕过标志 | | 2 — `settings.json` 中的 `permissions.deny` | Claude Code 工具管理器 | 绕过标志(与挂钩形成双重保险) | | 3 — `connect.sh` 只读防护 | 助手脚本 | rm/sudo/重定向/systemctl 写操作/curl POST/软件包安装器/解释器 `-c` | | 4 — 服务器端(由您提供) | `sshd_config` / authorized_keys | 其他所有操作 | ## 只读命令规则(第 3 层) **拒绝的命令:** `sudo su rm mv cp dd mkfs fdisk parted chmod chown chgrp truncate ln mkdir rmdir touch kill killall pkill reboot shutdown halt poweroff init passwd useradd userdel usermod groupadd groupdel groupmod mount umount iptables firewall-cmd service crontab tee wall write nc ncat socat wget scp rsync eval exec source`, `> redirect`, `>> append`, `sed -i`, `systemctl start|stop|restart|reload|enable|disable|mask|unmask|edit|set-property|kill|daemon-reload`, `git push|commit|reset|clean|checkout|switch|rebase|merge|cherry-pick|stash|am|apply`, `apt|apt-get|dnf|yum|rpm|pip|pip3|npm|yarn|pnpm|brew|snap|gem|cargo install|upgrade|update|remove|uninstall|build|publish`, `curl -X POST|PUT|PATCH|DELETE | -o | -O | --data`, `bash|sh|zsh|python|perl|ruby|node -c "..."`. **允许的命令**(通过未被拒绝推断):`cat ls grep awk sed (无 -i) head tail wc sort uniq cut tr find which env echo printenv date uptime free df du ps top netstat ss ip ifconfig hostname uname id whoami journalctl(只读) systemctl status git log|status|diff|show docker ps|logs kubectl get|describe|logs` 等。 ## 局限性与威胁模型 - **基于模式匹配。** 一个能控制客户端的固意攻击者可以对载荷进行编码,使用 base64/eval 技巧,或调用不同的二进制文件。挂钩缩小了攻击面;但并未消除它。 - **仅限客户端。** 运行一个支持 `ssh-guard` 的工具管理器来执行第 1–2 层防护;其他防护都在第 3 层(本地脚本)。要实现服务器端强制,请使用受限 Shell 或 `ForceCommand`。 - **仅限 Bash 通道。** 如果代理的工具管理器允许非 Bash 的网络原语(如 Python `paramiko` 等),此挂钩无法监控。请在您的代理设置中单独拒绝这些。 - **挂钩必须手动注册。** 安装程序不会写入 `settings.json`——该文件控制代理权限,安装程序拒绝静默修改它。您需要自行粘贴代码片段。 ## 许可证 MIT — 详见 [LICENSE](LICENSE)。
标签:AI安全, Chat Copilot, Claude Code集成, Cutter, LLM代理防护, LLM编程助手, SSH安全, SSH工具, 代理安全, 内存分配, 只读命令, 命令过滤, 多主机管理, 安全钩子, 应用安全, 数字取证, 环境变量管理, 编程工具安全, 网络安全, 自动化脚本, 远程连接防护, 钩子强制, 防绕过机制, 隐私保护