Jumpserver 堡垒机应用部署
实验简介与理论基础
实验背景
企业生产环境中,直接从外网登录内部服务器存在较大安全风险。堡垒机(Bastion Host)作为统一入口,提供账号集中管理、授权控制、操作审计等能力,从而满足合规与安全要求。Jumpserver 是国产开源堡垒机方案,支持完整的 4A 规范。
实验目标
- 通过离线包与 Docker 在一台 CentOS 7.9 节点上部署 Jumpserver。
- 初始化系统并在 Web 端完成基本配置。
- 纳管一台 OpenStack 控制节点,实现 Web 终端远程登录与审计。
理论加油站
- 4A 能力:
- 认证(Authentication):确认身份,例如登录用户名与密码/多因子。
- 授权(Authorization):分配可访问的资产与操作范围。
- 账号(Account):统一管理目标资产上的系统账号(如 root、appuser)。
- 审计(Auditing):记录并回放操作(命令、会话录像)。
- 组件架构(容器化部署常见组件):
- Core:后端核心服务(Django),提供业务逻辑与 API。
- Koko:终端访问网关(Go),负责 SSH/Telnet;与浏览器 Web 终端协同。
- Lion:图形化远程访问(RDP/VNC)。
- Nginx:反向代理与静态资源分发。
- Redis:缓存/会话管理。
- MySQL:持久化数据库。
- 认证与登录链路:浏览器 → Nginx → Core(认证与授权)→ Koko/Lion(建立终端/图形连接)→ 目标资产主机。
- 资产与系统用户模型:资产(如一台服务器)与系统用户(在资产上的具体登录身份)进行绑定,再通过“资产授权”将其分配给平台用户或用户组。
基础环境准备(Node: jumpserver)
⚠️ 注意: 本章所有命令均在 192.168.200.13 (jumpserver) 节点执行,且与目标资产节点网络互通。
修改主机名
为了区分服务器角色,首先修改主机名。
[root@localhost ~]# hostnamectl set-hostname jumpserver
[root@localhost ~]# bash
[root@jumpserver ~]#
💡 解释:执行
bash是为了重新加载 Shell 环境,让新的主机名立即显示在提示符中。
关闭安全策略(教学环境)
为了防止实验过程中端口被拦截,暂时关闭防火墙和 SELinux(生产不建议)。
# 1. 关闭防火墙
[root@jumpserver ~]# systemctl stop firewalld
[root@jumpserver ~]# systemctl disable firewalld
[root@jumpserver ~]# iptables -F # 清空 iptables 规则
# 2. 临时关闭 SELinux
[root@jumpserver ~]# setenforce 0
# 修改/etc/selinux/config永久关闭SELinux
# 原文 SELINUX=enforcing
SELINUX=disabled
配置本地 YUM 源(离线仓库)
假设提供的安装包 jumpserver.tar.gz 已经上传至 /root 目录,该安装包内含离线 YUM 仓库。
# 解压安装包到 /opt 目录
[root@jumpserver ~]# tar -zxvf jumpserver.tar.gz -C /opt/
# 备份原有 repo 文件
[root@jumpserver ~]# mv /etc/yum.repos.d/* /media/
# 创建本地 repo 文件
[root@jumpserver ~]# vi /etc/yum.repos.d/jumpserver.repo
写入以下内容:
[jumpserver]
name=jumpserver
baseurl=file:///opt/jumpserver-repo
gpgcheck=0
enabled=1
验证源是否生效:
[root@jumpserver ~]# yum repolist
# 看到 jumpserver 源且状态数字非 0 即为成功
安装依赖与 Docker 环境
安装 Python 依赖
[root@jumpserver ~]# yum install python2 -y
安装与配置 Docker(离线二进制)
本案例使用离线二进制方式安装 Docker(与在线 yum install docker 不同)。
# 1. 复制 Docker 二进制文件到系统路径
[root@jumpserver ~]# cp -rf /opt/docker/* /usr/bin/
[root@jumpserver ~]# chmod 775 /usr/bin/docker*
# 2. 配置 Docker 系统服务
[root@jumpserver ~]# cp -rf /opt/docker.service /etc/systemd/system/
[root@jumpserver ~]# chmod 755 /etc/systemd/system/docker.service
# 3. 启动 Docker 并设置开机自启
[root@jumpserver ~]# systemctl daemon-reload
[root@jumpserver ~]# systemctl enable docker --now
# 4. 验证安装
[root@jumpserver ~]# docker --version
[root@jumpserver ~]# docker-compose --version
💡 提示:如果
docker-compose --version无法输出版本,请确认docker-compose可执行文件已包含在/usr/bin/,并具备执行权限。
部署 Jumpserver 服务
加载离线镜像
Jumpserver 由多个组件(Redis、MySQL、Nginx、Core、Koko、Lion 等)组成,需要先导入容器镜像。
[root@jumpserver ~]# cd /opt/images/
[root@jumpserver images]# sh load.sh
⏳ 等待:导入过程可能需要几分钟,请耐心等待所有镜像加载完成。
准备配置文件与数据目录
# 创建数据持久化目录
[root@jumpserver images]# mkdir -p /opt/jumpserver/{core,koko,lion,mysql,nginx,redis}
# 复制配置文件
[root@jumpserver images]# cp -rf /opt/config /opt/jumpserver/
使用 Compose 启动服务
通过 Docker Compose 编排启动所有容器。
[root@jumpserver images]# cd /opt/compose/
# 加载环境变量
[root@jumpserver compose]# source /opt/static.env
# 执行启动脚本
[root@jumpserver compose]# sh up.sh
观察输出:看到一列绿色的 Creating ... done 表示容器启动成功。
💡 理论加油站:
- Core:后端核心服务,负责认证/授权/审计等业务逻辑。
- Koko:终端网关,承担 SSH/Telnet 会话建立。
- Lion:图形会话网关,承担 RDP/VNC 会话建立。
- Nginx:统一入口与静态资源代理。
- Redis/MySQL:缓存与数据库存储。
快速验证容器状态:
docker ps -a
Jumpserver 初始化配置(Web端)
登录系统
- 打开浏览器,访问
http://192.168.200.13。 - 默认账号:
admin;默认密码:admin。 - 首次登录会强制要求修改密码(例如修改为
Admin@123)。
⚠️ 注意:首次登录后请尽快更改默认密码,并启用复杂度策略以提升安全性。
纳管 OpenStack 资产(核心步骤)
在 Jumpserver 中纳管一台服务器,逻辑顺序如下:
创建管理用户 → 创建系统用户 → 创建资产 → 资产授权。
创建管理用户(特权账号)
💡 概念:管理用户用于“连接”目标服务器,获取硬件信息、推送系统用户公钥等。通常是目标机的 root 账号。
- 左侧菜单:资产管理 → 管理用户。
- 点击“创建”。
- 填写信息:
- 名称:
root(或自定义) - 用户名:
root(必须是目标机真实存在的特权账号) - 密码:填写目标机(Controller 节点)的 root 密码
- 名称:
- 点击“提交”。
创建系统用户(登录账号)
💡 概念:运维人员通过堡垒机登录资产时,自动切换成的身份。例如设置为
root则拥最高权限。
- 左侧菜单:资产管理 → 系统用户。
- 点击“创建”。
- 填写信息:
- 名称:
System-Root(或自定义) - 协议:
SSH - 用户名:
root(登录后变成的身份) - 认证方式:
- 方式一(自动推送):选择“自动生成密钥”,Jumpserver 会将公钥推送到目标机(推荐)。
- 方式二(密码托管):手动输入目标机密码。
- 实验建议:输入Controller节点的密码,或勾选自动生成(依赖管理用户权限)。
- 名称:
- 点击“提交”。
创建资产(添加服务器)
- 左侧菜单:资产管理 → 资产列表。
- 点击“创建”。
- 填写信息:
- 主机名:
controller - IP(主机):
192.168.200.11 - 系统平台:
Linux - 管理用户:选择刚才创建的
root管理用户
- 主机名:
- 点击“提交”。
- 验证:提交后,列表中的“可连接”状态应变绿(若管理用户与网络配置正确)。
资产授权(分配权限)
没有授权,即便是管理员也看不到资产。
- 左侧菜单:权限管理 → 资产授权。
- 点击“创建”。
- 填写信息:
- 名称:
Auth-Rule-01 - 用户:选择
Administrator(当前登录的 Web 用户) - 用户组:
Default - 资产:选择刚才创建的
controller - 系统用户:选择刚才创建的
System-Root
- 名称:
- 点击“提交”。
远程连接测试
- 点击页面右上角“用户图标” → Web 终端(或左侧菜单的 Web 终端)。
- 在左侧文件树中,展开
Default文件夹。 - 点击
controller资产。 - 如果配置正确,浏览器将在右侧窗口打开一个 SSH 会话,显示
[root@controller ~]#提示符。 - 试着输入命令:
ip a或ls,验证是否操作成功。
常见问题排查(Troubleshooting)
浏览器访问 IP 报 502 Bad Gateway?
- 原因:Jumpserver 的后端服务还没完全启动。
- 解决:Docker 启动需要时间,等待 1-2 分钟后刷新。如果长时间不行,检查容器状态:
资产列表中“可连接”状态是红色?
- 原因:管理用户配置错误或无法连通目标机。
- 解决:
- 检查
192.168.200.11网络连通:ping -c 3 192.168.200.11 - 检查 22 端口:
ss -tunlp | grep :22(目标机) - 检查在“创建管理用户”步骤中填写的 root 密码是否正确。
- 检查
容器服务异常/重启频繁?
- 观察具体容器日志:
docker logs -f <service-name>。 - 检查磁盘空间与目录权限:确保
/opt/jumpserver/*目录存在并可写。 - 校验环境变量:确认
/opt/static.env内容与 compose 服务名一致。