JumpServer 部署实战:三步搭好开箱即用的开源堡垒机
凌晨两点,报警群突然炸了。核心业务服务器宕机,生产环境一片红灯,而唯一掌握 root 密码的同事,此刻正在十万八千里外的海岛度假。是不是隔着屏幕都能感到窒息?这几乎是每一支运维团队的噩梦——服务器的命脉,握在个别人手里。
JumpServer 就是为解决这类问题而生的开源特权访问管理(PAM)平台。它能让你和你的团队通过浏览器安全地访问 SSH、RDP、Kubernetes、数据库和 RemoteApp 资源,账号密码不再散落在个人笔记里,每次登录都有审计、有录屏、有权限控制。更妙的是,它自带一套 Ansible 自动化引擎,装好之后还能替你自动巡检资产、批量改密。
这篇文章就带你从零动手,把 JumpServer 部署起来。全程照着敲命令就能跑通,读完你会有三样收获:一个能登录的堡垒机、一个被它管理的真实服务器、以及一套可以搬进生产环境的配置思路。
别慌,先搞懂 JumpServer 是干什么的
先花一分钟建立认知。JumpServer 的核心思路很简单:所有人都别直连服务器,统一走它这一道门。你登录 JumpServer,再从它的网页终端里连目标机器,所有操作都会被记录。
它由多个组件协同工作,各自负责不同协议:
| 组件 | 职责 | 一句话解释 |
|---|---|---|
| Lina | Web 用户界面 | 你看到和操作的控制台 |
| Luna | Web 终端 | 浏览器里的 SSH 窗口 |
| KoKo | 字符协议连接器 | 接管 SSH / Telnet 连接 |
| Lion | 图形协议连接器 | 接管 RDP / VNC 图形会话 |
| Chen | Web 数据库工具 | 浏览器里直接连数据库 |
| Tinker | 远程应用连接器 | 发布 Windows 应用 |
你不用关心它们怎么协同,只需知道:装一个 JumpServer,就等于同时拥有了上面这些能力。相关代码组织在项目的 apps/ 目录下,每个组件对应一个子模块,结构非常清晰。
三分钟起跑:先让堡垒机跑起来
实践出真知。我们先装一个最小可用版本,让你立刻看到成果,再去考虑生产环境的那些讲究。
环境清单
先确认你的机器满足最低要求:
| 配置项 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | CentOS 7 / Ubuntu 20.04 | 64 位 Linux 发行版 |
| CPU | 2 核 | 4 核 |
| 内存 | 4 GB | 8 GB |
| 磁盘 | 50 GB SSD | 100 GB SSD |
| Python | 3.9+ | 3.10+ |
| Redis | 任一可用版本 | 6.0+ |
注意:Redis 是必需项,JumpServer 的任务调度和 WebSocket 都要靠它。PostgreSQL 我们先用 SQLite 顶替,Demo 阶段完全够用。
第一步:拉取代码并生成配置
git clone https://gitcode.com/GitHub_Trending/ju/jumpserver
cd jumpserver
# 用项目自带的模板生成配置文件
cp config_example.yml config.yml
config_example.yml 是官方精心写好的配置模板,每一项都有中文注释,非常贴心。复制一份出来,我们只需要改极少几个地方。
第二步:填写三个关键值
生成一个 49 位随机字符串作为加密密钥:
cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49; echo
然后编辑 config.yml,找到对应位置填进去:
# 加密密钥,生产环境务必使用随机字符串
SECRET_KEY: 上面命令生成的随机串
# 预共享令牌,各组件注册服务账号时使用
BOOTSTRAP_TOKEN: 再生成一个随机串
# Demo 阶段用单文件 SQLite,最省事
DB_ENGINE: sqlite3
DB_NAME: /opt/jumpserver/data/db.sqlite3
# Redis 保持默认,密码留空即可(本机单机场景)
REDIS_HOST: 127.0.0.1
REDIS_PORT: 6379
第三步:一键启动
项目自带服务控制工具 jms,一个命令搞定:
python jms start all -d
-d 表示后台守护进程方式运行。等几秒钟,检查一下状态:
python jms status
看到所有服务都是 running,恭喜你,堡垒机已经跑起来了。首次启动会自动完成数据库初始化、静态文件收集等一系列准备工作,你不需要手动执行任何迁移命令。
打开浏览器,访问 http://你的服务器IP:8080,用默认账号登录:
- 用户名:
admin - 密码:
ChangeMe
登录成功的这一刻,你就已经拥有一台完整的开源堡垒机了。是不是比想象中快得多?
第一次登录:改密码,加一道 MFA 锁
第一次登录后,系统会强制你修改默认密码。这一步千万别偷懒跳过——默认密码 admin / ChangeMe 是全网公开的,不修改等于把大门钥匙挂在门口。
改完密码后,建议立刻开启手机验证器(MFA)。在个人中心找到"设置手机验证器",用身份验证器 App 扫描二维码完成绑定。以后每次登录除了密码,还要填一个动态验证码。
多花这三十秒,你的 JumpServer 部署就从"能用"升级成了"敢用"。
把第一台服务器交给 JumpServer 打理
堡垒机装好了,现在让它真正干活。在控制台里新建一台 Linux 资产,填上 IP、协议、端口、账号密码,保存后点击"测试连接"。
你会看到结果瞬间返回。如果一切正常,点击"连接",一个网页版 SSH 终端就弹出来了。你在这台终端里敲的每个命令,都会被完整录制,随时可以回放审计。
试试用 mysql 或 psql 客户端连接数据库资产、用 Luna 开一个图形化 RDP 会话——你会发现原来需要装一堆客户端软件的事情,现在浏览器全搞定了。
它到底怎么替你干活?一页纸看懂自动化引擎
连接资产只是开始,JumpServer 真正的杀手锏,是内置的 Ansible 自动化能力。你可以在"任务管理"里创建周期性的资产巡检、密码修改、账号收集任务,让堡垒机定时自动执行。
这一切的入口,定义在 apps/ops/ansible/interface.py:
class RunnerInterface:
def run(self, **kwargs):
runner = self.get_runner_type()(**kwargs)
return runner.run()
别被这短短几行唬住,背后的流程是这样的:
- 你在界面上点"执行任务"
- 任务被投递到名为
ansible的专用队列(Celery) - 队列里的执行器读取资产信息和认证凭据
- Ansible 运行器远程连接目标机器执行 playbook
- 每一步执行结果通过事件回调实时回传界面
比如项目 apps/assets/tasks/ping.py 里的连通性检查任务,就是用这种方式实现的:
@shared_task(queue='ansible', ignore_result=True)
def ping_asset(asset_id, account_id=None):
...
do_ping(asset, account=account)
任务队列单独隔离,意味着自动化巡检不会拖慢核心业务。生产环境还可以开启"Ansible 执行隔离"(对应 apps/ops/ansible/docker.py 中的 ANSIBLE_DOCKER_ENABLED 配置),让自动化任务跑在独立容器里,跟主服务物理隔离,安全性再上一个台阶。
从试用走向生产:配置文件这样改更稳
Demo 跑通了,接下来把配置升级到生产级。核心改动有三处。
1. 换用 PostgreSQL
SQLite 适合单机尝鲜,生产环境请务必换 PostgreSQL。先在 config.yml 里改数据库配置:
DB_ENGINE: postgresql
DB_HOST: 127.0.0.1
DB_PORT: 5432
DB_USER: jumpserver
DB_PASSWORD: 你的数据库密码
DB_NAME: jumpserver
2. 设置合理的超时与日志
config_example.yml 里预置了一批生产可用的超时参数,按需打开注释即可:
# 日志级别,生产建议 INFO
LOG_LEVEL: INFO
# Ansible 单批次超时(秒)
ANSIBLE_RUNNER_JOB_TIMEOUT: 1800
# 连续无输出判定卡死(秒)
ANSIBLE_RUNNER_IDLE_TIMEOUT: 900
3. 开启密码保险箱
JumpServer 内置 OpenBao 作为 Vault 后端,可以把所有资产密码统一加密保管:
VAULT_ENABLED: true
VAULT_BACKEND: openbao
VAULT_OPENBAO_ADDR: http://openbao:8200
开启后,即使数据库被攻破,攻击者拿到的也是一堆密文。
多环境怎么管?
生产、测试、开发三套环境,不用维护三份配置文件。config.yml 中所有敏感值都支持用环境变量覆盖,配合 CI/CD 在部署阶段注入即可,代码仓库里只保留模板。
验收清单:照着勾,全部打勾才算数
部署是不是真的成功了?用下面这份清单逐项验收:
- 浏览器能正常打开
http://IP:8080并出现登录页 - 使用
admin登录成功,且已强制修改初始密码 - 已绑定手机验证器,重启浏览器后能正常二次验证登录
- 成功添加至少一台 Linux 资产,且"测试连接"返回成功
- 通过网页终端打开 SSH 会话,敲几个命令验证流畅度
- 会话结束后,在"审计"里能找到对应录像记录
- 成功创建一个定时任务(如每周资产连通性巡检)并手动触发一次
- 生产环境已切换到 PostgreSQL,并确认重启后数据不丢失
全部勾上,你的 JumpServer 部署才算真正交付。
踩坑地图:新手最容易翻车的 5 个地方
即使照着步骤走,也会遇到一些拦路虎。我把高频问题整理成了快速修复表:
| 症状 | 常见原因 | 快速修复 |
|---|---|---|
| 访问 8080 打不开 | 防火墙未放行 / 端口被占用 | firewall-cmd --add-port=8080/tcp 或检查 ss -lntp |
| 启动时报数据库连接失败 | 数据库未启动或密码错误 | 确认服务运行中,核对 config.yml 中的账号密码 |
| 首次启动反复重启 | SECRET_KEY / BOOTSTRAP_TOKEN 为空 | 用 cat /dev/urandom 命令重新生成并填写 |
| 任务执行报权限不足 | 目标机器的 sudo 未配置免密 | 在目标机配置 username ALL=(ALL) NOPASSWD: ALL |
| 开启执行隔离后任务失败 | Ansible 执行镜像未拉取 | 在 worker 节点执行 docker pull jumpserver/ansible-executor:latest |
排查日志是最快的定位手段,日志默认输出到应用日志目录,遇到问题先 tail 日志再看别的。
写在最后:下一步往哪走
到这里,你已经完成了 JumpServer 的从零部署、首次配置、资产纳管和自动化任务设置,比"照着文档装好"更进一步——你已经理解了它内部是怎么转起来的。
接下来你可以按需深入:
- 学习更多配置项,项目根目录的
config_example.yml本身就是最好的中文手册 - 研究自动化模块源码,起点是
apps/ops/ansible/,从interface.py往下读 - 给你的运维团队制定接入规范,把账号收敛、权限最小化落到制度上
- 定期用
utils/backup_db.sh备份数据库,并加入 crontab 定时执行
服务器密码不应该只存在于某个人的记忆里。从这次 JumpServer 部署开始,把对服务器的控制权,稳稳地交到平台和制度手里。动手吧,五分钟后就有一个属于你的堡垒机在跑了。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





