-
Notifications
You must be signed in to change notification settings - Fork 0
Changelog
licco edited this page Aug 2, 2026
·
1 revision
本文件记录 SSH LICCO 项目的所有重要变更,遵循 语义化版本规范。
🚀 发布说明:这是精简主分支首发 PyPI 版本,移除非核心加固三件套,主分支聚焦"基础 SSH 代理 + 灾难性命令硬拦截"。需要完整 4 项加固(runtime/secret/remote guard)的用户请使用 security-hardening 分支源码。详见本条目末尾"迁移说明"。
为简化主分支,将多角色 / 多用户 / 生产加固场景的功能迁移至 security-hardening 分支独立维护。主分支不再包含以下能力:
-
加固点 1 · 运行账号最小权限:删除
ssh_mcp/runtime_guard.py,移除SSH_RUNTIME_GUARD/SSH_RUNTIME_ALLOW_ROOT/SSH_RUNTIME_ALLOWED_USERS/SSH_RUNTIME_BLOCK_SUDO环境变量。 -
加固点 2 · 密钥不落地磁盘:删除
ssh_mcp/secret_provider.py,移除SSH_SECRET_PROVIDER_ENABLED/SSH_SECRET_PROVIDER/SSH_SECRET_COMMAND_*/SSH_SECRET_HTTP_*环境变量;KeyManager.save_key()不再拒绝落盘;ConnectionConfig.private_key_material字段保留(仍可传内存 PEM)。 -
加固点 3 · 双层命令拦截:删除
ssh_mcp/handlers/utils.py中的normalize_command_for_remote_guard(),移除ssh_execute的remote_guard参数与SSH_REMOTE_GUARD环境变量,删除config/remote-guard/目录。
保留的能力:加固点 4 · 灾难性命令硬拦截(check_hard_block)仍在,零配置零绕过;安全级别、命令白名单、限流、审计日志等常规安全机制不受影响。
-
ssh_mcp/runtime_guard.py、ssh_mcp/secret_provider.py、test_hardening.py -
config/mcp.production-hardened.example.json、config/remote-guard/(sshd_config.example、ssh_licco_force_command.sh) docs/SECURITY_HARDENING.md
-
ssh_mcp/handlers/connect.py:移除 SecretManager 拉取私钥逻辑与 import。 -
ssh_mcp/handlers/execute.py:移除 remote_guard 拦截块与 import。 -
ssh_mcp/handlers/utils.py:移除normalize_command_for_remote_guard()与shleximport。 -
ssh_mcp/handlers/schemas.py:移除ssh_execute的remote_guard参数定义。 -
ssh_mcp/key_manager.py:save_key()移除密钥不落地检查;load_key_from_str()docstring 去除加固描述。 -
ssh_mcp/connection_config.py:private_key_material字段描述改为通用文案。
-
README.md:删除"生产加固四项"章节、加固点 env 变量表(保留硬拦截一行)、SECURITY_HARDENING.md链接、remote_guard参数描述。 -
docs/API_REFERENCE.md:删除密钥不落地相关注释与加固点 2 说明。 -
docs/skills/ssh-mcp-troubleshoot/SKILL.md:删除"Method 3: SSH_REMOTE_GUARD"排查段。
- 需要生产加固能力的用户,请切换到
security-hardening分支。 - 主分支用户不受影响:上述功能默认即为关闭状态,本次只是移除了代码与文档。
-
软著申请资料/保留原样(已提交申请材料,不随主分支变动)。
-
生产配置限流 bug 修复:
config/mcp.production-hardened.example.json中SSH_RATE_LIMIT=30被代码误读为布尔值"30".lower() == "true"→False,导致限流在生产配置下实际为关闭状态。修正为SSH_RATE_LIMIT=true(总开关)+ 新增SSH_RATE_LIMIT_MAX=30(次数上限),两者分开配置。 -
删除 phantom env 变量:
-
SSH_STRICT_HOST_KEY_CHECKING在两个示例配置文件中均无对应代码读取(ConnectionConfig.strict_host_key_checking字段由ssh_connect参数或hosts.json设置),从mcp.config.example.json与config/mcp.production-hardened.example.json移除。 -
SSH_EXTRA_ALLOWED_PATTERNS同样无代码读取(os.getenv0 命中),从docs/skills/ssh-mcp-setup/SKILL.md、.trae/skills/ssh-mcp-setup/SKILL.md、docs/skills/ssh-mcp-dev/SKILL.md、.trae/skills/ssh-mcp-dev/SKILL.md、docs/skills/ssh-mcp-troubleshoot/SKILL.md、.trae/skills/ssh-mcp-troubleshoot/SKILL.md移除。
-
-
config/mcp.production-hardened.example.json:加_notes块说明rate_limit_naming与host_key_checking配置去向。 -
docs/SECURITY_HARDENING.md:环境变量速查从 11 项扩为 21+ 项完整表(按"安全与限流 / 加固点 1 / 加固点 2 / 加固点 3 / 加固点 4 / 默认连接参数"分组),并加"phantom 变量提示";Checklist 删除已彻底废弃的SSH_APPROVAL_GATE提示。 -
README.md:新增"完整环境变量速查(v2.3.0)"总表。 - 全部 4 个 SKILL.md(dev/setup/troubleshoot × docs/.trae 双份)补齐
SSH_RATE_LIMITbool 类型说明,统一移除SSH_EXTRA_ALLOWED_PATTERNS。
- 已部署用户:使用
config/mcp.production-hardened.example.json之前版本的,请同步更新 env 配置(SSH_RATE_LIMIT=true+SSH_RATE_LIMIT_MAX=30),否则限流实际未生效。 - 调试图:若之前依赖
SSH_STRICT_HOST_KEY_CHECKINGenv 变量来开关主机密钥检查(实际不生效),请改用ssh_connect工具的known_hosts_path/accept_new_host_key参数,或hosts.json的strict_host_key_checking字段。
-
删除
SSH_APPROVAL_GATE审批方案全部代码(v2.1.0 引入,v2.2.0 标记为废弃):- 删除
ssh_mcp/approval.py(ApprovalGate单例与ApprovalRecord数据类) - 删除
ssh_mcp/handlers/approval.py(handle_request_approval/handle_approve_command/handle_list_approvals三个 MCP 工具 handler) -
ssh_mcp/handlers/__init__.py的HANDLERS注册表移除 3 个工具(共 12 → 9) -
ssh_mcp/handlers/utils.py移除check_approval_gate()函数 -
ssh_mcp/handlers/execute.py移除check_approval_gate()调用与approval_id参数传递 -
ssh_mcp/handlers/schemas.py移除approval_id输入参数 + 3 个ssh_request_approval/ssh_approve_command/ssh_list_approvalsTool 定义
- 删除
-
删除 3 个环境变量(不再被代码读取,可从部署配置中移除):
SSH_APPROVAL_GATESSH_APPROVAL_STORESSH_APPROVAL_TTL
- 删除原因:审批流程依赖 AI 自报命令 + 运维人员背书,存在闭环风险(AI 可绕过审批构造看似无害的命令;运维侧背书流于形式)。v2.2.0 的"灾难性命令硬拦截"在 MCP 网关层直接拒绝灾难性模式,更安全更直接。
-
MCP_CONFIG_GUIDE.md:删除"## 🎯 使用场景配置"5 个角色化场景(Web / Python / DB / 系统管理员 / 生产),在没对接 MCP 网关前不做角色严格声明。 -
docs/SECURITY_HARDENING.md:env 变量表移除 3 个废弃项;"v2.1.0 审批方案"小节改写为"已被删除"。 -
README.md:2 处"保留作为参考"改为"已在 v2.2.0 删除"。 -
config/mcp.production-hardened.example.json:移除_deprecated块,version 1.1.0 → 1.2.0。 -
.trae/documents/split-server-py-plan.md:移除 approval.py 文件树项、迁移步骤、Tool count 12 → 9。
v2.2.x → v2.3.0:
- 删除部署配置中的
SSH_APPROVAL_GATE/SSH_APPROVAL_STORE/SSH_APPROVAL_TTL环境变量 - 如有自定义脚本调用了
ssh_request_approval/ssh_approve_command/ssh_list_approvals三个工具,请改用 v2.2.0 起的硬拦截机制——灾难性命令直接被 MCP 网关拒绝,无需审批流 -
approval_id入参已从ssh_execute的 inputSchema 移除,调用代码请删除该字段
-
硬拦截灾难性命令:新增
CommandValidator.HARD_BLOCKED_PATTERNS和CommandValidator.check_hard_block(),对以下命令模式无条件拦截(任何安全级别、confirm_dangerous、confirmation_layer均无法绕过):-
rm -rf作用于绝对路径(包括/、/*、/path、/path/*,-fr变体同效) -
mkfs.*任意文件系统格式化 -
dd if=/dev/(zero|random|urandom) of=/dev/(sd|nvme)覆写裸盘 - bash fork-bomb(
:(){ :|:& };:及空白变体) -
chmod -R 777 //chmod -R 000 /根目录递归改权限 -
> /dev/(sd|nvme)/>> /dev/(sd|nvme)裸设备重定向
-
-
SecurityError新增hard_block: bool属性,handler 据此区分错误提示(不再误导用户尝试confirm_dangerous=true绕过)。 - 命中硬拦截时输出
WARNING审计日志(含 category 与命令),便于 SOC 监控。 - 旧行为(依赖
confirm_dangerous=true执行rm -rf /abs/path)已不可行。如需清理绝对路径,请直接 SSH 登录服务器,或用mv <path> /tmp/.trash_<ts>/走 MCP。
- 代码风格统一:使用
ruff format与ruff check --fix全量格式化,确保 lint 全部通过。 - 版本号对齐:
pyproject.toml/ssh_mcp/__init__.py/package.json/package-lock.json统一升级到 2.1.1。
-
生产加固四项(SSH 跳板模式落地边界):补齐跳板机单点风险,所有加固点默认关闭,向后兼容,生产显式开启。
-
加固点 1 · 运行账号最小权限:
ssh_mcp/runtime_guard.py,进程入口校验非 root / 非 sudo / 账号白名单。开关SSH_RUNTIME_GUARD=true。 -
加固点 2 · 密钥不落地磁盘:
ssh_mcp/secret_provider.py(env/command/http 三 provider)+KeyManager.load_key_from_str()内存加载 +save_key()拒绝落盘。私钥用bytearray持有,release()清零,atexit统一清理。开关SSH_SECRET_PROVIDER_ENABLED=true。 -
加固点 3 · 双层命令拦截:第一层
server._normalize_command_for_remote_guard()禁止| ; & $() \> <元字符;第二层远端 ForceCommand 脚本config/remote-guard/ssh_licco_force_command.sh+ 白名单 + sshd_config 片段。开关SSH_REMOTE_GUARD=true`。 -
加固点 4 · 高危操作审批:
ssh_mcp/approval.py(ApprovalGate,JSON 持久化,一次性消费,命令严格匹配,TTL 失效)。开关SSH_APPROVAL_GATE=true。
-
加固点 1 · 运行账号最小权限:
-
新增 3 个 MCP 工具(高危审批工作流):
-
ssh_request_approval— AI 提交高危命令审批申请,返回 approval_id -
ssh_approve_command— 运维人员人工审批(approved/rejected) -
ssh_list_approvals— 列出待审批队列或全部历史
-
-
ssh_execute新增参数:-
approval_id— 高危命令审批 ID(加固点 4) -
remote_guard— 标记远端已启用 ForceCommand 二次校验(加固点 3)
-
-
ConnectionConfig新增字段:private_key_material(内存私钥 PEM,密钥不落地模式) -
远端加固配置:
config/remote-guard/提供 ForceCommand 脚本、白名单模板、sshd_config 示例
- 运行身份守护:拒绝 root / sudo 上下文启动 ssh-licco 进程,强制专用普通账号
- 私钥内存化:连接建立后立即清零内存中的私钥字节,跳板机磁盘无私钥文件
- 命令逃逸防护:远端 ForceCommand + 跳板机侧元字符规范化,关闭 shell 元字符绕过白名单的路径
- 高危命令人工闸门:CRITICAL/HIGH 风险命令(rm -rf / reboot / iptables 等)必须经人工审批,AI 不能直接下发
-
ssh_mcp/runtime_guard.py— 运行账号最小权限守护 -
ssh_mcp/secret_provider.py— 密钥不落地凭证管理(SecretManager + 3 种 provider) -
ssh_mcp/approval.py— 高危操作审批门禁(ApprovalGate) -
config/remote-guard/ssh_licco_force_command.sh— 远端 ForceCommand 二次校验脚本 -
config/remote-guard/allowed_commands.txt— 远端命令白名单模板 -
config/remote-guard/sshd_config.example— sshd Match User 配置示例 -
docs/SECURITY_HARDENING.md— 完整加固方案文档 -
test_hardening.py— 四项加固端到端验收测试(4/4 通过)
-
ssh_mcp/server.py—run_server()接入 runtime_guard;_handle_connect接入 SecretManager;_handle_execute接入 remote_guard 规范化 + approval gate;新增 3 个审批工具的 handler 与 schema;ssh_executeschema 新增approval_id/remote_guard参数 -
ssh_mcp/key_manager.py— 新增load_key_from_str();save_key()在密钥不落地模式拒绝落盘 -
ssh_mcp/connection_config.py— 新增private_key_material字段,认证校验兼容内存私钥 -
ssh_mcp/clients/paramiko_client.py— 新增_load_pkey_from_memory()辅助函数;连接时优先用内存私钥pkey= -
ssh_mcp/session_manager.py— 连接时优先用内存私钥 -
README.md— 工具表 9→12 个,新增生产加固四项章节 -
VERSION/pyproject.toml/ssh_mcp/__init__.py/package.json— 版本号 2.0.2 → 2.1.0
# 生产跳板机 systemd unit
[Service]
User=sshlicco
Environment=SSH_RUNTIME_GUARD=true
Environment=SSH_SECRET_PROVIDER_ENABLED=true
Environment=SSH_SECRET_PROVIDER=command
Environment=SSH_SECRET_COMMAND_PROD_DB=vault kv get -field=private_key secret/ssh/prod-db
Environment=SSH_REMOTE_GUARD=true
Environment=SSH_APPROVAL_GATE=true
Environment=SSH_AUDIT_LOG_PATH=/var/log/ssh-licco/audit.log# AI 高危命令审批工作流
# 1. 直接执行被拦截
ssh_execute(command="rm -rf /tmp/old_logs") # → 审批门禁拦截
# 2. 申请审批
ssh_request_approval(command="rm -rf /tmp/old_logs", reason="清理过期日志")
# → approval_id=eb4c261d...
# 3. 运维人员审批
ssh_approve_command(approval_id="eb4c261d...", decision="approved", reviewer="ops-admin")
# 4. 携带 approval_id 执行(一次性消费)
ssh_execute(command="rm -rf /tmp/old_logs", approval_id="eb4c261d...")-
python test_hardening.py四项加固端到端测试全部通过(4/4) - 既有测试套件 327 passed / 10 failed(10 个失败为既有环境问题,非本次引入,已 git stash 对比验证)
- 版本号同步与发布流程稳定化
-
多层安全确认机制:危险操作默认被阻止,需要多层确认才能执行
- 自动风险评估:SAFE/LOW/MEDIUM/HIGH/CRITICAL 五个风险级别
- 分层确认:严重风险3次确认,高风险2次确认,中等风险1次确认
- 默认阻止:危险命令(如
rm -rf)必须先确认,否则被阻止 - 详细警告消息:显示风险级别、确认进度和操作提示
-
风险评估系统:新增
RiskLevel枚举,自动识别命令风险 -
多层确认流程:
confirm_dangerous=true+confirmation_layer参数组合确认 -
配置文件支持:
config/multi_layer_confirmation.example.json提供详细配置选项 - 日志记录:记录所有确认尝试、成功确认和被阻止的命令
-
ssh_mcp/security.py- 添加RiskLevel枚举和多层确认方法 -
ssh_mcp/server.py- 集成多层确认逻辑 -
config/multi_layer_confirmation.example.json- 新增配置文件
# 危险命令默认被阻止
ssh_execute(command="rm -rf /tmp/test_cache/*")
# 输出:❌ 操作已被安全机制阻止 + 详细警告信息
# 确认执行(需要3次确认)
ssh_execute(command="rm -rf /tmp/test_cache/*", confirm_dangerous=True, confirmation_layer=1)
ssh_execute(command="rm -rf /tmp/test_cache/*", confirm_dangerous=True, confirmation_layer=2)
ssh_execute(command="rm -rf /tmp/test_cache/*", confirm_dangerous=True, confirmation_layer=3)- 修复 session 管理和重连机制问题
- 升级版本到 v1.8.0 并移除废弃的 CLI 测试文件
-
移除 CLI 接口:完全移除命令行工具接口,专注于 MCP 工具集
- 删除
ssh_mcp/cli.py- CLI 主入口 - 删除
ssh_mcp/fallback_executor.py- CLI 回退执行器 - 删除
ssh-licco.js- Node.js 包装脚本 - 删除
install.js- 自动安装脚本 - 删除
package.json- npm 包配置 - 移除
pyproject.toml中的[project.scripts]配置
- 删除
-
强制安全确认:所有危险操作必须通过 MCP 工具的
confirm_dangerous参数明确确认 - 移除旁路风险:不再有 CLI 可以直接调用,所有操作都受安全机制保护
- 审计更完整:所有操作都通过 MCP 层,有完整的审计日志
| 配置项 | 之前 | 现在 |
|---|---|---|
| MCP 命令 | "command": "ssh-licco" |
"command": "python -m ssh_mcp.server" |
| npx 启动 | npx ssh-licco |
❌ 已移除 |
- ✅ 完整的 MCP 工具集(9 个工具)
- ✅ 多级安全策略(STRICT/BALANCED/RELAXED)
- ✅ 所有 SSH 功能(连接、执行、文件传输、Docker、screen/tmux 等)
- ✅ Python 包安装(
pip install ssh-licco)
-
server.list_sessions和server._execute中session_info属性访问修复,改为session_info.config.username/session_info.config.host,避免属性缺失导致崩溃 -
list_sessions输出中使用session._connected_at/session._last_activity并增加N/A兜底,防止 session 未完全初始化时崩溃
- 版本号更新至 1.6.5
-
ConfigManager.__init__新增server_config_path参数,支持测试和外部调用方按需指定服务器配置文件路径 -
ssh_connect接受 MCP 客户端以字符串"22"形式传入的端口,自动强转为int(MCP 协议下 JSON schema 声明 integer,但部分客户端仍按字符串发送) -
ConfigManager.add_host增加 IP+端口重复校验,已存在相同 host:port 的主机时静默跳过,避免误添加 - 修复
SessionManager.get_session在遇到已断开 session 时引用未初始化的self._logger导致AttributeError的问题(断连时自动清理逻辑此前会崩溃,掩盖真实的连接断开信号)
- 测试用例 409 → 410(新增
test_get_session_disconnected_auto_clean覆盖断连自动清理场景)
- 安全策略白名单配置文件支持:
- 新增
config/allowed_commands.example.json配置示例 -
CommandValidator.from_config_file()类方法支持从 JSON 文件加载白名单 -
create_validators_from_env()支持SSH_ALLOWED_COMMANDS_FILE环境变量
- 新增
- 常用运维命令加入内置白名单:
nginx、systemctl、curl、apache2、httpd、caddy、haproxy、traefik、pm2、lscpu、lsblk、ip、snap等 - 后台任务日志状态细化为 5 种,并附诊断信息:
- ✅ SUCCESS:命令执行成功(
EXIT=0) - ❌ COMMAND_FAILED:命令执行失败(
EXIT>0),附带退出码诊断 ⚠️ STATUS_ABNORMAL:进程异常终止(被信号杀死/OOM,未写入 exit 文件)- 🟢 RUNNING:后台任务仍在运行
- 🔴 STARTUP_FAILED:任务启动失败(nohup/shell 错误),附带启动失败诊断
- ✅ SUCCESS:命令执行成功(
- 修复 Windows 上
PathValidator使用Path导致远程 Unix 路径验证失败的问题,改为PurePosixPath - 修复
KeyManager.load_key不支持 OpenSSH 格式私钥的问题,优先尝试load_ssh_private_key
- 3 个原本跳过的测试现在全部通过
- 文档
docs/CONTRIBUTING.md增加语义化版本 xyz 升级规则的详细说明
-
relaxed安全级别改为黑名单机制,仅拦截rm -rf /、mkfs、dd、fork bomb等高危命令 -
ssh_connect支持sudo_password参数,ssh_execute支持use_sudo=True -
ssh_file_transfer新增remote_copydirection,支持服务器间直传(scp/rsync) - 后台任务元数据文件
.meta,便于 SSH 断开后跨 session 追踪
- 修复后台任务"假失败"问题:DEAD 状态改为区分"已完成"和"已失败"
- 修复
nginx -t、systemctl status等瞬时命令被误判为后台长任务的问题
- 后台任务可靠性增强:单次 SSH 调用 +
nohup bash -c包装,消除竞态 - 新增
screen/tmux持久化会话支持(session_type参数) - 新增
ssh_session和ssh_process工具
- 保持 channel 引用,防止进程被 GC 回收
-
docker build不再被误判为后台任务
- 修复
MCP_GITHUB_TOKEN配置 - 修复 Auto Release 工作流
- README 文档更新,同步到 PyPI
- 精简重构:MCP 工具从 15 个合并为 7 个
- 新增自动连接、智能后台检测、长任务等待
- 首个主要版本
- CLI 增强:
exec、upload、download、docker-build、list-hosts - 完整测试套件(402 用例)、看门狗监控、审计日志、连接池、批量执行
- 自动安装体系优化:依赖完整性检查、增量更新、Anaconda 检测、
cli.py精简
- 修复
_logger初始化 bug
- 安全配置增强
- 多级安全策略
- 环境变量配置
- 安全验证模块
- 命令白名单
- 基础功能
- 后台任务