⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 网络 「网络」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

一.简介

前面我们聊到了openvpn的部署和使用,它能够实现从互联网通过openvpn连接到公司内网服务器,从而进行远程管理。

但openvpn有一个缺点不能记录用户内部网服务器上操作了什么,拥有客户端的证书和私钥以及ca的证书和客户端配置,就可以直接连接到公司内网,这从某些角度讲不是一个安全的解决方案。

今天我们来聊了一台和openvpn有类似功能的软件jumpserver。jumpserver和openvpn都可以让用户从互联网连接公司内部网服务器,但通常jumpserver都不会放在互联网上。

它主要用于运维、开发,以及测试相关人员来利用它连接公司内部网服务器,从而实现集中管理公司内部网服务器。同时跳转服务器还具有权限管理,用户管理以及监控重定向等功能。

二.jumpserver架构图

三.jumpserver服务器安装

环境说明:

主机名称 角色 ip地址
节点01 Jumpserver网站 192.168.0.41
节点02 mysql / redis 192.168.0.42

1.在node02上部署mariadb

(版本最低5.5.6,如果是mysql版本最低5.6)

配置mariadb yum仓库:

[root@node02 ~]# cat /etc/yum.repos.d/mariadb.repo
[mariadb]
name=mariadb repo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.1.46/yum/centos/7/x86_64/
gpgcheck=0[root@node02 ~]#

安装MariaDB服务器:

[root@node02 ~]# yum install -y MariaDB-server

配置mariadb忽略名称解析:

启动mariadb:

连接mariadb创建数据库和用户:

[root@node02 ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.46-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database jumpserver default charset 'utf8' collate 'utf8_bin';
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on jumpserver.* to 'jumpserver'@'%' identified by 'admin123.com';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]>

验证: 使用jumpserver登录数据库:

[root@node02 ~]# mysql -ujumpserver -padmin123.com -h192.168.0.42
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.1.46-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| jumpserver |
| test |
+--------------------+
3 rows in set (0.01 sec)

MariaDB [(none)]> exit
Bye
[root@node02 ~]#

到此,数据服务就准备好了。

2.在node02上部署redis

安装redis:

[root@node02 ~]# yum -y install redis

配置redis监听本机所有地址,并设置密码:

[root@node02 ~]# grep -Ei "^(bind|requirepass)" /etc/redis.conf
bind 0.0.0.0
requirepass admin123.com
[root@node02 ~]#

启动redis:

验证: 登录redis:

[root@node02 ~]# redis-cli -h 192.168.0.42
192.168.0.42:6379> KEYS *
(error) NOAUTH Authentication required.
192.168.0.42:6379> AUTH admin123.com
OK
192.168.0.42:6379> KEYS *
(empty list or set)
192.168.0.42:6379> exit
[root@node02 ~]#

到此,redis就准备好了。

3.在node01上部署jumpserver web容器

配置docker-ce的yum源:

[root@node01 ~]# cat /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-edge]
name=Docker CE Edge - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/edge
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-edge-debuginfo]
name=Docker CE Edge - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/edge
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-edge-source]
name=Docker CE Edge - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/edge
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[root@node01 ~]#

安装docker-ce:

[root@node01 ~]# yum install -y docker-ce

启动docker:

[root@node01 ~]# systemctl start docker
[root@node01 ~]# docker info
Client:
Debug Mode: false

Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 19.03.13
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-693.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.781GiB
Name: node01.test.org
ID: JQY2:LCCM:EU6J:ARI7:UCEL:5HUV:FGE4:6RTY:PWR3:NKJI:EA3K:BKSA
Docker Root Dir: /var/lib/docker Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false

[root@node01 ~]#

配置docker加速器:

[root@node01 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com","https://cyr1uljt.mirror.aliyuncs.com"]
}
[root@node01 ~]#

重启docker:

[root@node01 ~]# systemctl restart docker

使用doker info命令验证加速器地址是否应用:

下载jumpserver网站:

