JumpServer 是面向企业资产访问控制、账号管理、操作审计和运维授权的堡垒机。它不是一台简单的 SSH 跳板机,而是把人员身份、资产、系统账号、授权规则、命令审计、会话录像和文件传输统一到一个平台中。
在企业身份体系中,推荐将职责拆分为:
1 2 3
| OpenLDAP:保存用户、组织、用户组和账号状态 Apereo CAS:负责统一登录、SSO 会话与 MFA 编排 JumpServer:管理资产、资产账号、访问授权与操作审计
|
本文基于 Rocky Linux 10,以 JumpServer v4.10 LTS 为版本基线,完成 JumpServer 部署、HTTPS、LDAP 用户同步、CAS 单点登录、资产授权、安全加固、备份恢复和升级。
JumpServer 的菜单名称和部分认证能力可能随版本、社区版/企业版和授权变化。本文以 JumpServer v4 官方 LDAP、CAS 文档模型为基线,生产部署前应在测试环境确认当前版本和许可证能力。
一、整体架构
| 组件 |
地址 |
说明 |
| JumpServer |
https://jumpserver.example.com |
堡垒机入口 |
| OpenLDAP |
ldaps://ldap.example.com:636 |
企业用户目录 |
| Apereo CAS |
https://sso.example.com/cas |
统一认证中心 |
| LDAP Base DN |
dc=example,dc=com |
目录根节点 |
| LDAP User OU |
ou=people,dc=example,dc=com |
用户目录 |
| LDAP Group OU |
ou=groups,dc=example,dc=com |
用户组目录 |
flowchart LR
User[运维人员] -->|HTTPS| JS[JumpServer]
JS -->|LDAPS 查询与同步| LDAP[OpenLDAP]
User -->|SSO Redirect| CAS[Apereo CAS]
CAS -->|LDAP Bind| LDAP
CAS -->|CAS Assertion| JS
JS -->|SSH/RDP/DB/K8s| Asset[受管资产]
JS --> Audit[(录像与审计)]
JS --> DB[(PostgreSQL)]
JS --> Redis[(Redis)]
推荐身份链路:
1 2 3 4
| LDAP 作为唯一身份主数据源 CAS 使用 LDAP 完成认证 JumpServer 从 LDAP 同步用户 JumpServer 使用 CAS 完成登录
|
不要让 JumpServer、CAS 和 LDAP 分别维护三套互不关联的用户名。
二、资源与端口规划
2.1 资源建议
| 场景 |
CPU |
内存 |
数据盘 |
| 测试 |
4 核 |
8 GB |
100 GB SSD |
| 小型生产 |
8 核 |
16 GB |
300 GB SSD |
| 中型生产 |
16 核 |
32 GB |
1 TB SSD |
容量主要受以下因素影响:
- 并发 SSH、RDP、数据库和 Kubernetes 会话;
- 会话录像;
- 命令审计日志;
- 文件上传下载;
- PostgreSQL 与 Redis;
- WebSocket 长连接;
- Koko、Lion 等组件资源占用。
2.2 端口
| 端口 |
协议 |
用途 |
| 80 |
TCP |
HTTP 跳转 HTTPS |
| 443 |
TCP |
Web、WebSocket、CAS 回调 |
| 22 |
TCP |
宿主机管理,仅管理网 |
| 636 |
TCP 出站 |
访问 LDAP |
| 443 |
TCP 出站 |
访问 CAS |
| 目标资产端口 |
TCP/UDP 出站 |
SSH、RDP、数据库等 |
数据库和 Redis 端口不得暴露公网。
三、Rocky Linux 10 初始化
1 2 3 4
| cat /etc/rocky-release uname -r uname -m hostnamectl
|
1 2 3 4
| hostnamectl set-hostname jumpserver01.example.com timedatectl set-timezone Asia/Shanghai systemctl enable --now chronyd chronyc tracking
|
1 2 3 4 5 6 7
| dnf clean all dnf makecache dnf upgrade -y
dnf install -y \ vim curl wget tar gzip unzip jq git openssl \ bind-utils lsof policycoreutils-python-utils firewalld
|
保持 SELinux:
1
| systemctl enable --now firewalld
|
四、安装 Docker Engine
1 2 3 4
| dnf remove -y \ docker docker-client docker-client-latest docker-common \ docker-latest docker-latest-logrotate docker-logrotate \ docker-engine podman-docker
|
1 2 3 4 5 6 7 8 9 10 11
| dnf install -y dnf-plugins-core
dnf config-manager \ --add-repo \ https://download.docker.com/linux/rhel/docker-ce.repo
dnf install -y \ docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker
|
1 2 3
| docker version docker compose version docker info
|
日志轮转:
1 2 3 4 5 6 7 8 9 10 11 12
| cat > /etc/docker/daemon.json <<'JSON' { "log-driver": "local", "log-opts": { "max-size": "100m", "max-file": "5" } } JSON
jq . /etc/docker/daemon.json systemctl restart docker
|
不要开放未认证的 Docker 2375 端口。
五、安装 JumpServer
5.1 官方快速安装
在干净的服务器上:
1 2 3 4 5
| cd /opt
curl -sSL \ https://github.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh \ | bash
|
安装目录通常为:
1 2 3 4 5
| cd /opt/jumpserver
./jmsctl.sh status ./jmsctl.sh version docker compose ps
|
5.2 固定版本安装
生产环境应固定版本,不永久追踪 latest。以 v4.10.18 为例,下载对应 Release 的 x86_64 离线包:
1 2 3 4 5
| cd /opt export JUMPSERVER_VERSION='v4.10.18'
wget \ "https://github.com/jumpserver/jumpserver/releases/download/${JUMPSERVER_VERSION}/jumpserver-ce-${JUMPSERVER_VERSION}-x86_64.tar.gz"
|
实际离线包名可能随版本调整,应以 Release 页面为准。解压后:
1 2 3 4 5
| tar -xzf jumpserver-ce-*.tar.gz cd jumpserver-installer-*
./jmsctl.sh install ./jmsctl.sh start
|
5.3 管理命令
1 2 3 4 5 6 7
| cd /opt/jumpserver
./jmsctl.sh start ./jmsctl.sh stop ./jmsctl.sh restart ./jmsctl.sh status ./jmsctl.sh logs
|
首次登录后立即:
- 修改默认管理员密码;
- 创建独立日常管理员;
- 配置 HTTPS;
- 配置 LDAP/CAS;
- 保留本地 Break-Glass 管理员;
- 不允许多人共享管理员账号。
六、配置 HTTPS
证书路径:
1 2
| /opt/jumpserver/config/nginx/cert/server.crt /opt/jumpserver/config/nginx/cert/server.key
|
1 2 3 4 5 6 7 8 9
| mkdir -p /opt/jumpserver/config/nginx/cert
install -o root -g root -m 0644 \ jumpserver.example.com.fullchain.crt \ /opt/jumpserver/config/nginx/cert/server.crt
install -o root -g root -m 0600 \ jumpserver.example.com.key \ /opt/jumpserver/config/nginx/cert/server.key
|
编辑:
1
| vim /opt/jumpserver/config/config.txt
|
1 2 3 4 5
| HTTP_PORT=80 HTTPS_PORT=443 SERVER_NAME=jumpserver.example.com SSL_CERTIFICATE=server.crt SSL_CERTIFICATE_KEY=server.key
|
1 2
| cd /opt/jumpserver ./jmsctl.sh restart
|
1 2 3 4 5
| curl -I https://jumpserver.example.com/
openssl s_client \ -connect jumpserver.example.com:443 \ -servername jumpserver.example.com
|
防火墙:
1 2 3
| firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload
|
宿主机 SSH 应只允许管理网。
七、准备 LDAP 目录与只读账号
推荐目录:
1 2 3 4 5 6 7 8
| dc=example,dc=com ├── ou=people ├── ou=groups │ ├── cn=jumpserver-users │ ├── cn=jumpserver-admins │ └── cn=jumpserver-auditors └── ou=system └── cn=jumpserver-reader
|
专用账号:
1
| cn=jumpserver-reader,ou=system,dc=example,dc=com
|
只授予:
- 搜索用户和组;
- 读取
uid、cn、displayName、mail、memberOf;
- 不允许修改用户;
- 不允许读取
userPassword;
- 不使用 LDAP RootDN。
测试:
1 2 3 4 5 6 7 8
| ldapsearch \ -x -LLL \ -H ldaps://ldap.example.com:636 \ -D 'cn=jumpserver-reader,ou=system,dc=example,dc=com' \ -W \ -b 'ou=people,dc=example,dc=com' \ '(&(objectClass=inetOrgPerson)(uid=alice))' \ uid cn displayName mail memberOf
|
为 uid、mail、memberOf、objectClass 建立等值索引。
八、配置 LDAP TLS 信任
JumpServer LDAP TLS 常用证书文件:
1 2 3
| ldap_ca.pem ldap_cert.pem ldap_cert.key
|
持久化位置可能因安装器版本变化,常见为:
1 2
| /opt/jumpserver/config/certs /data/jumpserver/core/data/certs
|
先检查 Compose:
1 2 3 4 5
| cd /opt/jumpserver
docker compose config \ | grep -n -A5 -B5 \ '/data/jumpserver/core/data/certs\|/opt/jumpserver/config/certs'
|
复制 CA:
1 2 3 4 5
| mkdir -p /opt/jumpserver/config/certs
install -o root -g root -m 0644 \ company-root-ca.crt \ /opt/jumpserver/config/certs/ldap_ca.pem
|
LDAP 要求双向 TLS 时,再配置客户端证书和私钥。重启:
不要通过关闭证书校验解决 SAN、CA 或 DNS 错误。
九、JumpServer 集成 LDAP
进入:
推荐参数:
| 配置项 |
示例 |
| LDAP Server |
ldaps://ldap.example.com:636 |
| Bind DN |
cn=jumpserver-reader,ou=system,dc=example,dc=com |
| User OU |
ou=people,dc=example,dc=com |
| Search Filter |
(uid=%(user)s) |
| TLS Verify |
启用 |
属性映射:
1 2 3 4 5 6
| { "name": "cn", "username": "uid", "email": "mail", "groups": "memberOf" }
|
JumpServer LDAP 映射方向是:
1
| JumpServer 字段 -> LDAP 属性
|
9.1 只同步授权用户
1
| (&(objectClass=inetOrgPerson)(uid=%(user)s)(memberOf=cn=jumpserver-users,ou=groups,dc=example,dc=com))
|
同步前:
- 测试连接;
- 测试 Bind;
- 预览用户;
- 小范围同步;
- 核对用户名和组;
- 再启用定时同步。
不要第一次就同步整个企业目录。
9.2 用户组不等于资产权限
LDAP 用户组只是人员集合。资产权限仍由 JumpServer 授权规则决定:
1 2 3 4 5 6
| 用户/用户组 + 资产/节点 + 资产账号 + 协议 + 有效期 + 动作
|
十、CAS 与 LDAP 的职责
推荐:
1 2 3
| CAS 认证源:OpenLDAP JumpServer 用户源:OpenLDAP JumpServer 登录协议:CAS
|
CAS 应返回:
uid 必须稳定、唯一,并与 JumpServer LDAP 同步后的用户名一致。
十一、在 CAS 注册 JumpServer
JumpServer CAS 路径通常为:
1 2 3
| 登录:https://jumpserver.example.com/core/auth/cas/login/ 回调:https://jumpserver.example.com/core/auth/cas/callback/ 退出:https://jumpserver.example.com/core/auth/cas/logout/
|
CAS Registered Service 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| { "@class": "org.apereo.cas.services.CasRegisteredService", "serviceId": "^https://jumpserver\\.example\\.com/core/auth/cas/.*$", "name": "JumpServer", "id": 20000001, "evaluationOrder": 10, "attributeReleasePolicy": { "@class": "org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy", "allowedAttributes": [ "uid", "cn", "mail", "memberOf" ] } }
|
CAS JSON 类名和格式应以当前 CAS 7.3.x Overlay 为准。验证:
1 2
| jq . /etc/cas/services/jumpserver-20000001.json journalctl -u cas | grep -i 'JumpServer\|registered service'
|
不要注册 .* 万能 Service。
十二、JumpServer 集成 CAS
进入:
| 配置项 |
示例 |
| CAS Server |
https://sso.example.com/cas |
| Proxy Server |
https://jumpserver.example.com |
| CAS Version |
3 |
| Create User |
建议关闭 |
| Logout Completely |
按统一退出策略配置 |
属性映射方向:
1 2 3 4 5 6
| { "uid": "username", "cn": "name", "mail": "email", "memberOf": "groups" }
|
12.1 为什么关闭 CAS 自动创建用户
如果同时启用 LDAP 同步和 CAS 首次登录创建用户,可能产生:
- 同一人员两份账号;
- 大小写差异;
- 邮箱匹配错误;
- 用户组不一致;
- 授权绑定错误账号。
推荐流程:
1 2 3
| LDAP 先同步用户 -> CAS 登录查找现有同名用户 -> CAS 不创建身份
|
12.2 保留本地 Break-Glass 管理员
必须保留本地管理员:
- 强密码;
- MFA;
- 仅管理网;
- 密码进入企业密码库;
- 定期验证;
- 不参与日常操作。
十三、验证身份链路
13.1 CAS 登录
访问:
1
| https://jumpserver.example.com/core/auth/cas/login/
|
预期:
1
| JumpServer -> CAS -> LDAP 密码认证 -> CAS 回调 -> 登录已有 LDAP 用户
|
13.2 核对属性
| 属性 |
LDAP |
CAS |
JumpServer |
| 用户名 |
uid=alice |
uid=alice |
alice |
| 姓名 |
cn |
cn |
Name |
| 邮箱 |
mail |
mail |
Email |
| 用户组 |
memberOf |
memberOf |
User Group |
13.3 禁用用户测试
- LDAP 禁用用户或移出
jumpserver-users;
- 执行 LDAP 同步;
- 清理 CAS TGT;
- 再次登录;
- 确认无法获得新访问;
- 检查历史授权是否失效。
十四、资产与授权模型
推荐资产节点:
1 2 3 4 5
| /Production/Linux /Production/Database /Staging/Linux /Network /Kubernetes
|
推荐人员组:
1 2 3
| linux-ops db-ops security-auditors
|
授权示例:
1 2 3 4 5 6 7
| 名称:Production Linux Deploy 用户组:linux-ops 资产节点:/Production/Linux 账号:deploy 协议:SSH 动作:连接、上传、下载 有效期:2026-01-01 ~ 2026-12-31
|
不要直接授权所有人使用 root。
十五、安全加固
- Web 只开放 HTTPS;
- 宿主机 SSH 仅管理网;
- PostgreSQL、Redis 不暴露;
- CAS/LDAP 仅允许 JumpServer 网络访问;
- 统一 MFA;
- 禁止共享人员账号;
- 资产账号最小权限;
- Root 访问使用审批或临时授权;
- 定期清理过期授权;
- 会话录像与命令记录进入审计保留策略。
中大型环境可将录像放到 S3/MinIO,并验证加密、生命周期、不可变和恢复能力。
十六、性能调优
16.1 存储
1 2 3 4
| df -hT df -ih du -sh /data/jumpserver/* 2>/dev/null docker system df
|
推荐 SSD/NVMe,录像和数据库容量独立规划,保留至少 20% 空间。
不要随意执行:
16.2 外部 PostgreSQL 与 Redis
较大规模使用外部 PostgreSQL/Redis:
- 独立备份;
- 慢 SQL 与连接数监控;
- 高可用;
- TLS/密码;
- 不暴露公网;
- 与 JumpServer 版本兼容。
16.3 LDAP 同步
- 使用允许组过滤;
- 为过滤字段建索引;
- 不高频全量同步;
- 避开业务高峰;
- 监控同步时长和失败;
- 禁用用户优先处理。
十七、监控
至少监控:
1 2 3 4 5 6 7 8 9 10 11 12 13
| Web 健康 容器状态 CPU、内存、Load 磁盘和 inode PostgreSQL 与 Redis LDAP 同步 CAS 登录成功率 WebSocket 在线会话 录像写入失败 资产连接失败 5xx 证书有效期
|
1 2 3 4
| cd /opt/jumpserver ./jmsctl.sh status docker compose ps docker compose logs --tail 200
|
十八、备份与恢复
必须备份:
1 2 3 4 5 6 7 8 9
| JumpServer 配置 PostgreSQL Redis(按官方恢复要求) 会话录像 命令审计 上传文件 证书 LDAP/CAS 配置记录 版本信息
|
查看当前安装器支持的备份命令:
1 2
| cd /opt/jumpserver ./jmsctl.sh --help
|
冷备份示例:
1 2 3 4 5 6 7 8 9 10 11
| ./jmsctl.sh stop
mkdir -p /backup/jumpserver
tar --xattrs --acls \ -czf "/backup/jumpserver/jumpserver-$(date +%F-%H%M%S).tar.gz" \ /opt/jumpserver \ /data/jumpserver \ 2>/dev/null
./jmsctl.sh start
|
数据库应使用一致性备份,不能在运行中只复制 PostgreSQL Data Directory。
十九、升级
升级前:
- 阅读 Release Notes;
- 备份数据库和数据;
- 保存当前安装包;
- 在测试环境验证 LDAP/CAS;
- 验证资产连接、录像和审计;
- 准备回滚。
1 2 3 4
| cd /opt/jumpserver ./jmsctl.sh version ./jmsctl.sh status ./jmsctl.sh upgrade
|
升级后至少验证:
1 2 3 4 5 6 7
| 本地管理员登录 LDAP 同步 CAS 登录 SSH/RDP/数据库连接 文件传输 录像回放 审计搜索
|
二十、常见故障
20.1 LDAP TLS 失败
1 2 3 4 5 6
| getent hosts ldap.example.com
openssl s_client \ -connect ldap.example.com:636 \ -servername ldap.example.com \ -showcerts
|
检查 CA、SAN、DNS、系统时间、Bind DN、密码和 Base DN。
20.2 LDAP 搜不到用户
1 2 3 4 5 6 7 8
| ldapsearch \ -x -LLL \ -H ldaps://ldap.example.com:636 \ -D 'cn=jumpserver-reader,ou=system,dc=example,dc=com' \ -W \ -b 'ou=people,dc=example,dc=com' \ '(uid=alice)' \ dn uid
|
20.3 CAS 登录产生重复用户
原因通常是:
- Create User 开启;
- LDAP 未先同步;
- CAS
uid 与 LDAP uid 不一致;
- 用户名大小写不同;
- 邮箱被错误当成主键。
关闭自动创建并统一 uid。
20.4 CAS 回调循环
检查:
1 2 3 4 5 6 7 8
| CAS Server Proxy Server 外部 HTTPS 域名 回调 URL CAS Service 正则 X-Forwarded-Proto Cookie 系统时间
|
20.5 会话连接失败
1 2 3 4 5
| docker compose logs -f koko docker compose logs -f lion
nc -vz 目标IP 22 nc -vz 目标IP 3389
|
还需检查资产账号、协议、授权规则、路由和防火墙。
20.6 磁盘增长过快
1 2 3 4 5 6 7
| du -xh /data/jumpserver 2>/dev/null \ | sort -h \ | tail -30
docker system df df -hT df -ih
|
重点查看录像、日志、上传文件、数据库和 Docker Log。
二十一、生产检查清单
二十二、总结
三者边界:
1 2 3
| LDAP:保存人员和组织身份 CAS:验证人员身份并提供 SSO JumpServer:决定人员能访问哪些资产和账号,并审计全部操作
|
核心原则:
- LDAP 是身份主数据源;
- CAS 与 JumpServer 使用同一个稳定用户名;
- LDAP 先同步,CAS 后登录;
- 避免两种机制同时创建用户;
- CAS 只解决认证,不等于资产授权;
- LDAP Reader 必须最小权限;
- 资产账号与人员身份分离;
- 保留本地应急管理员;
- 外部认证必须演练回退;
- 会话录像和数据库必须进入备份体系。
堡垒机的价值不是多一道登录页面,而是让“谁在什么时间、通过什么身份、访问了哪台机器、执行了什么操作”能够被授权、记录和追溯。
参考资料