jumpserver堡垒机部署手册

📅 2026/7/8 3:32:53 👁️ 阅读次数 📝 编程学习
jumpserver堡垒机部署手册

一、背景

随着公司业务规模的持续扩张,内部IT基础设施的体量也在同步增长。目前,公司已拥有数十台服务器,承载着开发、测试、生产等核心业务环境。然而,当前的运维管理模式仍停留在“直连时代”,即运维开发人员通过SSH等协议直接登录服务器进行操作。

这种模式在服务器数量较少时尚可勉强维持,但在多团队协作、人员变动频繁的当下,已逐渐演变为一颗潜伏在IT体系中的“定时炸弹”。

在行业合规要求日益严格的背景下,无论是等保2.0标准还是企业内部的安全审计需求,都明确要求对运维操作实现“事前授权、事中监察、事后审计”。堡垒机作为安全运维的核心组件,不再是可有可无的辅助工具,而是支撑整个运维体系安全运转的战略要地。

经过对市面上多款堡垒机产品的综合评估,我建议采用广受欢迎的开源堡垒机Jumpserver作为本次解决方案的核心,它能够以较低的成本实现从“人肉运维”到“体系化安全运维”的跨越。

二、现状痛点

2.1 账号共享严重

权限管理混乱多个运维人员、开发人员甚至第三方外包人员,往往共用一个root或Administrator账号。一旦出现问题,无法精准定位到具体责任人。当有员工离职或岗位调动时,密码是否需要修改、修改后如何同步给所有相关人员,都成为令人头疼的难题。全改一遍工作量巨大,不改则存在严重的泄露风险。

2.2 操作毫无记录,事故无法追溯

谁在什么时间登录了哪台服务器,执行了什么命令,删除了什么文件,修改了什么配置,完全没有任何记录。一旦发生误删数据库、误改系统配置导致服务崩溃等生产事故,只能靠猜测和互相推诿,无法追溯根本原因,更谈不上责任认定。

2.3 缺乏合规审计能力

无论是应对行业监管还是企业未来的上市审计,运维操作都需要有完整的、不可篡改的审计记录。当前直连模式下,操作日志散落在各台服务器上,甚至可能被恶意清除,完全无法满足合规要求,这给企业带来了巨大的法律和监管风险。

2.4. 资产管理混乱

登录入口分散,运维人员需要记忆几十台服务器的IP地址、账号和密码,经常需要切换不同的终端窗口。这不仅效率低下,还容易因误连测试服务器而执行了本该在生产环境运行的操作,造成不可挽回的后果。

三、系统目标

基于上述痛点,本次引入Jumpserver堡垒机系统,旨在实现以下核心目标:

3.1 统一纳入堡垒机管理

构建统一的身份认证与权限管控中心将所有服务器资产纳入堡垒机统一管理,运维人员必须通过堡垒机进行身份验证后才能访问。彻底取消直连,实现“用户-角色-资产-权限”的精细化控制。对接公司现有的身份认证系统,实现账号的统一管理和单点登录。

3.2 满足审计要求

实现全生命周期的操作审计对所有运维操作进行全程记录,包括命令输入、文件传输、界面操作等。支持SSH、RDP等协议的会话录像回放,让每一次操作都有据可查,为事故追溯提供“铁证”,满足等保2.0等合规审计要求。

3.3 高危操作拦截

