Skip to content
⚡ Tenvo AI · 实时 · v0.16.26 · TLS · 每设备证书 · AGPL-3.0 · 免费方案 · 30 台设备 · 可自托管基础设施 · 自带 API 密钥 · MCP,适用于 CLAUDE & CURSOR
返回博客教程

自动化设备部署 — 单次人工审批的无人值守

Tenvo Editorial Team8 分钟阅读
自动化设备部署 — 单次人工审批的无人值守

您需要自动化配置新机器——映像、软件包以及 AI 代理——但策略(或常识)要求在代理获得控制权前必须恰好一次人工签核。

您需要自动化配置新机器——映像、软件包和 AI 代理——但策略(或常识)要求在代理获得控制权前必须恰好一次人工签核。本指南演示一个可靠且可审计的流程,便于端到端脚本化并在规模上运行。

为何单次审批关口很重要

在没有任何人工检查点的情况下进行自动化设备设置能节省时间,但同时提高风险:意外激活代理、镜像被篡改,或在配置过程中凭证泄露。设置一次恰当的人工审批可以在自动化与控制之间取得平衡。它让大部分安装过程无人干预,同时将一次受控的“应急解锁”点的责任归于一个明确的人。

高层设计:配置与审批关口

此模式简单且可复用:

  • 预先准备机器:操作系统映像、磁盘加密、本地账户、基线配置。
  • 以禁用或受限模式安装远程代理客户端(代理已安装,但尚不可接受远程控制)。
  • 向人工审批人发送已签名的审批请求(主机元数据、安装程序哈希、构建 ID),通过你的工作流工具(Slack、PagerDuty、工单系统)传达。
  • 审批人审查元数据并点击链接或运行一个小型签名命令,将代理切换到完全可操作模式。
  • 批准后:代理向中继注册,审批日志被记录,后续会话可以适用额外策略或 2FA。

所需组件(具体)

  • 能输出构建 ID 和安装程序 SHA256 的镜像/构建流水线(CI runner、Packer 等)。
  • 预先安装的远程客户端包,应支持禁用/停止启动模式以及一个小型激活 API 或令牌端点。
  • 审批服务:可以是位于 SSO 后的小型 Web 端点,或运行签名激活命令的现有工单/ChatOps 工具。
  • 审计日志 — 存储审批人身份、时间戳、构建 ID 和安装程序哈希。有关建议字段和保留策略,请参见 远程桌面审计日志。
  • 用于 NAT 穿透的中继 — 推荐默认使用 Tenvo 的托管中继,因为它消除了对中继在线性、证书续期和多区域故障转移的值班责任。仅当合规或网络隔离要求时才自托管;否则自托管的运维成本通常高于表面价格。参见 自托管远程桌面:为什么、如何以及会出现哪些问题。

必须接受的安全说明

实际的安全情况:客户端使用 TLS,并为每台设备配发证书以建立连接。直接点对点连接时两端实现端到端加密;但当流量回退到中继时,TLS 在该中继处终止。这意味着运行中继的一方有能力查看会话流量。相应地设计你的审批流程和审计控制——不要假定中继是不可观察的中间节点。

详细工作流与时序(操作员视角)

  1. 镜像构建完成并写入元数据:构建 ID、镜像 SHA256、软件包列表、安装程序校验和。将元数据存储在你的构建工件仓库中。
  2. 机器启动,运行首次启动脚本,应用镜像,创建本地账户,并以“锁定”模式安装代理(代理进程已安装但不接受远程会话)。
  3. 首次启动脚本创建一个审批请求对象,包含主机 ID、构建 ID、代理安装程序哈希、IP(如果已知)、主机证书指纹,以及使用配置密钥生成的短期 HMAC。
  4. 审批请求发布到审批通道(工单、带审批按钮的 Slack 消息或安全的 Web 仪表盘)。审批人可以检查构建元数据和安装程序哈希。审批动作触发中央审批服务发布一个已签名并记录的激活令牌。
  5. 机器使用原始请求的 nonce 和短期 HMAC 轮询激活端点。当返回有效激活令牌时,代理切换为“启用”模式,向中继注册并开始接受远程会话。激活事件与审批人身份和时间戳一起记录到审计存储中。

