196 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 苍耳本地 Linux 节点接入
这个模块把苍耳家里的 Ubuntu 接到新加坡大脑服务器,但不把家里的电脑暴露到公网。
## 工作方式
1. 新加坡控制端运行在 `127.0.0.1:8787`,由现有 HTTPS 网关转发。
2. 苍耳节点首次使用一次性配对码登记,长期节点令牌只保存在本机 `0600` 配置中。
3. `systemd` 开机自动启动节点;连接只能从家里向新加坡主动发起。
4. 人格体创建任务后,任务保持 `pending`;苍耳/冰朔在新加坡端批准后才会下发。
5. 节点执行白名单动作并回传退出码、输出和耗时。
6. 执行期间持续回传 `started`、分段输出和 `finished` 事件,新加坡端可以
实时观察,不必等任务结束才看见错误。
## 默认安全边界
- 家里路由器不做端口转发,不开放 SSH 到公网。
- 控制端默认只监听环回地址,公网入口必须使用 HTTPS。
- 不接受 Shell 字符串,只接受结构化动作。
- 安装程序自动建立 `/srv/canger` 受管工作区,并用没有登录能力的
`canger-agent` 系统账户执行任务。
- 编程命令受可执行文件白名单、受管工作区、超时和授权时段共同限制;
Agent 没有 `sudo` 权限。
- `repo.fetch` 只更新远端引用,不自动 merge、reset 或覆盖本地修改。
- 每个任务和结果都写入 SQLite 审计记录。
## 新加坡端部署
准备 `/etc/canger-control.env`,四个令牌分别代表:
- `ADMIN`:创建设备配对码;
- `OWNER`:苍耳主控批准、拒绝或撤销副控权限;
- `PERSONA`:苍耳人格体读取任务、结果和执行上下文;
- `OPERATOR`:冰朔与铸渊副控创建运维会话、任务并读取实时回执。
实际职责为:
- 苍耳本人:服务器主控、需求方和最终决策者;
- 冰朔与 `ICE-GL-ZY001` 铸渊:受苍耳授权的运维副控;
- 每张工单的实际申请人格体:如实填写名称和正式编号;
- 本地 Agent无独立判断权的受限物理执行器
- 苍耳本人可随时批准、拒绝或撤销数小时副控运维会话。
安装 `systemd/canger-control.service`,并把
`nginx/canger-node.conf.example` 接到已有 TLS 站点。不要直接把 8787 端口开放公网。
## 首次配对
新加坡端创建十分钟有效的一次性码:
```bash
python3 tools/cangerctl.py pair-code
```
把整个 `remote-node` 目录交给苍耳。他在 Ubuntu 上只执行一次:
```bash
sudo ./install/install-node.sh \
https://guanghubingshuo.com/canger-node \
XXXX-XXXX-XXXX \
canger-home-ubuntu
```
冰朔交付给苍耳的专用包可直接使用简化入口:
```bash
sudo ./install/苍耳一键安装.sh XXXX-XXXX-XXXX
```
配对码十分钟失效,因此安装包可以提前发送,配对码应在苍耳准备执行时再生成。
安装脚本会完成登记并启用开机自启动。以后不再需要登录本地终端。
安装时还会生成只读环境报告:
```text
/var/lib/canger-node/preflight.json
```
报告会识别 systemd、虚拟化环境、磁盘文件系统和可能存在的 Windows
双启动,但不会修改分区、引导项或另一个操作系统。
## 双系统边界
真正的双系统切换会关闭当前操作系统。因此:
- 启动 Ubuntu 时,本节点会自动运行并连接新加坡;
- 切到另一个操作系统后Ubuntu 服务不可能继续运行;
- 若希望“电脑开机就总有一个节点在线”,另一个系统也需要安装配套节点;
- 若希望“Ubuntu 服务器本身始终在线”,需要让 Ubuntu 成为宿主机并把另一个
系统放进虚拟机,或者使用独立服务器。
安装程序不会自动改造分区、引导和虚拟机。这类操作可能导致数据丢失,必须在
确认硬件、另一个系统和磁盘结构后单独处理。
## 从新加坡端操作
查看节点:
```bash
python3 tools/cangerctl.py nodes
```
人格体创建任务:
```bash
python3 tools/cangerctl.py task \
--node node_xxx \
--action system.status
```
正常开发不需要逐任务批准。人格体先申请 18 小时的授权时段:
```bash
python3 tools/cangerctl.py grant \
--node node_xxx \
--hours 4
```
系统自动读取节点登记的安全能力,向苍耳主控邮箱发送人话版批准链接。
主人只看目的和时长后点一次批准,不需要填写命令、目录或权限。授权时段内,
匹配固定安全边界的任务自动批准。所有任务仍保留独立审计记录。
查看与撤销授权:
```bash
python3 tools/cangerctl.py grants
python3 tools/cangerctl.py revoke grant_xxx
```
邮件中的链接只用于某一项授权申请30 分钟失效;打开链接后还需要在确认页
点击批准避免邮件安全扫描器误触发。SMTP 密码、主人邮箱和签名密钥只放在
新加坡服务器私有环境文件中,不写入仓库或安装包。
批准任务:
```bash
python3 tools/cangerctl.py approve task_xxx
```
读取回执:
```bash
python3 tools/cangerctl.py show task_xxx
```
实时观察执行过程:
```bash
python3 tools/cangerctl.py watch task_xxx
```
## 苍耳人格体代码仓库入口
苍耳人格体不使用副控令牌。它从仓库固定门牌
`persona/README.md` 进入,并使用独立的 `CANGER_PERSONA_TOKEN`
```bash
python3 tools/canger_persona.py request-access \
--requester-name "申请者名称" \
--requester-id "申请者正式编号" \
--hours 4 \
--reason "本次开发、诊断或修复目的"
```
申请回执的 `requester_name``requested_by` 必须与本次实际申请者一致。人格体可以申请、创建任务和读取结果,
但不能批准、拒绝或撤销授权;批准权继续属于苍耳主控。固定节点和安全边界登记在
`config/pufferfish-persona.json`,令牌仍只存在新加坡私有环境文件中。
完整流程见 `persona/WORKORDER-GUIDE.md`;当天开发回执见
`persona/DEVELOPMENT-RECEIPT-20260729.md`
## 智能体与模型 API
本地 Agent 是执行、观察和审计端,不直接保存大模型供应商的 API 密钥。
运维判断由冰朔与铸渊副控在新加坡大脑服务器完成:
```text
苍耳提出需求并授权
冰朔与铸渊副控 → 创建运维任务 → 苍耳人格体/本地 Agent 协作执行
← 实时事件、错误和回执 ←
```
如需调用大模型,只把供应商 API 密钥放在新加坡服务器的密钥环境中。本地节点
只持有可撤销、仅能代表该节点的身份令牌。禁止把大模型 API 密钥写进安装包、
仓库、命令行或配对文件。
## 动作
- `system.status`:主机、系统、在线时间、根分区状态。
- `repo.status`:只读 Git 状态。
- `repo.fetch`:获取远端引用,不合并。
- `service.logs`:读取指定 systemd 服务日志。
- `command.run`:结构化命令执行;只在受管工作区内、以受限系统账户运行。