夜雨聆风学习资料网

ARTICLE · 1122503

自托管 AI 助手进内网前,先做完这 5 项检查

自托管 AI 助手进内网前,先做完这 5 项检查

"我们打算在内网搭一个 AI 助手,大家都能用。有人推荐 Octop,说是自托管、数据不出门、还能多人共用。"

这类需求最近半年明显变多了。我顺着看了一圈,发现大部分讨论停在"怎么装起来",很少有人讲装起来之后怎么办。

这篇以 Octop 为例,但不是只讲它——我要说的是**自托管 AI 助手进内网之前,有哪些检查不能省**。这些东西换成任何一个带终端和浏览器的 AI 工具都适用。

一、先说清楚:被攻破之后,丢的不是数据

这是自托管 AI 助手和普通内部系统最本质的区别。

普通 Web 系统被攻破,攻击者拿到的是**数据**。而一个带终端、浏览器、远程桌面的 AI 助手被攻破,攻击者拿到的是**执行权**:

· 宿主机的 shell(终端能力)

· 已登录的网页会话(浏览器能力,基于 CDP 直连)

· 键鼠操控(远程桌面)

· 所有已授权的外部服务 token(文档、IM、网盘…)

· 全部历史对话与长期记忆

最后一条容易被忽略:**记忆里往往沉淀着最多的内部信息**——项目背景、排障过程、内部术语。它不像数据库字段那样有明确的敏感标记,反而是最容易被整体拖走的东西。

所以这类系统的安全基线应该**高于**普通内部工具,不能按"反正内网用用"的标准来部署。

二、"开源"是分层的,别停在 L0

关于 Octop 有个常见的讨论:**它最核心的组件到底开没开源。** 这个话题值得跟一下,因为它演示了"开源"这件事的分层。

先给事实(2026-10-03 实查 GitHub API):

· 主仓 TencentCloud/Octop:**6,406 star / 789 fork / 745 open issues**,MIT,Python,最后 push 10-02

· 9 月中旬时还是 2,860 star、211 open issues → **半个月里 star 涨了 124%,但 issue 涨了 253%**

· 最新版本已从 v1.0.0 走到 v1.0.2b5(9-29),13 天内发了 5 个 beta

然后是那个反转。四个核心组件在初期标注"筹备开源中",官方在 issue 里的回复是"等热度继续提升后会陆续开源"。**结果 9 月 24 日真的开了**,只是改了名字:

· octop-harness(Agent 运行时):32 star,MIT,9-24 创建

· octop-gateway(IM 通道桥接):28 star,MIT

· octop-memory(分层记忆):26 star,MIT

· octop-browser(CDP 浏览器自动化):22 star,MIT

所以"能跑不能审计"这个判断,现在要打个折。但**开源只是第一层**:

L0 代码可得 —— 源码能下载到 ✅(已达成)

L1 构建可复现 —— 能自己从源码编出同样产物 ⚠️(取决于你怎么装)

L2 依赖可追溯 —— 知道运行时实际加载了哪些代码 ⚠️(要自己建 SBOM)

L3 社区已审计 —— 有人真看过并报过问题 ❌(四个组件加起来 star 不到 110)

四个组件 star 加起来不到主仓的 2%——这说明用户关心的是产品,不是代码。**"开源了"和"被审计过"之间还隔着两个数量级的注意力。** 下面第二节实践就是把 L1 和 L2 自己补上。

三、部署:最小暴露面

第一条原则:**不要直接把 8088 端口暴露出去。** 容器只监听本地回环,公网访问一律走反向代理,前面再加一层鉴权。

# 关键:-p 前面带上 127.0.0.1,只监听本机

docker run -d --name octop \

  -p 127.0.0.1:8088:8088 \

  -v octop-data:/data/.octop \

  -e HOME=/data \

  -e OCTOP_DEFAULT_PASSWORD="$(openssl rand -base64 24)" \

  --restart unless-stopped \

  octop:latest

这里有三处和常见教程不一样:

· -p 127.0.0.1:8088:8088:只绑回环地址,外面扫不到

· 密码**运行时生成**,不写进镜像也不写进 compose 文件

· 官方文档的默认管理员口令是公开的弱口令,**首次启动后必须立刻改**——这一条几乎所有自托管项目都中招,也是被扫得最多的一个点

需要外部访问时,反向代理加一层前置认证:

server {

    listen 443 ssl;

    server_name ai.internal.example.com;

    ssl_certificate     /etc/nginx/certs/fullchain.pem;

    ssl_certificate_key /etc/nginx/certs/key.pem;

    # 只允许内网网段 + VPN 段

    allow 10.0.0.0/8;

    allow 172.16.0.0/12;

    deny  all;

    location / {

        # 前置一层基础认证,多一道门

        auth_basic "Restricted";

        auth_basic_user_file /etc/nginx/.htpasswd;

        proxy_pass http://127.0.0.1:8088;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        # 远程桌面 / 终端走 WebSocket,这两行不能少

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection "upgrade";

        proxy_read_timeout 3600s;

    }

}

WebSocket 那两行值得单独提醒:**远程桌面和终端能力依赖长连接**,反代没配 Upgrade 头会表现为"能登录但一开终端就断",排查起来很费时间。

四、实践场景一:确认你装的依赖真的可审计

这是我最想写的一节,因为它把"可审计"从口号变成了可执行的动作。

原理不复杂:PyPI 上的包分两种分发形式——**wheel 是编译后产物,sdist 是源码包**。如果某个依赖只提供 wheel 没有 sdist,你就没办法从源码层面验证它到底做了什么。

先扫一遍环境里有哪些包是"只给 wheel"的:

#!/usr/bin/env bash

# 列出没有源码分发(sdist)的依赖 —— 这些无法从源码审计

set -u

OUT=$(mktemp -d)

trap 'rm -rf "$OUT"' EXIT

for pkg in $(pip freeze | cut -d= -f1 | cut -d'[' -f1); do

  [ -z "$pkg" ] && continue

  if ! pip download --no-binary :all: --no-deps -q -d "$OUT" "$pkg" >/dev/null 2>&1; then

    echo "⚠️  无源码分发: $pkg"

  fi

done

扫出来的包不一定要换掉,但**要知道它们是哪些**,并且把这份清单归档。这就是 SBOM 的雏形。

然后验证关键包:把 sdist 拉下来,和 GitHub 上对应 tag 的源码比对。

VERSION=1.0.1

mkdir -p audit && cd audit

# 1) 拉源码包(不走 wheel)

pip download --no-binary :all: --no-deps octop==$VERSION -d .

tar -xzf octop-$VERSION.tar.gz

# 2) 拉官方仓库对应 tag

git clone --depth 1 --branch v$VERSION \

    https://github.com/TencentCloud/Octop.git upstream

# 3) 比对

diff -rq octop-$VERSION upstream \

    --exclude=.git --exclude=*.egg-info \

    | head -50

这一步有个**必须提前说清楚的预期**:diff 几乎不可能完全干净。sdist 里通常包含构建生成的文件(如 PKG-INFO、*.egg-info、打包时生成的资源),这些在仓库里没有。

所以正确的做法是**关注关键目录是否一致**——认证、模型路由、工具执行、凭据处理这几处代码。如果这些目录有不明差异,那才是真问题。目标不是让 diff 归零,是让"敏感路径可核对"。

顺带一个判断信号:octop 在 PyPI 上的描述里写的还是旧组件名,而 GitHub README 已经改成新名了。**这类"文档没同步"的小细节,往往能反映发布流程的成熟度**——不是大问题,但值得记一笔。

五、实践场景二:能力开关与并发

第二节说过,远程桌面、浏览器、终端这三项是"重能力"。默认全部打开,意味着攻击面直接拉满。我们的做法是**默认关闭,用时再开,用完即关**。

具体到 Octop,这几项在控制台左侧栏都能看到(Remote Desktop / Browser AI+ / Terminal AI+)。原则比配置更重要:

· **远程桌面**:只在需要跨机排障时临时开,不要常驻

· **浏览器能力**:它基于 CDP 直连浏览器,意味着能触达已登录的会话。给专人开,不全员开

· **终端能力**:建议给 AI 用的账号单独建一个低权限系统用户,不要用 root 或你的常用账号

数据库这边,默认是 SQLite(WAL 模式)。几个人的量完全够用,但**给几十人的团队用就得换 PostgreSQL**——SQLite 的写锁是整库级的,并发一上来就卡。切换时数据库用容器起即可,Octop 侧的连接配置以官方文档为准:

services:

  db:

    image: postgres:16-alpine

    environment:

      POSTGRES_DB: octop

      POSTGRES_USER: octop

      POSTGRES_PASSWORD_FILE: /run/secrets/pg_pass

    volumes:

      - pgdata:/var/lib/postgresql/data

    secrets:

      - pg_pass

    healthcheck:

      test: ["CMD-SHELL", "pg_isready -U octop"]

      interval: 10s

      retries: 5

    # 同样只暴露给同网络的 octop 服务,不映射到宿主机

    expose:

      - "5432"

  octop:

    image: octop:latest

    depends_on:

      db:

        condition: service_healthy

    ports:

      - "127.0.0.1:8088:8088"

    volumes:

      - octop-data:/data/.octop

    environment:

      HOME: /data

      OCTOP_DEFAULT_PASSWORD_FILE: /run/secrets/octop_pass

    secrets:

      - octop_pass

volumes:

  pgdata:

  octop-data:

secrets:

  pg_pass:

    file: ./secrets/pg_pass.txt

  octop_pass:

    file: ./secrets/octop_pass.txt

密码走 secrets 而不是 environment 明文,是为了避免出现在 docker inspect 和进程环境里。这属于顺手就能做对的事。

六、对比与注意事项

自托管 AI 助手的三条路线(⭐ 为主观评分,满分 5 星):

自托管开源产品(如 Octop)

· 上手速度:⭐⭐⭐⭐⭐(一条命令)

· 数据可控:⭐⭐⭐⭐(在自己机器上)

· 可审计性:⭐⭐⭐(L0 达成,L3 几乎为零)

· 运维责任:⭐⭐(全在自己身上)

· 适用:想快速验证、团队规模不大

开源框架自建(LangChain / 各类 Agent 框架拼装)

· 上手速度:⭐⭐

· 数据可控:⭐⭐⭐⭐⭐

· 可审计性:⭐⭐⭐⭐⭐(每一行都是自己的)

· 运维责任:⭐(最重)

· 适用:有明确定制需求、有工程人力

商业 SaaS

· 上手速度:⭐⭐⭐⭐⭐

· 数据可控:⭐(要出门)

· 可审计性:⭐(只能看对方的合规文档)

· 运维责任:⭐⭐⭐⭐⭐

· 适用:数据敏感度低、不想养运维

几条注意事项:

· **看 issue/star 比的变化,不要看绝对值。** Octop 半个月里 star +124%、issue +253%,后者增速是前者两倍——这是"产品形态跑在工程成熟度前面"的典型信号

· **beta 后缀 + 高频发版要放进预期。** 从 v1.0.0 到 v1.0.2b5 只用了 13 天,说明 1.0 的"完整"是相对的,生产环境要锁版本

· **一键安装脚本是"先执行后审计"。** macOS/Linux 的 install.sh、Windows 的 install.ps1 都是下载即执行,真要跑就先单独下下来看一遍,或者直接用 Docker

· **备份的是整个数据目录**,配置和凭据都在里面,漏了凭据等于重装

· **审计日志比 Web 应用更重要。** 要能回答"谁在什么时候让 AI 执行了什么"

七、总结

这套检查适合:

· 准备把 AI 助手接入内网、多人共用

· 助手带有终端、浏览器、远程桌面等重能力

· 数据敏感度要求"不出门"

· 团队规模在几十人以内

需要另外考虑的情况:

· 上百人共用且要做细粒度权限 → 需要更强的身份体系,不是加个反代能解决的

· 有等保或合规审计要求 → 可审计性要按 L2/L3 补齐,可能得走自建

· 只是自己一个人用 → 大部分检查可以简化,重点放在备份和默认口令上

· 完全没有运维人力 → 自托管的隐性成本会超过 SaaS

写这篇最想留下的一句话是:**把 AI 助手接进内网,等于把一部分执行权交给了它。** 这不是保守,是这类系统和普通内部工具的本质差别——数据泄露是损失,执行权丢失是事故。默认口令改掉、暴露面收窄、重能力按需开关、依赖能追溯,这四件事做完之前,它不该出现在生产网络的拓扑图里。

你们公司有没有在内网跑 AI 助手?权限和审计这块是怎么做的?评论区聊聊。


注:本文涉及 Octop 的数据均为 2026-10-03 通过 GitHub API 与 PyPI 实查(star 6406 / open issues 745 / 最新 v1.0.2b5;octop-harness、octop-gateway、octop-memory、octop-browser 于 2026-09-24 开源,均为 MIT)。项目处于快速迭代期,Nginx 与 compose 配置需按自身环境调整,具体配置项以官方文档为准。

本文来源于互联网,如有侵权,请联系作者删除

谢谢关注!

相关学习资料