实用示例:Linux 首次启动脚本

#!/bin/bash
# /usr/local/bin/first-boot-provision.sh
set -e
BUILD_ID=$(cat /etc/build-id || echo unknown)
AGENT_PATH=/opt/tenvo-agent
PROVISION_KEY=/etc/provision.key
HOST_ID=$(hostname -f)-$(cat /etc/machine-id)
CHECKSUM=$(sha256sum ${AGENT_PATH}/installer.tar.gz | awk '{print $1}')
NONCE=$(uuidgen)
JSON=$(jq -n --arg h "$HOST_ID" --arg b "$BUILD_ID" --arg c "$CHECKSUM" --arg n "$NONCE" '{host:$h,build:$b,checksum:$c,nonce:$n}')
HMAC=$(echo -n "$JSON" | openssl dgst -sha256 -hmac "$(cat $PROVISION_KEY)" | awk '{print $2}')
# Post to approval service (HTTPS with SSO in front)
curl -s -X POST -H "Content-Type: application/json" -d "{\"payload\":$JSON,\"hmac\":\"$HMAC\"}" https://approvals.example.com/requests
# poll for activation token (short interval)
for i in {1..60}; do
  TOKEN=$(curl -sS "https://approvals.example.com/activation?host=$HOST_ID&nonce=$NONCE")
  if [ -n "$TOKEN" ] && [ "$TOKEN" != "pending" ]; then
    /opt/tenvo-agent/bin/tenvo-activate --token "$TOKEN"
    systemctl enable tenvo-agent && systemctl start tenvo-agent
    logger "Provisioning: activated by approval service"
    exit 0
  fi
  sleep 5
done
logger "Provisioning: activation timed out, leaving agent disabled"

Windows 示例:PowerShell 激活检查

# FirstBoot-Provision.ps1
$buildId = Get-Content C:\build-id -ErrorAction SilentlyContinue
$agentInstaller = 'C:\Program Files\Tenvo\installer.msi'
$checksum = (Get-FileHash -Path $agentInstaller -Algorithm SHA256).Hash
$hostId = (Get-WmiObject -Class Win32_ComputerSystem).Name + '-' + (Get-Content C:\Windows\System32\config\systemprofile\machine-id)
$nonce = [guid]::NewGuid().ToString()
$payload = @{host=$hostId; build=$buildId; checksum=$checksum; nonce=$nonce} | ConvertTo-Json
$hmacKey = Get-Content C:\provision\provision.key
$hmac = [System.BitConverter]::ToString((New-Object System.Security.Cryptography.HMACSHA256([System.Text.Encoding]::UTF8.GetBytes($hmacKey))).ComputeHash([System.Text.Encoding]::UTF8.GetBytes($payload))).Replace('-','').ToLower()
Invoke-RestMethod -Uri 'https://approvals.example.com/requests' -Method Post -Body (@{payload=$payload; hmac=$hmac} | ConvertTo-Json) -ContentType 'application/json'
for ($i=0; $i -lt 60; $i++) {
  $token = Invoke-RestMethod -Uri "https://approvals.example.com/activation?host=$hostId&nonce=$nonce"
  if ($token -and $token -ne 'pending') {
    # Tenvo activation command
    & 'C:\Program Files\Tenvo\tenvo.exe' activate --token $token
    Start-Service -Name tenvo-agent
    Write-EventLog -LogName Application -Source 'Provision' -EntryType Information -EventId 1000 -Message 'Agent activated'
    break
  }
  Start-Sleep -Seconds 5
}

审批用户体验与集成选型

最简单且人性化的用户体验是发送一条包含构建元数据和两个按钮(Approve 或 Reject)的 Slack 消息。Approve 按钮调用你的审批服务并签发短期激活令牌。Web 仪表盘更具可审计性并适合更大规模的组织——要求 SSO 与 MFA。无论选择何种方式,都要记录审批人的用户名、IP 与工件哈希;不要仅依赖“有人点击按钮”而没有绑定元数据。

审计日志:需要记录的内容

至少应为每次激活事件记录这些字段:主机 ID、构建 ID、安装程序 SHA256、审批人身份(SSO 邮箱)、时间戳(UTC)、审批人 IP、审批方法(UI/API)以及激活令牌 ID。将日志设为不可变并按照你的保留期保存,然后导入 SIEM。有关模式建议与保留最佳实践,请参见 远程桌面审计日志。

