工具

SSH 远程运维

Mopheus SSH 是内置的受控远程运维与文件传输工具,深度联动 IT 资产中心与零信任密钥管理。

mop ssh 是 Mopheus 内置的受控远程执行与文件传输工具。它为 AI 智能体与工程师提供了安全、受控且具备因果拓扑感知能力的远程运维通道。

在传统的运维排障场景中,智能体执行远程命令往往面临三大安全与管理困境:

  • 凭据泄露风险 — 在任务提示词或环境变量中明文传递私钥或密码;
  • 资产与连接脱节 — 智能体在处理业务报警时,不知道微服务或数据库运行在哪台物理宿主机上;
  • 缺乏审计与控制 — 无法限制智能体随意对任意未知服务器发起暴力尝试或滥用权限。

Mopheus 通过 IT 资产中心 (mop asset) 与 SSH 远程执行器 (mop ssh) 解决上述问题。一个资产可以配置多个 SSH 用户账号,凭据与普通资产清单分开管理。


零信任凭据架构

Mopheus SSH 按资产 ID 和用户名保存连接元数据与加密认证载荷,并与普通资产属性分离:

┌───────────────────────────────────────────────────────────────────────────────────────────┐
│                                  Mopheus AI 智能体 / 任务                                 │
└──────────┬───────────────────────────────────┬───────────────────────────────────┬────────┘
           │ 1. 拓扑探查与因果穿透             │ 2. 资产账号与信封加密             │ 3. 命令执行与文件传输
           ▼                                   ▼                                   ▼
┌─────────────────────┐             ┌─────────────────────┐             ┌─────────────────────┐
│ mop asset           │             │ mop user            │             │ mop ssh             │
│ (IT 资产本体图谱)   │             │ (config-file/key)   │             │ (受控远程执行通道)  │
├─────────────────────┤             ├─────────────────────┤             ├─────────────────────┤
│ • 逻辑/物理分层     │             │ • Ed25519/RSA 密钥  │             │ • 资产名称/别名解析 │
│ • 账号元数据        │             │ • 密码和私钥密文    │             │ • 用户选择          │
│ • 拓扑下钻穿透      │             │ • 沙箱任务即时注入  │             │ • exec / upload     │
└─────────────────────┘             └─────────────────────┘             └─────────────────────┘
  1. 资产清单不包含 SSH 凭据。使用 mop asset apply 管理资产,密码和私钥放在独立且权限为 0600 的凭据文件中。
  2. 管理 SSH 账号:使用 mop asset credential add|update|list|import。一个资产可配置多个用户名,并可为账号指定连接地址、端口和一跳跳板资产。
  3. 凭据传输使用应用层加密:写入和 SSH 连接读取均使用 X25519/HKDF/AES-GCM 信封。密钥只在 CLI、服务端和 SSH provider 进程内解密;列表和状态查询不返回密钥或密码。

同一 manifest 文件可在 assets 旁边声明 credentials,通过 assetId 关联资产(文件权限设为 0600):

version: mopheus.io/v1alpha1
kind: AssetManifest
metadata:
  workspace: production
  environment: prod
assets:
  - id: host:db-node-01
    concept: Host
    name: Database node
    attributes:
      management_ip: 10.0.2.11
credentials:
  - assetId: host:db-node-01
    username: deploy
    authType: password
    connectPort: 22
    jumpAssetId: host:bastion-01
    jumpUsername: ops
    secret:
      password: replace-in-protected-file

使用 mop asset apply -f assets.yaml 同步应用资产和凭据;也可将凭据放在独立的 0600 文件并通过 --credentials-file 传入。普通资产导出不包含凭据。


资产驱动的目标消解

执行 mop ssh 时,目标无需手动拼装完整的 IP 与端口,支持多维度实体解析:

  • 标准 Asset ID:如 host:mopheus-prod-cn、host:db-node-01
  • 资产名称 (Name):如 mopheus-prod-server
  • 业务别名 (Aliases):如 prod-node1、jumpbox-cn
  • IP 地址:如 10.10.2.11

逻辑资产 vs 物理承载资产

Mopheus 严格区分逻辑资产(微服务 Service、数据库集群 Database)与物理承载资产(宿主机 Host、容器 Container):

  • 逻辑资产没有物理 SSH 监听端点;请通过拓扑找到配置了 SSH 账号的主机。
  • 如果对逻辑资产直接发起 mop ssh,系统将触发友好拦截并提示下钻。
  • 智能体通过 mop asset topology <logical-id> 探查下游 runs_on 拓扑边,精准找到承载其实际运行的宿主机,再向宿主机发起连接。

常用命令指南

1. 查看已授权的主机列表

列出当前工作区中配置了有效 SSH 凭据的所有资产:

mop ssh list

每个已配置用户名单独显示为一行,默认每页 100 条。表格会显示当前页和总数,JSON 会包含页码、每页数量和总页数。使用 --page 和 --per-page 翻页或调整每页数量;--search 会在服务端筛选资产名称、ID、别名和连接地址。资产配置多个用户时,使用 --user 选择账号。

查看凭据元数据(不会显示密码或私钥):

