
一、背景随着公司业务规模的持续扩张内部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服务、KokoSSH/SFTP协议代理、LunaWeb终端组件等。该层负责处理所有用户的认证、授权、会话管理和审计日志存储。资产接入层通过部署在目标网络区域的网关服务器实现对不同网络环境如生产网、办公网、云VPC中服务器的安全接入。Jumpserver核心服务不直接连接资产而是指挥网关进行流量中转有效收敛攻击面。用户访问层运维人员通过浏览器即可访问Jumpserver的Web界面无需安装任何插件或客户端即可通过Web Terminal或文件管理功能对Linux、Windows等资产进行操作。4.2 核心功能落地统一资产管理将公司现有的数十台服务器按照“生产环境/测试环境/开发环境”或“业务系统A/业务系统B”等维度在Jumpserver中构建清晰的资产树。通过CSV模板或API批量导入资产信息实现资产的集中化、可视化管控。细粒度权限控制基于“最小权限原则”设计权限模型。例如数据库管理员仅被授予访问数据库服务器的权限且只能使用只读账号登录系统管理员可以访问所有Linux服务器但禁止执行关机、重启等高危命令。权限可以精确到“人-资产-账号-时间”的维度。实现审计功能全程会话审计与录像所有通过堡垒机发起的操作都会被实时记录。审计日志包含操作时间、用户、目标资产、执行的每一条命令。对于SSH和RDP会话系统会进行全程录像支持倍速回放、定位关键时间点让运维操作完全透明化。高危操作拦截高危命令实时阻断配置命令过滤规则对rm、reboot、format等敏感操作进行实时监控。一旦触发系统可以立即阻断命令执行并向管理员发送告警通知将风险扼杀在摇篮中。4.3 实施路径建议环境准备与部署选择两台服务器作为堡垒机宿主机双节点保障单节点故障引起的堡垒机异常问题。资产导入与分组整理现有服务器清单按照规划好的资产树结构将资产批量导入Jumpserver系统。用户与权限配置创建运维人员账号根据岗位职责为不同用户组分配相应的资产访问权限。试运行与策略调优选取一个非核心业务系统进行试点让运维人员通过堡垒机进行日常操作验证权限配置的合理性并根据反馈调整审计和高危命令策略。全面推广与直连切断在试点稳定运行后逐步将所有服务器纳入堡垒机管理并最终在网络层面禁止对服务器的直接SSH/RDP访问强制所有运维流量经过堡垒机。五、实施部署5.1 部署环境官网https://docs.jumpserver.org5.1.1 操作系统支持主流 Linux 发行版本基于 Debian / RedHat包括国产操作系统操作系统架构Linux 内核软件要求最小化硬件配置linux/amd64x86_64 4.0wget curl tar gettext iptables python4Core/8GB RAM/100G HDDyum update yum install -y wget curl tar gettext iptables5.1.2 当前选择系统cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)5.1.3 所需数据库JumpServer 需要使用 PostgreSQL、MySQL 或 MariaDB 存储数据使用 Redis 缓存数据名称版本默认字符集默认字符编码TLS/SSLPostgreSQL 16UTF8en_US.utf8✅MySQL 5.7utf8utf8_general_ci✅MariaDB 10.6utf8mb3utf8mb3_general_ci✅称版本SentinelClusterTLS/SSLRedis 6.0✅❌✅5.1.4 安全策略配置systemctl stop firewalld sudo setenforce 0 vim /etc/selinux/config SELINUXdisabled5.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_PORT2022 #配置docker网段一定不要与当前真实网段冲突 DOCKER_SUBNET192.168.200.0/24 #配置postgres密码 DB_PASSWORD123456 #配置redis的账户密码 REDIS_PASSWORD234567 #其他可以暂时不用配置5.2.3 安装与启动./jmsctl.sh install配置加密密钥 SECRETE_KEY: 0f1fafdc0bde5722ef29da1563fa89235401a4286ab15177 BOOTSTRAP_TOKEN: qPpF6iAr1l7zesO6ohudMX0S./jmsctl.sh start #其他命令 # 停止 ./jmsctl.sh down # 卸载 ./jmsctl.sh uninstall # 帮助 ./jmsctl.sh -h5.2.4 访问jumpserver页面http://192.168.233.100:80 默认用户: admin 默认密码: ChangeMe5.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安装组件主节点jms01192.168.233.101192.168.233.201Jumpserver、MySQL、Redis、Keepalived、Rsync备节点jms02192.168.233.102192.168.233.202Jumpserver、MySQL、Redis、Keepalived、Rsync5.3.1 基础环境配置systemctl stop firewalld systemctl disable firewalldcat /etc/hosts EOF 192.168.233.101 jms01 192.168.233.102 jms02 EOFyum 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 --nowvim /etc/machine-id5.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-servervim /etc/my.cnf.d/mysql-server.cnf [client] default-character-setutf8mb4 [mysqld] server-id1 # jms01填1jms02填2 port3306 lower_case_table_names1 #datadir/var/lib/mysql #socket/var/lib/mysql/mysql.sock character-set-serverutf8mb4 collation-serverutf8mb4_general_ci #log-error/var/log/mysql/mysqld.log #pid-file/run/mysqld/mysqld.pid max_connections1000 innodb_buffer_pool_size2048M log-binmysql-bin # 开启二进制日志 auto-increment-increment2 # 自增步长避免主主冲突 auto-increment-offset1 # jms01从1开始jms02从2开始server-id2 auto-increment-offset2systemctl enable mysqld --now #查看初始密码 grep temporary password /var/log/mysqld.log # 登录MySQL mysql -u root -p #重置密码,默认密码要求8位以上且复杂度高 ALTER USER rootlocalhost IDENTIFIED BY ABcd1234; # 创建Jumpserver数据库和用户 CREATE DATABASE jumpserver DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER jumpserver% IDENTIFIED BY ABcd1234; GRANT ALL PRIVILEGES ON jumpserver.* TO jumpserver%; ##修改复制用户的认证插件为 mysql_native_password ALTER USER repl% IDENTIFIED WITH mysql_native_password BY Repl1234; #注意如果不修改认证插件配置主从复制时会拒绝明文连接导致失败 FLUSH PRIVILEGES;-- 创建复制用户 CREATE USER repl% IDENTIFIED WITH mysql_native_password BY Repl1234; GRANT REPLICATION SLAVE ON . TO repl%; FLUSH PRIVILEGES; -- 查看当前binlog位置 SHOW MASTER STATUS; #记录下 File 和 Position 的值例如 | binlog.000001 | 2169 |-- 配置指向jms01的复制 CHANGE MASTER TO MASTER_HOST192.168.233.101, MASTER_USERrepl, MASTER_PASSWORDRepl1234, MASTER_LOG_FILEbinlog.000001, MASTER_LOG_POS2169; START SLAVE; SHOW SLAVE STATUS\G; -- 确认Slave_IO_Running和Slave_SQL_Running均为YesCREATE USER repl% IDENTIFIED WITH mysql_native_password BY Repl1234; GRANT REPLICATION SLAVE ON . TO repl%; FLUSH PRIVILEGES; SHOW MASTER STATUS;CHANGE MASTER TO MASTER_HOST192.168.233.102, MASTER_USERrepl, MASTER_PASSWORDRepl1234, MASTER_LOG_FILEbinlog.000001, MASTER_LOG_POS2171; START SLAVE; SHOW SLAVE STATUS\G;5.3.2.2 Redis 主从哨兵配置yum install -y epel-release yum makecache yum install -y redisvim /etc/redis.conf bind 0.0.0.0 protected-mode no port 6379 daemonize yes requirepass redis1234 # 设置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 --nowredis-cli -a redis1234 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: - netSentinel 配置文件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 redis123456 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1sed -i s/- net$/- jms_net/g /opt/jumpserver/compose/redis.ymlcat /opt/jumpserver/compose/redis.yml EOF networks: jms_net: external: true EOFdocker compose -f compose/redis.yml up -d redis-sentinel5.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 rootjms01 ssh-copy-id rootjms02vim /root/sync_to_jms02.sh #!/bin/bash rsync -avz /data/ rootjms02:/data/ chmod x /root/sync_to_jms02.shvim /root/sync_to_jms01.sh #!/bin/bash rsync -avz /data/ rootjms01:/data/ chmod x /root/sync_to_jms01.shcrontab -e * * * * * /root/sync_to_jms02.shcrontab -e * * * * * /root/sync_to_jms01.sh5.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 --nowjms01执行验证是否成功ip addr show |grep 192.168.2335.3.2.6 Keepalived VIP漂移验证systemctl stop keepalivedip 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 安装jumpservercurl -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 root192.168.233.102:/opt/jumpserver/config/DB_ENGINEmysql # DB、Redis统一使用高可用VIP DB_HOST192.168.233.201 DB_PORT3306 DB_NAMEjumpserver DB_USERjumpserver DB_PASSWORDABcd1234 # Redis配置 REDIS_HOST192.168.233.201 REDIS_PORT6379 REDIS_PASSWORDredis1234 DOCKER_SUBNET192.168.133.0/24 SECRET_KEYX9kL2mN7pQ4rS6tU8vW0yA1bC3dE5fG7hI9jK0lM2nO4pQ6rS8tU0vW2xY4zA CORE_HOSThttp://core:8080 HTTP_PORT80 # 新增终端组件自动注册令牌双节点必须完全相同 BOOTSTRAP_TOKENJmsBoot2026Secure987654321 DOMAINS192.168.233.201 192.168.233.101 192.168.233.102 127.0.0.1 localhostmkdir -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 dockercd /opt/jumpserver ./jmsctl.sh start ./jmsctl.sh status增加哨兵确认状态均为up且healthyweb访问vip地址http://192.168.233.201/如果登录有报错可以手动重置admin密码再登录防止码哈希格式与当前版本不兼容。docker exec -it jms_core python /opt/jumpserver/apps/manage.py changepassword admin