把「谁能连哪台机器、能用哪个账号、能敲什么命令」全管住的开源运维堡垒机
中文 · English
很高兴认识你,陌生人! 我是一名初二学生,在中国新疆读初中。英语和写的代码都还在慢慢练, 这份项目说明里要是有写得不够好的地方,请大家多多谅解,也欢迎直接指正。
Nice to meet you, stranger! I'm an eighth-grade student in Xinjiang, China. My English and my code are still a work in progress — if anything in this project README reads awkwardly, please bear with me (and tell me if you can).
关于本项目:本仓库由人机协作开发 —— 需求、取舍与验收由人把关,代码由人和 AI 一起写, 一起跑门禁、一起做真机取证;仓库里既有手写的实现,也有 AI 参与的实现、重构与排障。 为了让人和 AI 都能快速接手,每个源文件的开头都有一段 AI 生成的文件简介,说明这个文件负责什么、 与哪些模块交互、有哪些容易踩的坑 —— 打开任何一个文件都能先看懂它,再决定要不要改。 覆盖范围(
bastion-backend/app、bastion-backend/tools、bastion-backend/tests、ant-design-pro/src/pages/bastion、ant-design-pro/src/components/Bastion、ant-design-pro/src/services/bastion,以及被本项目改造过的src/app.tsx、src/app.test.tsx) 实测 147 个文件 100% 覆盖;ant-design-pro上游模板残留页与语言包保持原样,未作改动。
- 身份与权限审计 — 用户、角色、主机、账号、授权逐条落库:谁能连哪台机器、用哪个账号、能开网页终端还是只能事后看录像,全部配得出来。
- 命令级策略管控 — 用正则与风险等级描述「什么能敲、什么不能敲」,高危命令可要求管理员当场二次确认;放行与拒绝都进审计。
- SSH 网关 —
ssh -p 2222 <堡垒机账号>@<IP>登录后是一个受管控的审计 shell,菜单只列有权限的主机,每条命令与输出都被记录。 - 网页终端(Linux / Windows) — 浏览器里直连 SSH 与 WinRM,不装本地客户端;WinRM 会话里
cls就地清屏、早期按键不丢。 - Windows 远程桌面(WebRDP) — 浏览器里开 RDP,含老系统(Server 2003 / XP)的强制 SSL 兜底;录像边录边传,窗口被强行关掉也不丢。
- SFTP 文件管理器 — 浏览、上传、下载、重命名、删除、改权限、打包下载,走和终端一样的授权与策略。
- AI 运维助手 — 自然语言下指令,按主机端点自动选通道(Linux 走 SSH、Windows 走 WinRM),敏感操作要管理员密码确认,工具调用全过程进审计。
- ComputerUse(让 AI 直接操作 Windows 主机) — 系统设置里分步部署:列华为云镜像的 Python 安装包并先缓存到堡垒机 → 传包静默安装 →
pip install windows-mcp→ 写开机自启 VBS 并启动 MCP → 开 portproxy 与只放行堡垒机的防火墙 → 探活;部署成功后,Windows RDP 控制台右侧才会出现可收起的 ComputerUse 侧边栏,AI 经 MCP 看屏幕、点鼠标、跑 PowerShell,每一步都进审计。
40+ 张实测截图都在
docs/screenshots/,下面「验证记录」里的每条实测都对应其中一张。
只需要 Python ≥ 3.11(开发用 3.13)与 Node ≥ 20(只在构建前端时用);数据全部落在本地文件,不依赖外部数据库。
# 1) 起后端:首次启动自动建库、生成三把密钥、创建管理员 admin / admin123
cd bastion-backend
python -m pip install -r requirements.txt
python run.py
# 2) 起前端(另开一个终端)
cd ant-design-pro
npm install
npm run dev # 开发模式 http://localhost:8000,/api 与 /socket.io 已代理到后端| 入口 | 地址 |
|---|---|
| 后台 Web UI | http://127.0.0.1:8000(生产:http://<服务器IP>:5000) |
| 后台 API / 健康检查 | http://127.0.0.1:5000/api/health |
| SSH 网关 | ssh -p 2222 <堡垒机账号>@<服务器IP> |
| 默认管理员 | admin / admin123(首次登录强制改密) |
没有 Linux 机器也能跑通全链路:
python tools/demo_ssh_target.py会起一个真实 SSH 协议栈的假 Linux(127.0.0.1:2200,账号root/s3cret),把它当资产加进来就能体验网页终端、SSH 网关、命令策略拦截与审计落库。生产构建用npm run build,产物dist/由后端同端口直服。
前置:Ubuntu 22.04+ / Debian 12+ / RHEL 9+、Python ≥ 3.11(开发用 3.13)、Node ≥ 20(只在构建前端时用)、放行 5000(Web/API)与 2222(SSH 网关)两个端口。建议单独建一个系统账号跑服务:
sudo useradd -r -m -d /opt/autoops -s /bin/bash bastion
sudo -iu bastion git clone git@github.com:sywdn-001/AutoOps.git /opt/autoops/app① 后端依赖(虚拟环境)
cd /opt/autoops/app/bastion-backend
python3 -m venv .venv
.venv/bin/python -m pip install -U pip
.venv/bin/python -m pip install -r requirements.txt② 前端构建(产物由后端同端口直服,不需要额外的 Web 服务器)
cd /opt/autoops/app/ant-design-pro
npm ci
npm run build # 产物 dist/,后端启动时自动挂载③ 生产配置(环境变量,写进 systemd 单元或 /etc/autoops.env)
| 变量 | 默认 | 说明 |
|---|---|---|
BASTION_HOST / BASTION_PORT |
0.0.0.0 / 5000 |
Web 与 API 监听地址、端口 |
BASTION_GATEWAY_HOST / BASTION_GATEWAY_PORT |
0.0.0.0 / 2222 |
SSH 网关监听地址、端口(BASTION_GATEWAY_ENABLED=0 关掉整条网关) |
BASTION_ADMIN_USERNAME / BASTION_ADMIN_PASSWORD |
admin / admin123 |
首次启动创建的管理员,上线前必须改(登录后也会强制改密) |
BASTION_INSTANCE_DIR |
bastion-backend/instance |
数据目录:SQLite 库、三把密钥、会话录像都落这里 |
BASTION_DB_URI |
sqlite:///<INSTANCE_DIR>/bastion.db |
换成 PostgreSQL 等外部库时改这里(需自备驱动) |
BASTION_SECRET_KEY / BASTION_JWT_SECRET / BASTION_FERNET_KEY |
首次启动随机生成并落盘 | 会话签名、JWT、资产口令加密;多实例部署必须显式给同一组值 |
BASTION_SERVE_FRONTEND / BASTION_FRONTEND_DIST |
1 / 自动找 ant-design-pro/dist |
关掉前端直服,或指定别处的构建产物 |
BASTION_TOKEN_HOURS |
12 |
登录令牌有效期(小时) |
BASTION_LOGIN_MAX_FAILURES / BASTION_LOGIN_LOCK_MINUTES |
5 / 15 |
连续登录失败锁定策略 |
BASTION_SESSION_IDLE_TIMEOUT |
1800 |
会话空闲上限(秒) |
BASTION_COMMAND_TIMEOUT / BASTION_MAX_OUTPUT_BYTES |
60 / 262144 |
单条命令超时与输出截断 |
BASTION_GATEWAY_MAX_SESSIONS |
5 |
单用户网关并发会话上限 |
DEEPSEEK_API_KEY / DEEPSEEK_BASE_URL / AI_MODEL |
空 / https://api.deepseek.com / deepseek-flash |
AI 运维助手的模型凭据(AI_ENABLED=0 整体关闭) |
BASTION_CORS_ORIGINS |
* |
前后端分离部署时收紧到前端域名 |
④ systemd 常驻(/etc/systemd/system/autoops.service)
[Unit]
Description=AutoOps Bastion
After=network-online.target
[Service]
User=bastion
WorkingDirectory=/opt/autoops/app/bastion-backend
EnvironmentFile=/etc/autoops.env
ExecStart=/opt/autoops/app/bastion-backend/.venv/bin/python run.py --host 0.0.0.0 --port 5000 --gateway-port 2222
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now autoops
sudo systemctl status autoops
curl -fsS http://127.0.0.1:5000/api/health # {"success":true,...}⑤ 上线后必做的三件事
- 浏览器打开
http://<服务器IP>:5000,用初始管理员登录 → 立刻改密(登录后强制)。 - 「系统设置 → 系统参数」按需收紧并发数、空闲超时、命令超时;「身份与权限」给运维建角色与授权,不要日常拿超管账号干活。
- 备份只备份两样:
$BASTION_INSTANCE_DIR(SQLite + 三把密钥 + 录像)与.env里的BASTION_SECRET_KEY/BASTION_JWT_SECRET/BASTION_FERNET_KEY。密钥丢了,已存的资产口令就解不开。
⑥ 升级
cd /opt/autoops/app
git pull
cd bastion-backend && .venv/bin/python -m pip install -r requirements.txt
cd ../ant-design-pro && npm ci && npm run build
sudo systemctl restart autoops数据库表结构由 ensure_schema() 在启动时只加不减地对齐(含「一台主机多协议」的端点回填),不写迁移脚本也不会丢数据。
⑦ HTTPS 反代(可选,推荐;必须透传 WebSocket,网页终端靠它)
server {
listen 443 ssl http2;
server_name bastion.example.com;
ssl_certificate /etc/letsencrypt/live/bastion.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bastion.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 3600s; # 网页终端是长连接
}
}SSH 网关不是 HTTP,用户直接 ssh -p 2222 <账号>@<服务器IP>;想走标准 22 端口,就用防火墙/端口转发把 22 转给 2222。
⑧ Windows 免安装包(目标机不想装 Python / Node 时)
推一个 v* tag,GitHub Actions 会自动发正式 Release;推 Dev 分支也会自动出一版「Dev 分支夜间构建(Nightly Build)」预发布——版本号在候选版号后带 RC 与日期/运行号(形如 v1.1.1-RC-nightly.20261016.42,每次都是新 tag),Release 标题、说明横幅与包内 README-FIRST.txt 都写明「开发分支夜间构建,仅供体验新功能,请勿用于生产环境」。
两种发布都产出 Windows(Server) x64 / x32 各一份 onedir 免安装包(PyInstaller 打包、前端 dist/ 已内置、双击 start-autoops.bat 即用),并附上源码包 *-Source-Code.tar.gz 与 *-Source-Code.zip(按本次构建的提交导出)与 SHA256SUMS.txt;正式版还另附华为云镜像的 Python 3.15.0 x64/x32 安装包、阿里云镜像的 Node v26.11.1 x64 msi(夜间构建不重复挂这 150 MB,说明里指向最新正式版)。Release 说明中英双语(.github/workflows/release.yml)。
想在本机打一份:先建一个干净的 venv,不要在本机全局 Python 里打 —— PyInstaller 会给「当前环境里能导入的每个包」找 hook,全局环境能慢到十几分钟:
pwsh -File bastion-backend/packaging/build-local.ps1 -SkipFrontend -SmokeTest产物在 bastion-backend/build/dist/AutoOps-Bastion/;-Zip 顺手压成与 CI 同名的 zip,-SmokeTest 用 5080 端口 + 不开网关起一次服务打 /api/health(不碰你正在跑的 5000/2222)。
1)在浏览器里开一个被审计的终端 — 「网页终端」→ 选主机与账号 → 「连接」:窗口里敲的每条命令与输出都会落进审计。
$ whoami
opsadmin
$ cat /etc/shadow
⛔ 已按命令策略拦截:命中「禁止读取口令文件」规则(风险等级 high)2)从命令行走 SSH 网关 — 用堡垒机账号登录,菜单只列你有权限的主机:
ssh -p 2222 opsadmin@127.0.0.1
# 欢迎 opsadmin,可访问的主机:
# 1) e2e-demo-01 127.0.0.1:2200 Linux
# 选择主机 > 13)让 AI 助手代跑命令 — 「AI 运维」里用自然语言下指令;模型调 run_command 时按主机端点自动选通道,敏感操作要管理员密码确认:
> 看一下 win-75 的主机名和系统版本
[堡垒机] AI 请求执行 1 个敏感操作,需要管理员确认:run_command {"hostId": 5, ...}
管理员密码:********
WIN-930NKGJCOED
Microsoft Windows Server 2025 Datacenter4)校验审计链有没有被动过 — 命令、文件、AI 工具调用三类流水都带 prev_hash/entry_hash,离线重算即可发现篡改:
cd bastion-backend
python tools/verify_audit_chain.py
# 三类流水的哈希链逐条重算一致 → 校验通过| 层次 | 选型 |
|---|---|
| 后端 | Python 3.13 · Flask 3.1 · Flask-SQLAlchemy / SQLAlchemy 2.0 · Flask-JWT-Extended · Flask-SocketIO(threading + simple-websocket) |
| 连接层 | paramiko(SSH / SFTP)· pywinrm(WinRM)· 自研 RDP 网关(WebRDP,浏览器侧解码) |
| 前端 | React 19 · Ant Design 6 · Ant Design Pro 6 / Umi Max 4 · Biome · TypeScript strict · vitest |
| 存储 | SQLite(默认;BASTION_DB_URI 可换 PostgreSQL 等)· Fernet 加密资产口令 · 文件型会话录像 |
AutoOps/
├── bastion-backend/ # 后端:API + SSH 网关 + 网页终端 + AI 运维
│ ├── app/
│ │ ├── api/ # REST 蓝图(认证、资产、授权、策略、审计、终端、RDP…)
│ │ ├── gateway/ # SSH 网关(端口 2222 的审计 shell)
│ │ ├── webterm/ terminal/ # 网页终端(Socket.IO 事件 + 会话)
│ │ ├── files/ # SFTP 文件管理器(服务层 + 策略)
│ │ ├── rdp/ # WebRDP 网关与录像
│ │ ├── winrm/ # WinRM 字符会话(Windows 网页终端)
│ │ ├── ai/ # AI 运维助手(工具注册 + 模型客户端)
│ │ ├── models.py access.py session_service.py policy.py audit.py
│ │ └── schema_sync.py # 启动时「只加不减」地补齐表结构
│ ├── tests/ # 749 个用例 / 35 个文件
│ ├── tools/ # 演示目标机、四套联调脚本、审计链校验、README 配图生成器
│ └── instance/ # 运行时数据(SQLite、密钥、录像)——已在 .gitignore
├── ant-design-pro/ # 前端:Ant Design Pro 6 + Umi Max 4,业务页全部重写
│ └── src/pages/bastion/ # 堡垒机业务页(资产、终端、文件、远程桌面、审计…)
├── docs/
│ ├── 图文教程.md # 逐步配图的操作教程(中)
│ ├── 使用手册.md 审计与安全.md 需求对照.md 验证记录.md
│ ├── i18n/ # 英文:README.en.md、manual.en.md、tutorial.en.md
│ └── screenshots/ # 60+ 张实测截图(含 tutorial/ 教程配图)
├── LICENSE README.md
命令行参数(python run.py --help)
| 参数 | 默认 | 说明 |
|---|---|---|
--host / --port |
0.0.0.0 / 5000 |
Web 与 API 监听地址、端口 |
--gateway-host / --gateway-port |
0.0.0.0 / 2222 |
SSH 网关监听地址、端口 |
--no-gateway |
关 | 本次不启动 SSH 网关 |
--debug / --log-level |
关 / info |
调试模式与日志级别 |
--reset-admin |
— | 忘记管理员口令时重设(--reset-admin 后按提示输入) |
环境变量:生产部署(监听地址、密钥、锁策略、超时、AI 凭据等 20+ 项)见下方
部署到生产 §③ 的完整表格,变量名与默认值都取自 bastion-backend/app/config.py。
前端开发代理:config/proxy.ts 把 /api/ 与 /socket.io/(含 WebSocket)代理到 http://127.0.0.1:5000,后端不在本机时用 BASTION_API 覆盖:
set BASTION_API=http://192.168.1.10:5000 # Windows
export BASTION_API=http://192.168.1.10:5000 # Linux / macOS请用
npm run dev(MOCK=none)。模板自带的npm start会打开 Pro 的 mock 服务,把/api/currentUser、/api/login/account一类请求交给假数据。
- 上线前必须改掉初始管理员口令,并给运维人员建独立角色;日常不要拿超级管理员账号干活。
- 三把密钥(
BASTION_SECRET_KEY/BASTION_JWT_SECRET/BASTION_FERNET_KEY)与instance/目录就是全部家底:密钥丢了,已存的资产口令解不开;多实例部署必须显式给同一组值。 - 资产口令、私钥、口令短语都用 Fernet 加密落库,接口只在具备
host:manage权限时回显。 - 网页终端、文件管理器、AI 工具调用三类操作全部进审计;审计流水带哈希链,可用
tools/verify_audit_chain.py离线校验。 - 更多威胁模型与「超级管理员准入例外」的说明见 docs/审计与安全.md 与 docs/使用手册.md。
后端 793 个用例、前端 13 个文件 195 个单测,加上四套真机联调脚本:
cd bastion-backend && python -m pytest -q # 793 passed(35 个文件)
python tools/live_e2e_check.py # 97 项:HTTP + Socket.IO + SSH 网关 + SFTP + AI 端到端
python tools/ui_check.py # 21 项:真实 Chrome 逐路由巡检后台
python tools/console_check.py # 33 项:真实 Chrome 驱动网页终端与文件管理器
python tools/computeruse_check.py --host 5 # 9 项:ComputerUse 部署记录 + 侧边栏四个接口(加 --host 5 --account 5 --deploy 走完整 7 阶段)
cd ../ant-design-pro && npx biome check && npx tsc --noEmit && npx vitest runComputerUse 的侧边栏能不能用起来,取决于目标机上的 MCP 进程与那次登录会话:MCP 进程会随登录 会话注销而消失(此时探活如实报「连不上目标机的 MCP 服务」,脚本把工具清单/截图/PowerShell 三项标成 SKIP 并以非 0 退出);而进程活着但跑在没有桌面的会话里时,探活与 PowerShell 依然可用,只有截图与 界面自动化会失败(如实报
screen grab failed)。要拿桌面画面就用 RDP 登录目标机 —— StartUp 里的自启 脚本会把 MCP 接管到你的桌面会话,端口与侧边栏地址都不变。
逐条的验证记录(每条实测的判据、命令、结果与截图)见 docs/验证记录.md, 需求与扩展需求逐条对照见 docs/需求对照.md,使用流程见 docs/使用手册.md,审计数据流与安全须知见 docs/审计与安全.md。
从零上手看这篇:图文教程 —— 从起服务到纳管机器、授权、开终端、 看审计,每一步都配一张操作截图。
| 文档 | English | 内容 |
|---|---|---|
| docs/图文教程.md | tutorial.en.md | 逐步配图的操作教程 |
| docs/使用手册.md | manual.en.md | 每个页面的字段与操作说明 |
| docs/审计与安全.md | — | 审计数据流、哈希链、凭据与密钥处理 |
| docs/需求对照.md | — | 需求逐条对应到实现与验证 |
| docs/验证记录.md | — | 门禁与真机联调的实测记录(含截图取证) |
| docs/提交PR指南.md | pr-guide.en.md | 提 PR 之前看这篇:分支与提交信息、门禁怎么跑、说明怎么写、自检清单 |
| docs/提交Issue指南.md | issue-guide.en.md | 提 issue 之前看这篇:模板怎么填、环境与复现步骤写到什么程度 |
| Wiki 使用手册 | 中英同页 | 按主题拆开的 15 篇:安装部署、快速上手、资产与账号、身份与授权、策略、网页终端与文件、远程桌面与录像、SSH 网关、审计中心、AI 助手、系统设置、安全维护、升级备份、FAQ、故障排查 |
全部文档的索引见 docs/README.md;仓库英文介绍见 docs/i18n/README.en.md。
- Fork 后从
main切分支,提交信息用feat(scope): 说明/fix(scope): 说明。 - 提交前跑一遍:
cd bastion-backend && python -m pytest -q;改前端再跑npx biome check && npx tsc --noEmit && npm run build。 - 新增行为请同时补测试或联调脚本断言,PR 说明里附上实际输出(本仓库不接受「应该没问题」这类结论)。
- 准备提 PR 时先看 提交 PR 指南(中英双语:PR guide)—— 分支与提交信息、门禁怎么跑、说明四段式、哪些改动要先开 issue 商量,都在里面。
- 发现问题、想提建议或提问,先看 提交 Issue 指南(三个 issue 模板、环境与复现步骤该写什么都在里面)。
- 安全相关问题请走私下渠道,不要直接开公开 issue —— 支持版本、范围、处理时限与安全港见 SECURITY.md。










