JumpServer 开源 PAM 平台实战:一键部署、默认凭据与核心组件架构解析
【免费下载链接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.项目地址: https://gitcode.com/GitHub_Trending/ju/jumpserver
本文基于仓库中的 readmes/README.ko.md(JumpServer 韩文版项目说明)整理而成,并辅以仓库源码进行纵深验证。文章核心解决三个问题:JumpServer 作为开源特权访问管理(PAM)平台到底解决什么问题、如何在干净的 Linux 服务器上快速部署并完成首次登录、以及支撑 SSH/RDP/Kubernetes/数据库/远程应用访问的核心组件是如何分工协作的。读完本文,你将掌握 JumpServer 的最小可用部署流程、默认配置基线,以及从源码层面理解其“核心服务 + 多连接器”的架构组织方式。
JumpServer 是什么:面向 DevOps 与 IT 团队的开源 PAM 平台
按 readmes/README.ko.md 中的定义,JumpServer 是一个开源的特权访问管理(Privileged Access Management, PAM)平台,它为 DevOps 和 IT 团队提供通过 Web 浏览器按需、安全访问以下类型端点的能力:
- SSH:字符协议终端访问
- RDP:图形化远程桌面
- Kubernetes:容器编排集群
- 数据库:MySQL、PostgreSQL、Oracle、SQL Server 等多种数据库
- RemoteApp:远程应用程序
从仓库目录结构看,这一能力定位在源码层面有清晰的对应:apps/terminal 承载终端与会话相关能力,apps/assets 负责资产、节点、协议与平台管理,apps/perms 负责授权与权限控制,apps/acls 承载命令过滤、登录控制等访问控制策略,apps/audits 负责审计日志。可以说,一个 PAM 平台的“连接—授权—审计”闭环在这些 Django App 中一一对应。
仓库根目录的 README.md 与各语言版本(如 readmes/README.ko.md、readmes/README.zh-hans.md)保持同一信息骨架,本文以韩文版为绝对主体展开。
快速开始:在干净的 Linux 服务器上一键部署
硬件与系统要求
按 readmes/README.ko.md 的说明,快速部署前需要准备一台干净的 Linux 服务器,要求为:
- 64 位系统
- 内存 ≥ 4C8G(即至少 4 核 CPU、8GB 内存)
“干净”意味着建议使用全新的操作系统环境,避免已有服务(尤其是 8080/8070 等端口)与 JumpServer 冲突。
一键安装命令
在满足要求的服务器上,直接执行官方提供的一键脚本:
curl -sSL https://github.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash该命令会从 JumpServer 最新 Release 中下载quick_start.sh并以 bash 执行,自动完成依赖安装、镜像拉取与服务编排。
浏览器访问与默认凭据
安装完成后,在浏览器中访问:
http://your-jumpserver-ip/默认登录凭据为:
- 用户名:
admin - 密码:
ChangeMe
安全提示:这是安装后的首次登录凭据,登录后系统会要求修改初始密码,务必在生产环境第一时间更换,切勿保留默认密码。
一键脚本背后的源码逻辑
快速开始命令看似简单,但仓库源码揭示了其背后的服务控制机制。
容器镜像的入口是 entrypoint.sh:脚本接收action(默认start)与service(默认all)两个参数,先清理/opt/jumpserver/tmp/*.pid中的残留进程文件,然后执行python jms "${action}" "${service}"。它也支持bash/sh(进入容器 Shell)与sleep(长驻休眠,常用于调试)两种特殊动作。
而jms是真正的服务控制入口(见 jms),它:
- 设置
DJANGO_SETTINGS_MODULE=jumpserver.settings并完成 Django 初始化; - 从
apps/jumpserver/const.py读取版本号(VERSION),从 config_example.yml 复制生成的config.yml中加载用户配置(ConfigManager.load_user_config()); - 支持
start、stop、restart、status、upgrade_db、collect_static六种动作; - 支持
all、web、task、ai四类服务选择,其中web服务启动前会先执行prepare()准备流程。
prepare()是启动阶段的关键调用链(见 jms):
check_database_connection() # 轮询等待数据库可用(最多 60 次,每秒一次) upgrade_db() # collectstatic + migrate expire_caches() # 过期缓存清理 download_ip_db() # 下载 GeoLite2-City / ipipfree 地理 IP 库 install_builtin_applets() # 安装内置 applet(远程应用) init_oauth2_provider() # 初始化 OAuth2 Provider其中check_database_connection()会对默认数据库执行 Django 的check --database default,失败则每秒重试,最多 60 次后退出(退出码 10),这保证了容器编排中“数据库后启动”的场景也能自动恢复。download_ip_db()会按需下载 GeoIP 与 ipip 两个 IP 库到apps/common/utils/ip/下用于登录地识别。
从 Dockerfile 可以看到镜像对外暴露8080与8088端口,默认CMD ["start", "all"],即以start all方式启动全部核心服务。也就是说,一键脚本最终拉起的是一个完整的 JumpServer 容器栈,Web 服务监听在 8080 端口(配置项HTTP_LISTEN_PORT: 8080,见 config_example.yml),这也是浏览器访问http://your-jumpserver-ip/无需带端口的原因。
界面与能力概览:文档中的功能图谱
readmes/README.ko.md 通过一组界面截图展示了 JumpServer 的主要产品界面,对应功能模块包括:
- Console(控制台):资产管理、用户与权限管理的主界面
- PAM(特权访问管理):特权账号与访问治理视图
- Audits(审计):会话回放、操作日志与审计报表
- Workbench(工作台):用户日常使用的资产连接入口
- RBAC(基于角色的访问控制):细粒度角色与权限配置
- Settings(系统设置):认证、安全策略、消息通知等全局配置
- SSH / RDP / K8s / DB:分别对应字符终端、图形桌面、Kubernetes 集群与数据库的具体连接界面
这些截图反映的是产品功能的“面”,而仓库中 apps/terminal/connect_methods.py 的components()方法则从源码角度证实了各协议的承载组件——这正是下一节要展开的核心组件架构。
核心组件架构:一个核心,多个连接器
readmes/README.ko.md 明确指出:JumpServer 由多个关键组件组成,它们共同构成 JumpServer 的功能框架,为用户提供运维管理与安全控制的综合能力。下表继承原文档的组件清单(状态列中标注为 private 的组件属于企业版私有仓库,本文不讨论其发布状态):
| 项目 | 说明 |
|---|---|
| Lina | JumpServer Web UI(前端界面) |
| Luna | JumpServer Web 终端(网页终端前端) |
| KoKo | JumpServer 字符协议连接器(SSH/Telnet 等) |
| Lion | JumpServer 图形协议连接器(RDP/VNC) |
| Chen | JumpServer Web 数据库(浏览器内操作数据库) |
| Tinker | JumpServer 远程应用连接器(Windows) |
| Panda | JumpServer EE 远程应用连接器(Linux) |
| Razor | JumpServer EE RDP 代理连接器 |
| Magnus | JumpServer EE 数据库代理连接器 |
| Nec | JumpServer EE VNC 代理连接器 |
| Facelive | JumpServer EE 人脸识别 |
从源码验证组件分工
在 apps/terminal/connect_methods.py 的components()方法中,各连接器与协议的支持矩阵被显式声明,可以作为上表组件描述的源码级佐证:
- koko:支持
ssh、telnet、sftp、redis、mongodb、k8s、clickhouse、mysql、mariadb、sqlserver、postgresql、oracle等协议,提供web_cliWeb 方式;监听 HTTP/SSH/SFTP。 - chen:Web 数据库连接器,支持
mysql、postgresql、oracle、sqlserver、mariadb、db2、dameng,提供web_guiWeb 方式。 - lion:图形协议连接器,支持
rdp、vnc,提供web_guiWeb 方式。 - magnus:数据库代理连接器,支持
mysql、postgresql、oracle、mariadb、redis、sqlserver、mongodb。 - razor:RDP 代理连接器,仅支持
rdp。 - kael:面向 ChatGPT 类 AI 应用的连接器(
chatgpt协议)。 - nec:VNC 代理连接器,仅支持
vnc。
由此可见,架构上 JumpServer 采取“核心服务负责授权与审计编排,多个专用连接器按协议分流承载流量”的模式:字符类协议走 KoKo,图形类走 Lion/Razor,数据库走 Chen/Magnus,远程应用走 Tinker/Panda。这解释了为什么 README 中组件如此之多——每种协议族都有专门优化过的连接器。
连接方式的三类来源
同文件中的get_protocols_connect_methods()(apps/terminal/connect_methods.py)进一步显示,一个资产协议最终可用的连接方式由三类方法合并而成:
- Web 方式(
WebMethod):如web_gui、web_cli、web_sftp,由web_methods决定; - 原生客户端方式(
NativeClient):如 SSH Client、SFTP Client、mstsc(远程桌面)、DB Client 等,且各协议都有对应的client_limits约束(例如 KoKo 的 SSH 监听只拉起 SSH/Telnet 资产,SFTP 监听只拉起 SFTP 资产); - Applet / 虚拟应用方式(
AppletMethod/VirtualAppMethod):对应远程应用与虚拟应用,分别由 Tinker(监听 RDP)与 Panda(监听 HTTP)承载。
同时,get_user_allowed_connect_methods()(同文件 apps/terminal/connect_methods.py)会根据ConnectMethodACL(连接方式 ACL,见 apps/acls/models/connect_method.py)对用户可用的连接方式进行放行(accept)与禁用(reject)过滤,体现了 PAM 平台“细粒度控制用户以何种方式访问资产”的安全设计。
关键配置基线:config_example.yml 速览
部署后必然需要了解的配置集中在 config_example.yml。原文档虽未逐项列出,但作为快速上手必备,这里结合 apps/jumpserver/conf.py 中的Config.defaults默认值整理出最核心的一组:
| 配置项 | 默认值(conf.py) | 说明 |
|---|---|---|
SECRET_KEY | 空 | 加密密钥,生产环境必须改为随机字符串,可用cat /dev/urandom \| tr -dc A-Za-z0-9 \| head -c 49; echo生成 |
BOOTSTRAP_TOKEN | 空 | 预共享 Token,KoKo 与 Guacamole 等组件用它注册服务账号 |
DEBUG | False | 生产环境保持关闭 |
DB_ENGINE | mysql | 支持 sqlite3、mysql、postgres 等 |
DB_HOST/DB_PORT/DB_USER/DB_PASSWORD/DB_NAME | 127.0.0.1/3306/root/ 空 /jumpserver | 数据库连接参数 |
REDIS_HOST/REDIS_PORT | 127.0.0.1/6379 | Redis 作为 Celery broker 与 WebSocket 通道 |
REDIS_DB_CELERY/REDIS_DB_CACHE | 3/4 | Celery 与缓存的 Redis 逻辑库编号(另有 session=5、ws=6) |
HTTP_BIND_HOST/HTTP_LISTEN_PORT | 0.0.0.0/8080 | Web 服务监听地址与端口 |
WS_LISTEN_PORT | 8070 | WebSocket 服务端口 |
SESSION_COOKIE_AGE | 3600*24 | 会话 Cookie 有效期 |
SECURITY_MFA_AUTH | 0 | 0 不开启、1 全局开启、2 管理员开启 MFA |
其中DB_PASSWORD、REDIS_PASSWORD、SECRET_KEY属于敏感项,apps/jumpserver/conf.py 中的ConfigCrypto支持通过环境变量SECRET_ENCRYPT_KEY使用国密 SM4 算法(ECB 模式)对这些配置值进行加解密,配置文件中可存放密文。
此外 config_example.yml 还提供了大量可选增强配置:LDAP/AD 同步(如AUTH_LDAP_SYNC_INTERVAL、AUTH_LDAP_SYNC_CRONTAB)、OTP/MFA(OTP_VALID_WINDOW、OTP_ISSUER_NAME)、Luna 水印(SECURITY_WATERMARK_ENABLED)、人脸识别(FACE_RECOGNITION_ENABLED等)、Ansible 自动化任务的批量/总超时(ANSIBLE_RUNNER_JOB_TIMEOUT、ANSIBLE_AUTOMATION_TOTAL_TIMEOUT等),以及 OpenBao 作为 Vault 后端(VAULT_ENABLED、VAULT_OPENBAO_ADDR等)。这些内容在快速上手阶段无需改动,但理解其存在有助于后续生产化调优。
从 pyproject.toml 的依赖清单还可以看到运行环境的几个关键事实:要求 Python ≥ 3.14,基于 Django 5.2.15、Django REST Framework 3.17.2、Celery 5.6.0、Paramiko 3.5.1,并内置 Ansible 9 用于资产自动化操作。这些版本信息以当前仓库 pyproject.toml 为准。
参与贡献与开源许可
JumpServer 欢迎通过提交 PR 参与贡献,相关规范见仓库根目录的 CONTRIBUTING.md。
许可证方面,按 readmes/README.ko.md 的声明:Copyright (c) 2014-2025 FIT2CLOUD, All rights reserved,项目采用GNU General Public License version 3(GPLv3)授权,代码以“AS IS”基础分发,不附带任何明示或默示担保。使用与二次分发时需遵守 GPLv3 的条款(如保留版权声明、以相同许可证开源衍生作品等),完整许可证文本以 LICENSE 文件为准。
小结
本文以 readmes/README.ko.md 为骨架,完整覆盖了 JumpServer 的项目定位、一键部署流程、默认登录凭据与核心组件架构,并通过仓库源码做了三层纵深验证:一是通过 jms 与 entrypoint.sh 还原了“一键脚本 → 服务控制 → 数据库检查/迁移/静态资源准备”的启动链路;二是通过 apps/terminal/connect_methods.py 验证了 KoKo/Lion/Chen/Magnus 等连接器的协议支持矩阵与三类连接方式的组织逻辑;三是通过 config_example.yml 与 apps/jumpserver/conf.py 梳理了首次部署必须了解的核心配置基线。基于这些内容,读者已经具备完成一次最小化部署、理解默认行为并进一步深入源码的能力。
【免费下载链接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.项目地址: https://gitcode.com/GitHub_Trending/ju/jumpserver
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考