目录
前言
在我之前的博文中有过详细的部署过程,不过那是以源码的形式进行部署的,大家感兴趣的话可以去看一看——《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):
-
Docker
Version:18.06.3-ce
-
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=susonedu@123 -p 3306:3306 -v /data/mysql/data:/var/lib/mysql mysql:8.0.27 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
4、查看容器状态
sudo docker ps
5、创建数据库及程序用户
-
登录数据库
sudo docker exec -it mysql /bin/bash mysql -uroot -psusonedu@123
-
创建数据库
create database jumpserver default charset 'utf8mb4';
-
创建程序用户
create user 'jumpserver'@'%' identified by 'zhurs@123';
-
授权用户对应数据库
grant all on jumpserver.* to 'jumpserver'@'%';
对于mysql8.0+,创建用户和授权须分开进行。
-
刷新授权表
flush privileges;
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 --sysctl net.core.somaxconn=1024 redis:6.2.6 --requirepass "zhurs@123"
4、查看容器状态
sudo docker ps
2.4 JumpServer 部署
1、创建数据目录
sudo mkdir -p /data/jumpserver
2、pull 镜像
sudo docker pull jumpserver/jms_all:v2.16.0
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=if0DW4VrB08z5uTzd7uGvVNeVoTIwZryZ0emRu1cxDem7XGYwx \
-e BOOTSTRAP_TOKEN=VJLH1ZjjwpRvknws \
-e DB_HOST=192.168.1.146 \
-e DB_PORT=3306 \
-e DB_USER=jumpserver \
-e DB_PASSWORD="zhurs@123" \
-e DB_NAME=jumpserver \
-e REDIS_HOST=192.168.1.146 \
-e REDIS_PORT=6379 \
-e REDIS_PASSWORD="zhurs@123" \
jumpserver/jms_all:v2.16.0
注意:保存好 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,条件允许的话可以进行二次开发。