Rocky Linux 10 搭建 JumpServer 堡垒机并集成 OpenLDAP 与 CAS 单点登录

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
2
getenforce
sestatus
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
/opt/jumpserver
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

首次登录后立即:

  1. 修改默认管理员密码;
  2. 创建独立日常管理员;
  3. 配置 HTTPS;
  4. 配置 LDAP/CAS;
  5. 保留本地 Break-Glass 管理员;
  6. 不允许多人共享管理员账号。

六、配置 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

只授予:

  • 搜索用户和组;
  • 读取 uidcndisplayNamemailmemberOf
  • 不允许修改用户;
  • 不允许读取 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

uidmailmemberOfobjectClass 建立等值索引。

八、配置 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 时,再配置客户端证书和私钥。重启:

1
./jmsctl.sh restart

不要通过关闭证书校验解决 SAN、CA 或 DNS 错误。

九、JumpServer 集成 LDAP

进入:

1
系统设置 -> 认证设置 -> 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))

同步前:

  1. 测试连接;
  2. 测试 Bind;
  3. 预览用户;
  4. 小范围同步;
  5. 核对用户名和组;
  6. 再启用定时同步。

不要第一次就同步整个企业目录。

9.2 用户组不等于资产权限

LDAP 用户组只是人员集合。资产权限仍由 JumpServer 授权规则决定:

1
2
3
4
5
6
用户/用户组
+ 资产/节点
+ 资产账号
+ 协议
+ 有效期
+ 动作

十、CAS 与 LDAP 的职责

推荐:

1
2
3
CAS 认证源:OpenLDAP
JumpServer 用户源:OpenLDAP
JumpServer 登录协议:CAS

CAS 应返回:

1
2
3
4
uid
cn
mail
memberOf

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

进入:

1
系统设置 -> 认证设置 -> CAS
配置项 示例
CAS Server https://sso.example.com/cas
Proxy Server https://jumpserver.example.com
CAS Version 3
Create User 建议关闭
Logout Completely 按统一退出策略配置

属性映射方向:

1
CAS 属性 -> JumpServer 字段
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 禁用用户测试

  1. LDAP 禁用用户或移出 jumpserver-users
  2. 执行 LDAP 同步;
  3. 清理 CAS TGT;
  4. 再次登录;
  5. 确认无法获得新访问;
  6. 检查历史授权是否失效。

十四、资产与授权模型

推荐资产节点:

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% 空间。

不要随意执行:

1
docker system prune -a

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。

十九、升级

升级前:

  1. 阅读 Release Notes;
  2. 备份数据库和数据;
  3. 保存当前安装包;
  4. 在测试环境验证 LDAP/CAS;
  5. 验证资产连接、录像和审计;
  6. 准备回滚。
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。

二十一、生产检查清单

  • Rocky Linux 10 已更新;
  • SELinux 保持 Enforcing;
  • 只开放必要端口;
  • Docker 日志已轮转;
  • JumpServer 使用专用 LDAP Reader;
  • Reader 不能读取密码或修改用户;
  • CAS 返回稳定 uid
  • LDAP 先同步,CAS 后登录;
  • CAS Create User 按策略关闭;
  • 保留本地应急管理员;
  • 人员组和资产授权分离;
  • Root 权限受控;
  • 录像、数据库和配置已备份;
  • 已演练 LDAP/CAS 故障回退;
  • 已验证禁用用户的完整链路。

二十二、总结

三者边界:

1
2
3
LDAP:保存人员和组织身份
CAS:验证人员身份并提供 SSO
JumpServer:决定人员能访问哪些资产和账号,并审计全部操作

核心原则:

  1. LDAP 是身份主数据源;
  2. CAS 与 JumpServer 使用同一个稳定用户名;
  3. LDAP 先同步,CAS 后登录;
  4. 避免两种机制同时创建用户;
  5. CAS 只解决认证,不等于资产授权;
  6. LDAP Reader 必须最小权限;
  7. 资产账号与人员身份分离;
  8. 保留本地应急管理员;
  9. 外部认证必须演练回退;
  10. 会话录像和数据库必须进入备份体系。

堡垒机的价值不是多一道登录页面,而是让“谁在什么时间、通过什么身份、访问了哪台机器、执行了什么操作”能够被授权、记录和追溯。

参考资料


Rocky Linux 10 搭建 JumpServer 堡垒机并集成 OpenLDAP 与 CAS 单点登录
https://allendericdalexander.github.io/2026/08/01/devops/linux/rocky/rocky-linux-10-jumpserver-ldap-cas/
作者
AtLuoFu
发布于
2026年8月1日
许可协议