
简介开源堡垒机系统 2.28.21 版本完整源码包面向运维工程师、安全审计人员及计算机专业毕业设计开发者用于构建集中化运维审计平台解决远程访问管控、权限隔离、操作留痕等核心问题。压缩包共1565个文件大小4.63MB主体为1213个Python源码文件配合67个JavaScript、58个HTML、43个CSS等Web前端资源以及Shell部署脚本、YAML配置、Dockerfile、SQL初始化脚本与说明文档目录结构完整可支撑从源码阅读到快速部署的全流程学习。包内含多协议支持、双因素认证、会话录制、RBAC权限管控等模块级实现适合作为毕业设计论文的案例源码也便于在企业建站或内部运维体系中落地使用。目前已有272人学习下载无论是入门理解堡垒机原理还是二次开发安全运维系统都能从中获得可运行的工程参考和清晰的扩展路径。1. 为什么是 Jumpserver v2.28.21堡垒机的核心逻辑与版本选择一个很常见的场景公司里十几台 Linux 服务器开发、测试、运维共用一个 root 密码某天生产库被rm -rf误删所有人互相甩锅最终翻日志只看到登录 IP 是那台跳板机。这种时候需要的不是一个跳板机而是一台能“记住每个人做了什么”的堡垒机。Jumpserver 做的事就是把 SSH、RDP、VNC 的访问收口到统一入口用户不直接碰目标服务器密码而是先登录 Jumpserver再按授权规则选择资产连接全程操作有录制、命令有审计、权限可控。v2.28.21 是 2.x 系列里很典型的稳定版本Core、Koko、Luna/Lina、Guacamole 这几个组件拆得清楚配置文件逻辑和后续版本基本一致适合作为学习基线也适合直接在中小规模生产环境落地。对运维来说是审计刚需对做毕业设计或者研究运维系统的人来说这套源码结构足够撑起一篇完整的论文。2. 部署前准备源码包结构、依赖组件与配置文件解析2.1 解压后你会看到什么前端备份文件与 redis.conf 的真实用途拿到Jumpserver开源堡垒机 v2.28.21.zip解压后是一个jumpserver-2.28.21目录里面是 Core 源码和一部分发行静态资源。第一次打开目录时容易被那些 css 文件搞混bootstrap.min.css、style.css、animate.css看起来像一个纯前端项目实际上这些文件是从 Luna/Lina 构建后拷贝出来的 Web 静态资源交给 Django 模板使用。datatables.min.css.bak是旧版数据表格样式的备份升级或定制界面时用来回滚font-awesome.min.css和datepicker3.css是 UI 组件样式ambiance.css是 CodeMirror 编辑器的深色主题对应 Web 终端里的代码高亮。真正需要认真看的是redis.conf。这个文件并不是 Jumpserver 直接读取的而是给系统 Redis 服务使用的建议配置里面会有maxmemory 128mb、appendonly no、daemonize yes等参数。Jumpserver 本身通过环境变量里的REDIS_HOST、REDIS_PORT、REDIS_PASSWORD去连接 Redis所以改完redis.conf后必须同步修改 Jumpserver 的.env配置否则启动 Core 时会报认证失败。包里还有一份说明.htm内容偏向“照着敲命令”没有解释组件间的协作关系部署时建议结合官方文档一起看。2.2 组件架构与端口规划core、Koko、Guacamole、Luna/Lina 各自负责什么v2.28.21 是前后端分离加多组件结构但没有到微服务那么重每个组件就是一个独立进程。部署前先理清端口和职责不然排查问题时会不知道日志去哪看。组件技术栈默认端口职责CorePython / Django8080提供 REST API、权限判断、审计日志入库、任务调度KokoGo2222处理 SSH 代理把用户连接转发到目标资产录制 shell 会话GuacamoleJava / Tomcat8081处理 RDP、VNC 协议代理 Windows 和图形界面资产Luna前端静态资源由 Nginx 托管Web 终端页面依赖 WebSocket 连接 KokoLinaVue 静态资源由 Nginx 托管管理后台 UI对应/ui/路径Redis-6379Core 的缓存、Celery 消息队列、会话状态存储MySQL-3306持久化用户、资产、授权规则、审计日志这里有一个常见选型注意点Koko 是 Go 编译好的二进制不需要装 Go 工具链Guacamole 需要 Java 8 以上。Core 对 Python 版本比较敏感老旧版本在 3.10 以上会遇到部分 Python 包需要额外编译依赖的问题我一般会先装好python3-dev、libssl-dev、libffi-dev再装 Python 依赖。如果机器内存小于 4GB不要同时启用全部组件否则 Guacamole 和 MySQL 很容易 OOM。2.3 配置文件解析从 redis.conf 到 .env 环境变量的映射redis.conf里有几个关键参数daemonize yes表示 Redis 后台运行requirepass设置认证密码maxmemory-policy allkeys-lru控制内存淘汰策略。如果给 Redis 设置了密码Jumpserver 的系统环境变量必须同步修改# Jumpserver 的 .env 中 Redis 连接配置 REDIS_HOST127.0.0.1 REDIS_PORT6379 REDIS_PASSWORDJmsRedis2024 REDIS_DB0这段配置里Django 的 cache 和 Celery broker 都会读取REDIS_HOST和REDIS_PORTREDIS_PASSWORD为空时连接串不带密码一旦 Redis 设置了requirepass这里必须填写对应密码否则 Core 日志会反复出现Authentication required。REDIS_DB建议单独规划比如0给 cache、1给 celery task避免 key 冲突导致会话状态错乱。3. 一步步安装部署 Jumpserver v2.28.21数据库初始化、Nginx 反代与服务启动3.1 基础环境准备创建专用用户并安装编译依赖不建议直接用 root 跑 Jumpserver虽然安装脚本支持 root但后续升级和备份都会因为权限问题变得别扭。我一般先建一个jumpserver用户再把源码包放到/opt下。以 Ubuntu 22.04 为例sudo useradd -r -s /bin/bash -d /opt/jumpserver jumpserver sudo apt update sudo apt install -y git python3-pip python3-venv python3-dev \ libmysqlclient-dev libssl-dev libffi-dev make gcc \ nginx redis-server mysql-server这里-r表示创建系统用户-d指定 home 目录为/opt/jumpserverpython3-dev是编译部分 C 扩展的必需头文件libmysqlclient-dev是为了让 Python 的mysqlclient库能编译成功。redis-server和mysql-server在测试环境可以直接用 apt 安装生产环境建议使用独立实例或云数据库方便单独做监控和备份。3.2 解压源码、建立虚拟环境与安装 Python 依赖把 zip 包放到/opt后解压并做目录整理cd /opt unzip Jumpserver开源堡垒机\ v2.28.21.zip mv jumpserver-2.28.21 /opt/jumpserver chown -R jumpserver:jumpserver /opt/jumpserver sudo -u jumpserver -H bash -c cd /opt/jumpserver python3 -m venv venv source venv/bin/activate pip install -U pip pip install -r requirements.txt逻辑说明python3 -m venv venv创建一个独立虚拟环境避免把依赖装进系统 Pythonsudo -u jumpserver -H是让后续命令以jumpserver用户身份执行保持文件归属统一。requirements.txt里锁定了核心依赖版本如果 Python 版本偏高导致安装失败常见做法是先升级pip setuptools wheel再逐个安装报错的包。整个过程在 8C16G 机器上约 5 到 10 分钟网络差时会更久安装完成后source venv/bin/activate进入环境后续manage.py命令都依赖这个环境。3.3 MySQL 与 Redis 初始化建库、授权和基础参数调整在 MySQL 里创建一个专用库名和账号字符集必须用utf8mb4因为运维人员填写的备注、资产名可能包含中文或 emojiCREATE DATABASE IF NOT EXISTS jumpserver DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER jumpserverlocalhost IDENTIFIED BY JmsDB2024; GRANT ALL PRIVILEGES ON jumpserver.* TO jumpserverlocalhost; FLUSH PRIVILEGES;注意jumpserverlocalhost只允许本机登录如果 MySQL 单独部署在另一台机器需要改成jumpserver%并限制来源 IP。Redis 部分修改/etc/redis/redis.conf里的bind和requirepass然后重启systemctl restart redis-server redis-cli -a JmsRedis2024 pingredis-cli -a后面跟密码返回PONG说明 Redis 可正常认证。这里要提醒一下不要使用无密码 Redis更不要把bind 0.0.0.0暴露到公网否则堡垒机所在的机器会成为跳板。3.4 首次配置、数据库迁移与启动验证进入工程目录复制配置模板cd /opt/jumpserver cp config_example.yml .config.yml打开.config.yml修改关键项SECRET_KEY: 请换成随机生成的512位字符串 BOOTSTRAP_TOKEN: 请换成随机字符串 LOG_LEVEL: WARNING DB_ENGINE: mysql DB_HOST: 127.0.0.1 DB_PORT: 3306 DB_NAME: jumpserver DB_USER: jumpserver DB_PASSWORD: JmsDB2024 REDIS_HOST: 127.0.0.1 REDIS_PORT: 6379 REDIS_PASSWORD: JmsRedis2024SECRET_KEY是 Django 签名和加密用的泄露会影响账号和会话安全BOOTSTRAP_TOKEN用于 Core 与 Koko 之间的内部认证两边不一致会导致 Web 终端连不上。配置完成后执行数据库迁移source venv/bin/activate python3 manage.py makemigrations python3 manage.py migrate python3 manage.py collectstatic --noinput三个命令分别生成迁移文件、将模型同步到 MySQL、把静态文件收集到统一目录。然后启动服务并检查状态./jms start ./jms status看到Core: RUNNING、Koko: RUNNING说明核心进程已拉起。接入 Nginx 时需要注意 WebSocket 的反代server { listen 80; server_name _; client_max_body_size 100m; location /ui/ { proxy_pass http://127.0.0.1:8080/ui/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /ws/ { proxy_pass http://127.0.0.1:8080/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }/ws/是 Web 终端的核心通道不带Upgrade和Connection头时浏览器会卡在“连接中”。/ui/指向前端管理后台其余 API 请求都代理到 Core。全部就绪后浏览器访问http://服务器IP默认账号admin、密码admin首次登录会强制重置密码到这里最小可用的堡垒机就上线了。4. 功能配置实战RBAC 权限、MFA 双因素、会话录制与资产管理4.1 用户与资产模型把“账号密码”从人手中拿回来Jumpserver 的权限模型是“用户-资产-系统用户”三元组。用户是登录堡垒机的人资产是目标服务器系统用户是目标服务器上的账号比如root、deploy。运维不需要知道目标服务器密码只需要在授权规则里指定“哪个人可以使用哪个系统用户访问哪些资产”。在 Web 界面创建资产时可以使用管理员托管密码也可以让用户首次连接时自己填前者适合统一管理后者适合密码频繁变动的场景。如果目标是 MySQL 这类数据库资产系统用户也可以配成数据库账号DBeaver 这类桌面客户端通过 Koko 的 SSH 隧道连接内网数据库登录信息完全由堡垒机托管外网永远接触不到真实数据库地址。对应到 API 层创建一个授权规则的 Python 示例import requests api_url http://127.0.0.1:8080/api/v1/perms/asset-permissions/ headers { Authorization: Bearer 访问令牌, Content-Type: application/json, } payload { name: dev-group-standard, users: [d5c1a2...用户UUID], assets: [a3f9e8...资产UUID], system_users: [e1b0c3...系统用户UUID], is_active: True, actions: [connect, upload_file, download_file], } resp requests.post(api_url, jsonpayload, headersheaders, timeout10) print(resp.json())参数说明users、assets、system_users需要传对应资源在 Jumpserver 里的 UUID而不是用户名和 IPactions列表控制连接后能做什么connect是允许登录upload_file/download_file对应 SFTP 上传下载clipboard_copy/clipboard_paste控制剪贴板。生产环境里我习惯把delete_file和rename_file从默认动作里移除防止通过 SFTP 误删服务器文件。4.2 开启 MFA 动态口令登录时不只靠密码v2.28.21 支持 OTP、短信、邮件等多种二次认证方式。最省事的是 OTP在用户详情页点击“启用 MFA”用户首次登录时会看到二维码用 Google Authenticator 或 1Password 绑定即可。在“安全设置”里还可以要求全员强制开启{ SECURITY_MFA_AUTH: true, SECURITY_MFA_FORCE: true, SECURITY_COMMAND_EXECUTION: false }SECURITY_MFA_AUTH控制系统是否允许开启 MFASECURITY_MFA_FORCE设为true后新用户在完成首次登录后会被引导强制绑定 MFA未绑定无法继续使用。SECURITY_COMMAND_EXECUTION控制 Web 终端里是否允许向资产发送命令如果堡垒机只用于审计和查看可以关闭以减少误操作面。需要留意的是强制 MFA 后如果用户手机丢失需要管理员在用户列表里重置其 MFA 状态否则该用户会被锁在登录之外。4.3 会话录制文件落在哪里、如何回放与归档SSH 会话录制由 Koko 负责默认存储路径是/opt/jumpserver/data/media/replay/{资产ID}/{会话ID}.replay.jsonRDP/VNC 会话由 Guacamole 录制产物是 H.264 视频加 JSON 索引文件。Web 界面的“会话记录”可以直接回放但生产环境建议把录像集中归档到 S3 或 NFS避免本地磁盘被录屏耗尽ARCHIVE_ENABLED: true ARCHIVE_MODE: s3 ARCHIVE_S3_BUCKET: jumpserver-audit ARCHIVE_S3_ENDPOINT: https://s3.example.com ARCHIVE_S3_ACCESS_KEY: AccessKey ARCHIVE_S3_SECRET_KEY: SecretKeyARCHIVE_ENABLED只决定是否开启归档录像仍会先写本地再由异步任务上传 S3S3 不可达时本地文件不会丢失但日志里会持续刷新archive failed。验证归档是否生效可以看回放页面地址是否从/media/replay/拉取视频如果 404 就去服务器检查对应.replay.json是否存在问题通常出在 Nginx 没有暴露/media/目录的访问权限。4.4 权限管控细节命令过滤器和资产标签对 Linux 资产Jumpserver 支持命令过滤器会拦截 Web 终端和 Koko 代理会话里的危险命令。比如创建名为“禁止危险操作”的过滤器正则写^(rm|mkfs|shutdown|reboot)\s并关联到指定授权规则{ name: 禁危险命令, priority: 10, cmd_filter_rules: [ { type: regex, pattern: ^(rm|mkfs|shutdown|reboot)\\s, action: deny } ] }priority控制过滤器的优先级数字越小越先匹配action设为deny时命令匹配后会被拒绝执行并记录一条审计事件。需要注意命令过滤器只对走 Jumpserver 的会话生效如果用户直接用 SSH 客户端连目标服务器就完全绕过了堡垒机网络层必须限制目标服务器只接受来自堡垒机的 SSH 连接。资产标签是另一层手段给服务器打上web-prod、db-prod标签后授权规则可以按标签选择资产新增服务器只要打上对应标签就会自动纳入已有授权避免一条条手动勾选。5. 常见故障排查与审计数据的进阶利用5.1 部署和运维中容易踩的坑现象可能原因解决路径启动后 8080 端口不通Core 启动失败cd /opt/jumpserver ./jms status再tail -n 50 logs/jumpserver.logWeb 终端连接后立刻断开BOOTSTRAP_TOKEN不一致检查所有组件是否读取同一份.config.yml登录报authentication requiredRedis 密码没同步修改redis.conf的requirepass时同步更新.env的REDIS_PASSWORD文件上传下载报错Nginx 上传大小限制在 server 块加client_max_body_size 100m录像回放黑屏Guacamole 时区或编码问题统一服务器时区为Asia/Shanghai并确认 RDP 资产支持 H.2645.2 把审计日志交给 Elasticsearch数据库备份与长期检索堡垒机的价值往往在问题发生之后如果审计日志只在 MySQL 里保留 30 天等需要追责时数据已经清了。常见做法是把会话日志同步到 Elasticsearch用 Kibana 做检索# 配置示例 LOG_SYNCtrue LOG_SYNC_HOST10.0.0.5 LOG_SYNC_PORT9200 LOG_SYNC_INDEXjumpserver-aduit-%Y.%m.%d开启后 Koko 每收到一条命令都会推送到 ES按天建立索引。查询某个用户在特定时间段内执行过哪些命令时Kibana 做term查询的速度远快于 SQLlike。如果暂时没有 ES也可以每天把data/media/replay和 MySQL 的audits_log表打包备份0 2 * * * mysqldump -ujumpserver -pJmsDB2024 --databases jumpserver | gzip /backup/jumpserver_$(date \%F).sql.gz这条 crontab 命令每天凌晨两点执行全量 dump按日期命名压缩归档恢复时用gunzip 文件 | mysql -ujumpserver -p导回即可。要注意备份数据库不等于完整备份录像文件需要额外做增量同步否则日后只能看到“某用户在某时间执行了删除命令”却无法还原当时的终端画面。本文还有配套的精品资源点击获取