mop ssh credential get host:db-node-01 --user deploy

迁移前可盘点旧 SSH URI。报告不会输出 URI 密码或原始引用:

mop asset credential inventory --output json

2. 远程命令执行 (mop ssh exec)

在目标宿主机上执行非交互式 Shell 指令:

# 查看远程主机运行时间与系统负载
mop ssh exec host:mopheus-prod-cn -- uptime

# 查看磁盘使用状态
mop ssh exec host:mopheus-prod-cn -- df -h

# 查看容器运行状态
mop ssh exec host:mopheus-prod-cn -- docker ps

# 输出 JSON 格式(便于脚本与智能体解析)
mop ssh exec host:mopheus-prod-cn --json -- uname -a

# 指定超时时间(单位秒,防止长耗时命令挂起)
mop ssh exec host:mopheus-prod-cn --timeout 15 -- journalctl -u nginx -n 50

# 预览最终发送的远端命令,不连接 SSH
mop ssh exec --dry-run host:mopheus-prod-cn -- printf '%s' 'hello world'

--dry-run 会打印 transport 实际使用的 shell 命令,不建立 SSH 连接或执行命令。配合 --script 时会列出上传目标、执行命令和清理命令,但不会上传脚本。

SSH 命令策略

工作区设置中的 SSH 命令策略 可管理 mop ssh exec 使用的拒绝规则。规则按组组织,每条规则单独配置;成员权限分别控制创建、修改和删除。策略测试只解析命令或脚本,不会连接主机或执行输入。

系统默认规则由后端提供,显示在“系统默认规则”页签中;规则定义不可修改或删除,但工作区管理员可以逐条启用或停用。根目录递归强制删除和 dd 直接写入 /dev/ 默认启用;文件系统格式化 mkfs、将 curl/wget 下载内容直接管道给 shell、常见 shell fork bomb 默认停用,以免影响正常运维。关闭工作区策略开关只会停用用户规则;已启用的系统规则仍生效。

CLI 可查看策略、列出规则组,并在不连接 SSH 主机的情况下测试命令:

mop ssh policy show --workspace production
mop ssh policy group list --workspace production
mop ssh policy test --command 'rm -rf /' --workspace production

3. 文件上传与下载 (mop ssh upload / download)

使用 ssh exec --script 时指定本地脚本文件;远端上传目录由 --remote-path 指定,默认 /tmp,不能指定根目录 /。上传后的文件名沿用本地文件名。显式运行命令时要写出最终远端脚本路径;不指定命令时默认用 sh。执行后 CLI 会清理远端脚本:

mop ssh exec --script ./scripts/health_check.sh --remote-path /tmp host:mopheus-prod-cn
mop ssh exec --script ./scripts/collect.py --remote-path /tmp host:mopheus-prod-cn -- python3 -u /tmp/collect.py --output /tmp/report.json

通过 SFTP 在本地沙箱与远程主机之间安全同步诊断工具或日志生成物:

# 将本地诊断脚本上传至远程主机的临时目录
mop ssh upload host:mopheus-prod-cn ./scripts/health_check.sh /tmp/health_check.sh

# 将远程生成的诊断报告或故障转储日志下载到本地
mop ssh download host:mopheus-prod-cn /tmp/diagnostic_report.json ./report.json

智能体排障规范与安全护栏

在执行自动化运维排障任务时,智能体必须严格遵守以下执行规范:

  1. 下钻定位真实宿主:面对业务报警(如 db:settle-oracle-rac 异常),先运行 mop asset topology db:settle-oracle-rac 探明运行承载的主机 host:db-node-01,再执行 SSH 探测。
  2. 鉴权失败快速阻断 (Strict Fail-Fast):当遇到密钥缺失或 Permission Denied 拒绝连接时,立即终止并向用户清晰汇报缺少的密钥名称,严禁使用假想密码或循环重试。
  3. 禁止非授权凭据探测:严禁在磁盘上递归扫描私钥(禁止执行 find / -name "*id_rsa*", grep -r "BEGIN RSA"),严禁任何字典暴力破解行为。
  4. 状态确认与最小影响:执行诊断命令优先使用只读与非阻塞参数(如 tail -n 100、top -b -n 1)。

常见排障实战示范

场景一:宿主机高负载紧急巡检

# 1. 检查 CPU 与系统负载
mop ssh exec host:app-node-01 -- uptime

# 2. 探查内存消耗前 5 的进程
mop ssh exec host:app-node-01 -- ps aux --sort=-%mem | head -n 6

# 3. 检查根分区与挂载卷空间
mop ssh exec host:app-node-01 -- df -h / /var/log

场景二:服务崩溃日志实时捕获

# 查看系统级服务最近 50 条报错日志
mop ssh exec host:app-node-01 -- journalctl -u mopheus-daemon -n 50 --no-pager

场景三:诊断工具分发与取证

# 上传诊断工具并执行
mop ssh upload host:app-node-01 ./collect_stats.py /tmp/collect_stats.py
mop ssh exec host:app-node-01 -- python3 /tmp/collect_stats.py --out /tmp/stats.json
mop ssh download host:app-node-01 /tmp/stats.json ./stats.json