> 2026-09-23 更新：以[统一登记与逐次发布规则](registration-gated-release.md)为后续实施目标。所有已登记项目的代码和部署配置统一纳入，账号、密钥、权限由管理员维护。下文的逐账号配置属于现有入口/首次开通说明，不应当作为每次发布都要手工改权限的要求。统一发布闸门尚未全部接通。

# 管理员授权操作单

本文件用于一次性接入；不要求管理员批准每次已授权范围内的普通发布。先看 workflow.md 的当前状态。新账号目前需要维护者适配工具后，管理员才能执行下述工具授权步骤。

## 1. 接收申请并核验

收齐 maintainer-request.json、项目负责人确认的 project-policy.json、公钥文件及其指纹。通过独立联系渠道确认负责人和公钥指纹；不接收私钥。公钥检查示例：

```sh
ssh-keygen -lf /root/reviewed-maintainer.pub
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
```

前者核对申请者公钥，后者给申请者核对服务器身份。只接受管理员已审核的公钥文件，不能把公网上未经核验的内容直接写进 authorized_keys。

## 2. 创建独立系统账号（新账号示例）

以下示例用 agent-demo-device，管理员应替换为批准的系统用户名；现有账号先人工核对，不覆盖原公钥。设备显示名可以不同，推荐系统用户名只用小写字母、数字及连字符。

```sh
sudo adduser --disabled-password --gecos '' agent-demo-device
sudo install -d -m 700 -o agent-demo-device -g agent-demo-device /home/agent-demo-device/.ssh
sudo install -m 600 -o agent-demo-device -g agent-demo-device /root/reviewed-maintainer.pub /home/agent-demo-device/.ssh/authorized_keys
sudo install -d -m 700 -o agent-demo-device -g agent-demo-device /home/agent-demo-device/uploads
```

不要加入 sudo/docker 特权组，也不要把生产源码目录授予维护者直接写权限。上述操作只开通 SSH 公钥登录，不等于已经开放登记或发布。

已有账号添加新密钥应逐条追加并记录指纹，保留其他合法密钥；是否允许端口/代理转发按实际需要配置。公钥绑定身份仍须与项目授权对应。

## 3. 安装经过审查的工具版本

管理员在私有暂存目录审查安装包，核对从已确认渠道取得的 SHA256，先复制到 root 专用目录，再执行同一份已核验文件。禁止 curl URL | sudo bash。把工具源码和版本摘要纳入安装回执。

当前试点并非通用包：register.py、cell_submit.py 的 ACTOR，以及 export_records.py 的 SUDO_USER 检查固定为 gpt@zfold8；只改 sudoers 为新账号会被工具拒绝。不要简单去掉身份检查。

新账号适配必须覆盖：
- 受 root 管理的维护者/项目/能力映射，默认拒绝未知身份。
- 登记记录同时保存服务器、项目、真实账号/UID；提交与发布检查同一身份及项目。
- 旧记录归属不可重写，账号更名或迁移另留回执。
- 多项目分别配置目录、固定发布命令和审计来源，不能将一个项目编号用于另一个项目。
- 导出是否跨维护者可见由管理员明确批准；未授权者不得读取全部差异。

上述通用映射目前是适配要求，并非现有 JSON 模板已被脚本读取。工具维护者应先交付实现和通过的验收结果，管理员再开放命令。

生产工具及其配置必须由 root 拥有，所在目录也不能由维护者写入。审计存储和候选目录只给工具写权限；维护者仅拥有自己的上传暂存目录。检查脚本不能以 root 直接执行提交者的任意测试脚本、npm 生命周期命令或自报发布命令。

## 4. 配置最小命令权限

下面是当前大陆试点已有规则的结构示例；不是新账号可直接套用的授权。新账号先完成上节工具适配，真实脚本路径也必须一致。

```sudoers
"gpt@zfold8" ALL=(root) NOPASSWD: /usr/bin/python3 -I /usr/local/lib/njwl-maintenance/register.py *
"gpt@zfold8" ALL=(root) NOPASSWD: /usr/bin/python3 -I /usr/local/lib/njwl-maintenance/cell_submit.py submit *, /usr/bin/python3 -I /usr/local/lib/njwl-maintenance/cell_submit.py publish *, /usr/bin/python3 -I /usr/local/lib/njwl-maintenance/cell_submit.py status *
"gpt@zfold8" ALL=(root) NOPASSWD: /usr/bin/python3 -I /usr/local/lib/njwl-maintenance/export_records.py
```

通配参数只允许交给严格校验参数的固定脚本；脚本还必须拒绝额外参数、非法登记号、越界路径和伪造身份。不要授权任意 python3、bash、docker、systemctl 或编辑 root 脚本。

先把拟用规则写入 root 暂存文件，使用 visudo -cf 校验，再 install -o root -g root -m 440 安装至 /etc/sudoers.d/ 下的专用文件，最后 visudo -c 验证全局。保留当前管理员会话；失败恢复备份，不退出后再修。

注意：export_records.py 后面没有参数。不要额外加尾部双引号空参数；这曾导致试点规则无法匹配正确命令。

## 5. 验收并签发交接单

以新维护者本人真实 SSH 会话运行测试；sudo -l 只是规则列表，不能替代实际调用。按 acceptance.md 验证正确操作可用、错误身份/范围/编号被拒绝、失败有回执、撤销有效。

授权回执填写：授权人、项目负责人、账号、UID、公钥指纹、目标主机指纹、项目、能力、工具/配置摘要、授权时间、复核时间、撤销入口、测试证据。不要记录私钥。当前工具不自动执行到期撤权，由管理员负责复核。

## 6. 撤销

先核对在途发布与活动会话，按指纹撤销指定 authorized_keys 条目，移除专用 sudoers 规则和工具内部项目授权，必要时终止已存在会话；再次测试新连接和发布入口均无法使用。保留历史记录，不删除同账号其他人员的密钥或整个共享账号。