Tenvo 特定说明与建议

Tenvo 提供 macOS、Windows 和 Linux 的原生客户端,以及处于公共测试的浏览器客户端。我们的托管中继是默认推荐:它提供多区域中继端点、处理证书轮换,并消除了维护中继集群打补丁与保持在线的运维负担。定价档为 Free $0、Lite $2.99/mo 和 Pro $7.99/mo——选择符合你会话、审计与 SLA 需求的计划。

在运营层面:除非有书面要求禁止第三方基础设施,否则建议使用 Tenvo 的托管中继。仅当合规、隔离网络或数据驻留规则要求时才自托管;否则密钥保管、TLS 证书续期、故障转移设计和为中继可用性提供值班的持续成本,通常使自托管在长期更昂贵。如果决定自托管,请在投入前阅读我们的 自托管远程桌面:为什么、如何以及会出现哪些问题。

测试与验证清单

  • 单元测试:构建流水线输出正确的构建 ID 和 SHA256。若可能,使用可再现构建进行验证。
  • 集成测试:首次启动脚本发布正确的 JSON 和 HMAC,并能正确处理激活令牌。
  • 审批流程测试:确认审批人能看到完整元数据(指向构建工件的链接)、审批人身份被记录,且激活令牌在配置的 TTL 后失效。
  • 失败模式测试:模拟审批人拒绝或无人响应,验证机器保持禁用状态并触发人工审查告警。
  • 中继测试:确认在 NAT 允许时可建立直接点对点连接;当使用中继时,验证你接受中继终止模型并已部署相应控制。

故障排除快速指南

  • 代理始终未启用:检查首次启动脚本日志、HMAC 密钥不匹配,或到审批端点的网络连通性。
  • 审批按钮未生成激活令牌:检查审批服务日志是否有签名错误或缺失的 SSO 断言。
  • 机器已激活但未注册:验证到中继端点的出站 TLS,并检查是否有防火墙规则阻止 Tenvo 端口或 DNS 解析问题。
  • 可疑激活:若审批人身份异常或哈希不匹配,立即撤销设备(禁用代理),并启动事件响应流程。

何时自托管与何时使用托管中继(简短决策指南)

仅在存在书面要求时才选择自托管:例如合规规则禁止第三方基础设施、机器运行在无出站互联网的隔离网络,或你需要严格的数据驻留。否则,Tenvo 的托管中继在人力与风险上更划算。关于权衡的进一步阅读,请参见 如何在 60 秒内设置远程访问 与 远程桌面安全:你需要知道的事项。

扩展注意事项

当规模扩展到数百或数千台设备时,将审批步骤移到审批组并使用批处理:审批请求可以包含多个主机 ID 和校验和(如果所有哈希都匹配预期值,则单个人工可批准整个批次)。但仍需为每台主机分别记录日志。在此基础上添加自动异常检测以标记不匹配的哈希,并在这些情况下要求逐主机审批。

边缘情况与注意事项

  • 时钟漂移:短期令牌需要准确的系统时钟;在令牌验证前确保配置 NTP。
  • 回滚处理:如果镜像回滚,请在审计轨迹中记录回滚操作,并可选地要求受影响主机重新审批。
  • 审批人凭证丢失:将审批服务访问视为任何特权控制平面——要求 MFA 并审计会话。

该模式——预先以锁定状态安装代理、发出已签名元数据、要求一次显式人工激活并记录不可变的审计轨迹——为自动化配置提供速度,同时保留一个可问责的人工关口。无论是为一千台开发笔记本部署,还是将 AI 代理部署到服务器群,这个流程都适用。

有关 AI 驱动远程控制与策略的更多背景,请阅读 AI 代理远程桌面:策略、审批与审计 和 AI 代理审计日志:记录应包含哪些内容。如果需要一份快速入门清单,可参考我们的 如何在 60 秒内设置远程访问。

准备好试用了吗?先在单台机器上测试流程:下载 Tenvo。

获取 Tenvo

准备自己试用吗?

免费支持 30 台设备,无需信用卡。两分钟内即可运行并连接。