建立高危操作拦截与告警机制设置命令过滤规则,实时拦截rm -rf /*、shutdown、drop table等危险命令,并触发告警通知。将安全防线从“事后追责”前移到“事中阻断”,最大限度降低误操作和恶意操作带来的损失。

3.4 资产、权限分类管控

提升运维效率与资产管理水平通过资产树功能,按业务系统、环境类型等维度对所有服务器进行逻辑分组,让运维人员一目了然。支持批量执行命令、文件分发等自动化操作,改变过去逐台登录的低效模式。

规范不同人员访问主机、数据库权限,设置账号可访问的资产范围。操作结束后账号自动失效,所有操作全程录像,既保障了协作效率,又杜绝了安全隐患。

四、解决方案

4.1 整体架构设计

采用Jumpserver双节点部署,以支撑公司数十台服务器的管理规模。整体架构分为三层:

核心服务层:部署Jumpserver的核心组件,包括Core(权限控制与API服务)、Koko(SSH/SFTP协议代理)、Luna(Web终端组件)等。该层负责处理所有用户的认证、授权、会话管理和审计日志存储。

资产接入层:通过部署在目标网络区域的网关服务器,实现对不同网络环境(如生产网、办公网、云VPC)中服务器的安全接入。Jumpserver核心服务不直接连接资产,而是指挥网关进行流量中转,有效收敛攻击面。

用户访问层:运维人员通过浏览器即可访问Jumpserver的Web界面,无需安装任何插件或客户端,即可通过Web Terminal或文件管理功能对Linux、Windows等资产进行操作。

4.2 核心功能落地

  1. 统一资产管理

    将公司现有的数十台服务器,按照“生产环境/测试环境/开发环境”或“业务系统A/业务系统B”等维度,在Jumpserver中构建清晰的资产树。通过CSV模板或API批量导入资产信息,实现资产的集中化、可视化管控。

  2. 细粒度权限控制基于“最小权限原则”设计权限模型。

    例如,数据库管理员仅被授予访问数据库服务器的权限,且只能使用只读账号登录;系统管理员可以访问所有Linux服务器,但禁止执行关机、重启等高危命令。权限可以精确到“人-资产-账号-时间”的维度。

  3. 实现审计功能

    全程会话审计与录像所有通过堡垒机发起的操作,都会被实时记录。审计日志包含操作时间、用户、目标资产、执行的每一条命令。对于SSH和RDP会话,系统会进行全程录像,支持倍速回放、定位关键时间点,让运维操作完全透明化。

  4. 高危操作拦截

    高危命令实时阻断配置命令过滤规则,对rm、reboot、format等敏感操作进行实时监控。一旦触发,系统可以立即阻断命令执行,并向管理员发送告警通知,将风险扼杀在摇篮中。

4.3 实施路径建议

环境准备与部署:选择两台服务器作为堡垒机宿主机,双节点保障单节点故障引起的堡垒机异常问题。

资产导入与分组:整理现有服务器清单,按照规划好的资产树结构,将资产批量导入Jumpserver系统。

用户与权限配置:创建运维人员账号,根据岗位职责,为不同用户组分配相应的资产访问权限。

试运行与策略调优:选取一个非核心业务系统进行试点,让运维人员通过堡垒机进行日常操作,验证权限配置的合理性,并根据反馈调整审计和高危命令策略。

全面推广与直连切断:在试点稳定运行后,逐步将所有服务器纳入堡垒机管理,并最终在网络层面禁止对服务器的直接SSH/RDP访问,强制所有运维流量经过堡垒机。

五、实施部署

5.1 部署环境

官网:https://docs.jumpserver.org

5.1.1 操作系统

支持主流 Linux 发行版本(基于 Debian / RedHat,包括国产操作系统)

操作系统

架构

Linux 内核

软件要求

最小化硬件配置

linux/amd64

x86_64

>= 4.0

wget curl tar gettext iptables python

4Core/8GB RAM/100G HDD

yum update yum install -y wget curl tar gettext iptables

5.1.2 当前选择系统

cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)

5.1.3 所需数据库

JumpServer 需要使用 PostgreSQL、MySQL 或 MariaDB 存储数据,使用 Redis 缓存数据

名称

版本

默认字符集

默认字符编码

TLS/SSL

PostgreSQL

>= 16

UTF8

en_US.utf8

MySQL

>= 5.7

utf8

utf8_general_ci

MariaDB

>= 10.6

utf8mb3

utf8mb3_general_ci

版本

Sentinel

Cluster

TLS/SSL

Redis

>= 6.0

5.1.4 安全策略配置

systemctl stop firewalld sudo setenforce 0 vim /etc/selinux/config SELINUX=disabled

5.2 单机部署安装

5.2.1 下载jumpserver离线安装包

开源社区 - FIT2CLOUD 飞致云

上传到部署服务器的 /opt/soft 目录

5.2.2 解压jumpserver安装包

cd /opt/soft tar -zxvf jumpserver-ce-v4.10.16-x86_64.tar.gz -C /opt cd jumpserver-ce-None-x86_64 cd /opt/jumpserver-ce-v4.10.16-x86_64/
vim config-example.txt #以下为需要配置的内容 #这个端口修改为非2222端口,不然有可能会造成ssh不可用 SSH_PORT=2022 #配置docker网段,一定不要与当前真实网段冲突 DOCKER_SUBNET=192.168.200.0/24 #配置postgres密码 DB_PASSWORD=123456 #配置redis的账户密码 REDIS_PASSWORD=234567 #其他可以暂时不用配置

5.2.3 安装与启动

./jmsctl.sh install

配置加密密钥 SECRETE_KEY: 0f1fafdc0bde5722ef29da1563fa89235401a4286ab15177 BOOTSTRAP_TOKEN: qPpF6iAr1l7zesO6ohudMX0S

./jmsctl.sh start #其他命令 # 停止 ./jmsctl.sh down # 卸载 ./jmsctl.sh uninstall # 帮助 ./jmsctl.sh -h

5.2.4 访问jumpserver页面

http://192.168.233.100:80 默认用户: admin 默认密码: ChangeMe

5.2.5 启用MFA认证

启用MFA认证

可以通过二维码下载官方的MFA验证器(需要外网),也可以直接在应用商城搜国内的MFA验证软件

通过手机安装的MFA验证器扫描二维码绑定,并输入临时的验证码登录

这是我手机绑定后,生成对应的MFA验证码,每半分钟刷新一次

输入正确的验证码后才能登录成功

5.2.6 添加用户,并设置默认权限

添加普通用户

普通用户通过默认账户密码登录,并修改默认密码,然后绑定MFA后登录

5.2.7 添加资产

点击资产列表,点击主机,点击创建,配置主机对应信息

5.2.8 配置账号

5.2.9 资产授权

给普通用户fj只授权192.168.233.101

登录fj账户查看资产

5.2.10 审计

查看在线会话

查看历史会话

查看回访视频记录,查看用户的所有操作

查看会话命令

查看登录日志

查看操作日志

文件传输

5.3 双节点部署jumpserver

部署架构

角色

主机名

IP地址

VIP(虚拟IP)

安装组件

主节点

jms01

192.168.233.101

192.168.233.201

Jumpserver、MySQL、Redis、Keepalived、Rsync

备节点

jms02

192.168.233.102

192.168.233.202

Jumpserver、MySQL、Redis、Keepalived、Rsync

5.3.1 基础环境配置

systemctl stop firewalld && systemctl disable firewalld
cat >> /etc/hosts <<EOF 192.168.233.101 jms01 192.168.233.102 jms02 EOF
yum install -y wget curl git vim net-tools
#安装Docker依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 清除旧缓存 yum clean all rm -rf /var/cache/yum # 配置阿里云 Docker CE 源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 更新缓存 yum makecache fast #安装Docker yum install -y docker-ce docker-ce-cli containerd.io #启动Docker并设置开机自启 systemctl enable docker --now
vim /etc/machine-id

5.3.2 数据库与缓存集群部署

5.3.2.1 MySQL 主主复制配置
# 下载 MySQL 官方仓库 RPM yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm # 导入 MySQL 官方 GPG 密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 # 清理缓存 yum clean all # 安装 MySQL yum install -y mysql-server
vim /etc/my.cnf.d/mysql-server.cnf [client] default-character-set=utf8mb4 [mysqld] server-id=1 # jms01填1,jms02填2 port=3306 lower_case_table_names=1 #datadir=/var/lib/mysql #socket=/var/lib/mysql/mysql.sock character-set-server=utf8mb4 collation-server=utf8mb4_general_ci #log-error=/var/log/mysql/mysqld.log #pid-file=/run/mysqld/mysqld.pid max_connections=1000 innodb_buffer_pool_size=2048M log-bin=mysql-bin # 开启二进制日志 auto-increment-increment=2 # 自增步长,避免主主冲突 auto-increment-offset=1 # jms01从1开始,jms02从2开始
server-id=2 auto-increment-offset=2
systemctl enable mysqld --now #查看初始密码 grep 'temporary password' /var/log/mysqld.log # 登录MySQL mysql -u root -p #重置密码,默认密码要求8位以上,且复杂度高 ALTER USER 'root'@'localhost' IDENTIFIED BY 'ABcd@1234'; # 创建Jumpserver数据库和用户 CREATE DATABASE jumpserver DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER 'jumpserver'@'%' IDENTIFIED BY 'ABcd@1234'; GRANT ALL PRIVILEGES ON jumpserver.* TO 'jumpserver'@'%'; ##修改复制用户的认证插件为 mysql_native_password ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Repl@1234'; #注意:如果不修改认证插件,配置主从复制时,会拒绝明文连接,导致失败 FLUSH PRIVILEGES;
-- 创建复制用户 CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Repl@1234'; GRANT REPLICATION SLAVE ON . TO 'repl'@'%'; FLUSH PRIVILEGES; -- 查看当前binlog位置 SHOW MASTER STATUS; #记录下 File 和 Position 的值,例如 | binlog.000001 | 2169 |
-- 配置指向jms01的复制 CHANGE MASTER TO MASTER_HOST='192.168.233.101', MASTER_USER='repl', MASTER_PASSWORD='Repl@1234', MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=2169; START SLAVE; SHOW SLAVE STATUS\G; -- 确认Slave_IO_Running和Slave_SQL_Running均为Yes
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Repl@1234'; GRANT REPLICATION SLAVE ON . TO 'repl'@'%'; FLUSH PRIVILEGES; SHOW MASTER STATUS;
CHANGE MASTER TO MASTER_HOST='192.168.233.102', MASTER_USER='repl', MASTER_PASSWORD='Repl@1234', MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=2171; START SLAVE; SHOW SLAVE STATUS\G;
5.3.2.2 Redis 主从哨兵配置
yum install -y epel-release yum makecache yum install -y redis
vim /etc/redis.conf bind 0.0.0.0 protected-mode no port 6379 daemonize yes requirepass redis@1234 # 设置Redis密码
vim /etc/redis.conf bind 0.0.0.0 protected-mode no port 6379 daemonize yes requirepass redis_password # 设置Redis密码 masterauth redis_password # 主节点密码(从节点连接时需要) replicaof 10.9.254.21 6379 # 指向jms01 # slaveof 192.168.233.101 6379 #当前的 Redis 版本为 3.2.12,它只识别旧的 slaveof 指令
systemctl enable redis --now
redis-cli -a redis@1234 info replication

确认 role:slave 且 master_link_status:up。

增加哨兵配置

vim /opt/jumpserver/compose/redis.yml services: redis: image: redis:7.4.6-bookworm container_name: jms_redis hostname: jms_redis restart: always command: ["redis-server", "/etc/redis.conf", "--requirepass", "$REDIS_PASSWORD"] environment: TZ: ${TZ:-Asia/Shanghai} REDIS_PORT: $REDIS_PORT REDIS_PASSWORD: $REDIS_PASSWORD volumes: - ${VOLUME_DIR}/redis/data:/data - ${CONFIG_DIR}/redis/redis.conf:/etc/redis.conf healthcheck: test: "redis-cli -h 127.0.0.1 -p $$REDIS_PORT -a $$REDIS_PASSWORD info Replication" interval: 10s timeout: 5s retries: 3 start_period: 10s networks: - net #增加哨兵配置 redis-sentinel: image: redis:7.4.6-bookworm container_name: jms_redis_sentinel hostname: jms_redis_sentinel restart: always command: ["redis-sentinel", "/etc/sentinel.conf"] environment: TZ: ${TZ:-Asia/Shanghai} volumes: - ${VOLUME_DIR}/redis-sentinel/data:/data - ${CONFIG_DIR}/redis/sentinel.conf:/etc/sentinel.conf ports: - "26379:26379" healthcheck: test: "redis-cli -h 127.0.0.1 -p 26379 ping" interval: 10s timeout: 5s retries: 3 start_period: 10s networks: - net

Sentinel 配置文件

mkdir -p /opt/jumpserver/conf/redis/ vim /opt/jumpserver/conf/redis/sentinel.conf port 26379 dir /data sentinel monitor mymaster 192.168.233.101 6379 2 sentinel auth-pass mymaster redis@123456 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1
sed -i 's/- net$/- jms_net/g' /opt/jumpserver/compose/redis.yml
cat >> /opt/jumpserver/compose/redis.yml <<EOF networks: jms_net: external: true EOF
docker compose -f compose/redis.yml up -d redis-sentinel
5.3.2.3 文件同步配置
yum install -y rsync # 创建共享目录 mkdir -p /data chmod 777 -R /data # 生成SSH密钥 ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa # 将公钥复制到对方服务器 ssh-copy-id root@jms01 ssh-copy-id root@jms02
vim /root/sync_to_jms02.sh #!/bin/bash rsync -avz /data/ root@jms02:/data/ chmod +x /root/sync_to_jms02.sh
vim /root/sync_to_jms01.sh #!/bin/bash rsync -avz /data/ root@jms01:/data/ chmod +x /root/sync_to_jms01.sh
crontab -e * * * * * /root/sync_to_jms02.sh
crontab -e * * * * * /root/sync_to_jms01.sh
5.3.2.4 Keepalived 高可用配置
yum install -y keepalived

配置jms01的Keepalived

! Configuration File for keepalived global_defs { router_id jms01 } vrrp_script check_jumpserver { script "/etc/keepalived/check_jumpserver.sh" interval 2 weight -20 } vrrp_instance VI_1 { state MASTER interface ens33 # 根据实际网卡名称修改 virtual_router_id 51 priority 100 # jms01优先级高 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.233.201/24 # VIP地址 } track_script { check_jumpserver } }

配置jms02的Keepalived

! Configuration File for keepalived global_defs { router_id jms02 } vrrp_script check_jumpserver { script "/etc/keepalived/check_jumpserver.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface ens33 # 根据实际网卡名称修改 virtual_router_id 51 priority 90 # 低于jms01 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.233.201/24 # VIP地址 } track_script { check_jumpserver } }

创建健康检查脚本(两台服务器均执行)

#!/bin/bash # 检查Jumpserver核心服务是否运行 if ! systemctl is-active --quiet jms-core; then exit 1 fi # 检查MySQL是否运行 if ! systemctl is-active --quiet mysqld; then exit 1 fi # 检查Redis是否运行 if ! systemctl is-active --quiet redis; then exit 1 fi exit 0

两台都执行

chmod +x /etc/keepalived/check_jumpserver.sh systemctl enable keepalived --now

jms01执行验证是否成功

ip addr show |grep 192.168.233
5.3.2.6 Keepalived VIP漂移验证
systemctl stop keepalived
ip addr show ens33 | grep 192.168.233.
systemctl start keepalived ip addr show ens33 | grep 192.168.233.
ip addr show ens33 | grep 192.168.233.
5.3.2.5 安装jumpserver
curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash #如果失败或者包异常,前往官网下载并上传 https://community.fit2cloud.com/#/products/jumpserver/downloads tar -zxvf /opt/jumpserver-ce-v4.10.16-x86_64.tar.gz -C /opt mv /opt/jumpserver-ce-v4.10.16-x86_64/ /opt/jumpserver mkdir /opt/jumpserver/config
#随机生产 cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50 O7vVR4yQ0dSFnjij8y5zWBPcsAaCI2skL7aSPvfUj8PD6YUUO9 #将随机生产的内容写入 vi /opt/jumpserver/config/config.yml SECRET_KEY: X9kL2mN7pQ4rS6tU8vW0yA1bC3dE5fG7hI9jK0lM2nO4pQ6rS8tU0vW2xY4zA #传送给备节点 scp /opt/jumpserver/config/config.yml root@192.168.233.102:/opt/jumpserver/config/
DB_ENGINE=mysql # DB、Redis统一使用高可用VIP DB_HOST=192.168.233.201 DB_PORT=3306 DB_NAME=jumpserver DB_USER=jumpserver DB_PASSWORD=ABcd@1234 # Redis配置 REDIS_HOST=192.168.233.201 REDIS_PORT=6379 REDIS_PASSWORD=redis@1234 DOCKER_SUBNET=192.168.133.0/24 SECRET_KEY=X9kL2mN7pQ4rS6tU8vW0yA1bC3dE5fG7hI9jK0lM2nO4pQ6rS8tU0vW2xY4zA CORE_HOST=http://core:8080 HTTP_PORT=80 # 新增:终端组件自动注册令牌,双节点必须完全相同 BOOTSTRAP_TOKEN=JmsBoot2026@Secure987654321 DOMAINS=192.168.233.201 192.168.233.101 192.168.233.102 127.0.0.1 localhost
mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.nju.edu.cn" ] } EOF #重启docker systemctl daemon-reload systemctl restart docker
cd /opt/jumpserver ./jmsctl.sh start ./jmsctl.sh status

增加哨兵

确认状态均为up且healthy!

web访问vip地址:http://192.168.233.201/

如果登录有报错,可以手动重置admin密码再登录(防止码哈希格式与当前版本不兼容)。

docker exec -it jms_core python /opt/jumpserver/apps/manage.py changepassword admin