前言
在我之前的博文中有过详细的部署过程,不过那是以源码的形式进行部署的,大家感兴趣的话可以去看一看——《JumpServer 开源堡垒机部署(源码)》。源码形式的部署可能会遇到很多问题,不过这些问题都很容易解决,大家如果想感受其工作过程的话,可以尝试以源码方式进行部署。本次和大家分享的是以 Docker 方式部署的完整过程,以及部署过程中需要注意的一些点。
1、服务器规划
OS | Server | 备注 |
Ubuntu 18.04(192.168.1.146) | JumpServer、MySQL、Redis | JumpServer |
Ubuntu 18.04(192.168.1.144) | SSHD | 远程 SSH 测试 |
window 10(192.168.1.71) | RPD | 远程 RPD 测试 |
2、资源清单
- Ubuntu
Version:18.04.6 LTS
Install(官方): https://ubuntu.com/download
Install(ISO):
软件版本
Version:18.06.3-ce
Install:Install Docker Engine on Ubuntu | Docker Documentation
JumpServer
Version:2.16.0
Install:docker pull xxx
MySQL
Version:8.0.27
Install:docker pull xxx
对于 JumpServer 2.16.0 需 MySQL>= 5.7.8
Redis
Version:6.2.6
Install:docker pull xxx
二、部署
2.1 Docker 部署
1、卸载旧版本(或已存在的残余 Docker)
sudo apt-get remove docker docker-engine docker.io containerd runc
2、安装必要依赖
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
3、安装GPG证书
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4、 写入软件源信息
如果使用官方的话,安装 Docker 就会非常慢,所以建议缓存国内源。
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
5、安装 Docker-CE
- 安装最新版
sudo apt-get -y update
sudo apt-get -y install docker-ce
- 安装指定版本(推荐-根据实际场景选择)
# 查看apt源中的docker版本
apt-cache madison docker-ce
...
docker-ce | 18.06.3~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 18.06.2~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 18.06.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
...
# 安装指定版本
sudo apt-get -y install docker-ce=18.06.3~ce~3-0~ubuntu
6、启动 Docker
# 一般安装完成后就会启动了
sudo systemctl start docker.service
sudo systemctl enable docker.service
sudo systemctl status docker.service
7、添加当前用户至 Docker 组
方便直接 docker,而不需要加 sudo docker
sudo usermod -a -G docker $USER
8、添加加速器
# 添加阿里加速
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://q1rw9tzz.mirror.aliyuncs.com"]
}
EOF
# 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
2.2 MySQL 部署
1、创建数据目录
sudo mkdir -p /data/mysql/data
2、pull 镜像
sudo docker pull mysql:8.0.27
3、运行容器
sudo docker run -itd --name mysql --net=host --restart=always -e MYSQL_ROOT_PASSWORD=chang@123 -p 3306:3306 -v /data/mysql/data:/var/lib/mysql mysql:8.0.31 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
4、查看容器状态
sudo docker ps
5、创建数据库及程序用户
- 登录数据库
sudo docker exec -it mysql /bin/bash
mysql -uroot -pchang@123
- 创建数据库
create database jumpserver default charset 'utf8mb4';
create database jumpserver default charset 'utf8'
- 创建程序用户
create user 'jumpserver'@'%' identified with 'mysql_native_password' by 'love-520';
- 授权用户对应数据库
grant all on jumpserver.* to 'jumpserver'@'%';
对于mysql8.0+,创建用户和授权须分开进行。
- 刷新授权表
- flush privileges;
6、mysql8.0修改root账号密码
use mysql;
update user set authentication_string='' where user='root';
--将字段置为空
ALTER user 'root'@'localhost' IDENTIFIED BY 'love-520';
--修改密码为root
2.3 Redis 部署
1、创建数据目录
sudo mkdir -p /data/redis/data
2、pull 镜像
sudo docker pull redis:6.2.6
3、运行容器
sudo docker run -itd --name redis --net=host -p 6379:6379 -v /data/redis/data:/data --restart=always redis --requirepass "love-520"
4、查看容器状态
sudo docker ps
2.4 JumpServer 部署
1、创建数据目录
sudo mkdir -p /data/jumpserver
2、pull 镜像
sudo docker pull jumpserver/jms_all
3、运行容器
docker run -itd --name jumpserver --net=host -h jumpserver --restart=always \
-v /data/jumpserver:/opt/jumpserver/data/media \
-p 80:80 \
-p 2222:2222 \
-e SECRET_KEY=BqFQuEAF1ejzg9xCGlYRJQzvkP23DyKTqm9kyrMqGCAD1bxXWE \
-e BOOTSTRAP_TOKEN=YEYc4coKFmSDQpsf \
-e DB_HOST=192.168.8.201 \
-e DB_PORT=3306 \
-e DB_USER=jumpserver \
-e DB_PASSWORD="love-520" \
-e DB_NAME=jumpserver \
-e REDIS_HOST=192.168.8.201 \
-e REDIS_PORT=6379 \
-e REDIS_PASSWORD="love-520" \
jumpserver/jms_all
注意:保存好 SECRET_KEY 和 BOOTSTRAP_TOKEN,用于版本升级。
随机字符串生成方法:
# SECRET_KEY
if [ "$SECRET_KEY" = "" ]; then SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`; echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc; echo $SECRET_KEY; else echo $SECRET_KEY; fi
# BOOTSTRAP_TOKEN
if [ "$BOOTSTRAP_TOKEN" = "" ]; then BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`; echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc; echo $BOOTSTRAP_TOKEN; else echo $BOOTSTRAP_TOKEN; fi
4、查看容器状态
sudo docker ps
查看 JumpServer 启动日志
docker logs -f jumpserver
看到如下日志,说明启动成功,尝试在浏览器进行访问
三、验证
3.1 可用性
是否可正常访问:http://192.168.1.146/
默认登录用户/密码:admin/admin
系统用户 是JumpServer 登录资产时使用的账号,如 root ssh root@host,而不是使用该用户名登录资产(ssh admin@host);
特权用户 是资产已存在的, 并且拥有高级权限的系统用户, JumpServer 使用该用户来推送系统用户、获取资产硬件信息 等;
普通用户 可以在资产上预先存在,也可以由特权用户来自动创建。
3.2 远程性
1、Linux
- 通过 JumpServer 连接远程服务器
1.创建资源
2. 创建系统用户
3. 资源授权
4. 连通性验证
若水印影响视觉,去掉终端水印即可。终端的水印可以通过【系统设置–>安全设置–>开启水印】把勾去掉即可。
- Linux 终端查看 JumpServer
ssh admin@192.168.1.146 -p2222
# admin为JumpServer的登录用户
# 2222为JumpServer的监听端口
# 密码为JumpServer登录admin用户的登录密码
# 若开发人员不想通过浏览器登录web界面操作,也可xshell先登录跳板机服务器,再通过上述命令远程自己的主机。
# 1、再跳板机服务器创建一个统一登录的普通用户
# 2、开发人员通过该普通用户登录跳板机
# 3、运维通过JumpServer给各开发人员开通普通账户/密码
# 4、开发再通过跳板机执行ssh命令连接自己的JumpServer账户,查看自己已被授权的主机,并可进行登录
# 如下图所示,根据对应提示输入即可
2、Windows
由于我的 windows 暂不支持远程桌面,此处不再演示,但根据以上的步骤是可以正常连接的。注意是 rdp 协议的3389端口进行 win 远程连接。
四、FAQ
4.1 MySQL 版本问题
注意:数据库版本问题 5.7.7 不行
ERRORS:
acls.LoginACL: (fields.E180) MySQL does not support JSONFields.
acls.LoginAssetACL: (fields.E180) MySQL does not support JSONFields.
acls.LoginAssetACL: (fields.E180) MySQL does not support JSONFields.
acls.LoginAssetACL: (fields.E180) MySQL does not support JSONFields.
applications.Application: (fields.E180) MySQL does not support JSONFields.
notifications.SystemMsgSubscription: (fields.E180) MySQL does not support JSONFields.
notifications.UserMsgSubscription: (fields.E180) MySQL does not support JSONFields.
terminal.Task: (fields.E180) MySQL does not support JSONFields.
tickets.ApprovalRule: (fields.E180) MySQL does not support JSONFields.
tickets.Ticket: (fields.E180) MySQL does not support JSONFields.
tickets.Ticket: (fields.E180) MySQL does not support JSONFields.
2021-11-20 08:50:15 Perform migrate failed, exit
# 由于JumpServer使用了较新的Django版本,因此对数据库的版本也有一定的要求
# Django最新版v3.1的主要更新之一便是完善了对JSON数据存储的支持,新增models.JSONField和forms.JSONField,可在所有受支持的数据库后端上使用
# 目前支持的数据库以及对应版本主要有MariaDB 10.2.7+,MySQL 5.7.8+,Oracle,PostgreSQL和SQLite 3.9.0+
# 但个别Django的查询方法可能与部分数据库不兼容,例如contains和contained_by就不支持Oracle和SQLite数据库
4.2 Redis 版本问题
对于 Redis 版本的话,建议是 >= 5.0,本次使用的是6.2.6版本。因为对于较新版本的 Redis,小版本可能会出现 JumpServer 无法连接的情况。Redis 的话用于数据缓存,提高请求响应,降低 HTTP 请求次数。
总结
应用部署其实很简单,注意一些服务的版本即可(因为可能不兼容),对于线上的 JumpServer 大家可以根据公司的实际情况进行部署,比如购买企业版的 JumpServer,这样会更加安全,对于一些初创型公司,可以考虑先使用开源的 JumpServer,条件允许的话可以进行二次开发。