[root@node01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@node01 ~]# docker pull jumpserver/jms_all:v2.4.0
v2.4.0: Pulling from jumpserver/jms_all
75f829a71a1c: Pull complete
f9c494d6df5d: Pull complete
5135b4193f02: Pull complete
918e815b1dc8: Pull complete
0334369c4479: Pull complete
64a0f2a7663a: Pull complete
Digest: sha256:2081c88eca6dffb41bc42d8fe06d18c4379eacdbb354fa56dffd2a918738274d
Status: Downloaded newer image for jumpserver/jms_all:v2.4.0
docker.io/jumpserver/jms_all:v2.4.0
[root@node01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jumpserver/jms_all v2.4.0 3418bbaaded1 9 days ago 1.54GB
[root@node01 ~]#

编写生成SECRET_KEY和BOOTSTRAP_TOKEN的脚本:

[root@node01 ~]# cat key_gen.sh
#!/bin/bash
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
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
[root@node01 ~]#

提示: 上面脚本主要是判断是否有SECRET_KEY和BOOTSTRAP这两个键,如果没有就生成,并把SECRET_KEY保存到SECRET_KEY并放到当前家目录的.bashrc中,并打印出来,如果有就直接打印出来。

运行脚本生成SECRET_KEY和BOOTSTRAP_TOKEN:

[root@node01 ~]# bash key_gen.sh
wIUaeZtCbtTNUDL9igEIImALjjaMo9ygPwfMWmPZcyWD0c3K9Q
Lx15DW9xDxqOkiCq
[root@node01 ~]#

提示: 这两个随机密钥很重要,它已加密数据库并行用的,所以在环境迁移和升级都会用到这两个密钥。

创建用户保存jumpserver容器中的数据目录:

[root@node01 ~]# mkdir /data/jumpserver/ -pv
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/jumpserver/’
[root@node01 ~]#

启动jumpserver / jms_all:v2.4.0兼为容器:

[root@node01 ~]# docker run --name jms_all -d \
> -v /data/jumpserver/:/opt/jumpserver/data \
> -p 80:80 \
> -p 2222:2222 \
> -e SECRET_KEY=wIUaeZtCbtTNUDL9igEIImALjjaMo9ygPwfMWmPZcyWD0c3K9Q \
> -e BOOTSTRAP_TOKEN=Lx15DW9xDxqOkiCq \
> -e DB_HOST=192.168.0.42 \
> -e DB_PORT=3306 \
> -e DB_USER=jumpserver \
> -e DB_PASSWORD=admin123.com \
> -e DB_NAME=jumpserver \
> -e REDIS_HOST=192.168.0.42 \
> -e REDIS_PORT=6379 \
> -e REDIS_PASSWORD=admin123.com \
> --privileged=true \
> jumpserver/jms_all:v2.4.0
8974115a714c5000bac47a8a457190408861ad1967429435ad4f6a0b838c2fe3
[root@node01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8974115a714c jumpserver/jms_all:v2.4.0 "./entrypoint.sh" 14 seconds ago Up 12 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:2222->2222/tcp jms_all
[root@node01 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::2222 :::*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@node01 ~]#

提示: 以上启动容器主要指定了maradb和redis服务器的相关地址和密码端口信息,其中在主机上暴露了80和2222端口。

查看日志:

提示: 使用docker logs -f容器id能够看到上图中的信息,说明jumpserver容器就跑起来了。

访问jumpserver:

提示: 访问jumpserver容器所在主机的ip地址即可访问到jumpserver,设置用户名和密码都是admin。

提示: 第一次登陆时,它将为我们重设密码。

提示: 重设密码后,重新登录,jumpserver的家就是上图这样。后续我们就可以在这个界面来管理内网服务器了。

到此,jumpserver服务器就建造好了。

四.jumpserver使用

1.jumpserver基本设置:

提示:基本设置是必须设置当前jumpserver的网址和邮件主题前缀,这样在用户收到邮件中的链接都会指向这个jumpserver的网址。

2.配置jumpserver发邮件的邮件服务器和用户名密码:

提示: 在系统设置--->邮件设置,把对应的帐户信息,邮件服务器信息都填写好。然后测试连接,如果可以正常收到邮件,说明邮件服务器信息和邮件用户名密码没有问题,最后点提交即可。

3.创建用户:

提示: 在用户管理--->用户列表--->创建,填写好用户相关信息后,点击最下面的提交。

提示: 新建用户成功以后,对应的用户邮箱就会收到一份有跳转服务器发送到用户创建成功的邮件,用户可以点击此邮件中的链接进行密码设置。

提示: 密码设定好了,点击设置,用户会收到一份密码更新成功的邮件。

4.创建用户组,并把测试用户添加到对应的组中:

提示: 用户管理--->用户组---->创建,填充好组信息和选择好用户后,点击提交即可。

5.jumpserver资产管理--->管理用户创建:

提示: 资产管理---->管理用户---->创建,填写好对应被管控端的管理员和密码点击提交。管理用户是资产(被控服务器)上的root,或拥有NOPASSWD:ALL sudo权限的用户,JumpServer使用该用户来推进系统用户,获取资产硬件信息等。

6.创建系统用户,这里的系统用户是指我们使用jumpserver登录到对应的被管控主机时用的用户:

提示: 资产管理--->系统用户--->新建,填充好用户名,切换自动推和自动生成密钥,单击最下方的提交即可。

这里填充的用户会使用jumpserver上登录对应的主机用到用户,如果被管控端没有这个用户,jumpserver就会利用我们刚才添加的管理用户去创建一个这里的系统用户。

7.创建资产:

提示: 资产管理--->资产列表--->新建,填写对应被管控的主机信息和ip地址信息,以及管理用户,点击最下方的提交。

提示: 提交完成后,我们就可以在资产列表中看到我们刚才添加到主机。

8.资产授权:

提示: 权限管理--->资产授权--->创建,填充好名称后,要选择用户和组以及资产和系统用户,然后单击最下方的提交,到此一个资源就授权给测试用户和测试组中的成员了。

这里需要注意一点,一个例程中有很多服务器,如果你只想授权单台服务器给某个用户,下面的例程就留空。如果你想授权一个例程给用户你可以选择分组,上面的资产就可以留空。

如果你又想授权代理资产和某处给用户,就选择对应的资产和中断即可。如果这里选择默认实例,则表示将默认上游下的所有主机都授权给用户,默认默认包含所有主机。

验证:使用test用户登录jumpserver,看看test用户是否能够看到我们创造的资源?

提示: 首次登陆,它将为我们更新用户的信息,然后同一些条款,这个我们按照实际信息来修改即可。在我的资产中可以看到当前用户有点资产。

验证:使用test用户连接node01看看是否可以连接到node01?

提示: 可以看到测试用户是可以正常使用我们配置的jumpserver用户正常正常的连接到node01。

9.查看用户操作预览:

提示: 点击会话管理---->会话管理---->历史会话---->找到对应会话后面的替换即可查看对应用户在过去会话中执行的操作。

jumpserver的基本操作就到此为止,后续其他日志等,都可以在网站上点击对应的菜单查看,这里就不加以描述了。

文章目录
  1. 1. 一.简介
  2. 2. 二.jumpserver架构图
  3. 3. 三.jumpserver服务器安装
  4. 4. 四.jumpserver使用