一.简介

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

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

b78e8620e07cf22a99720bdcff3d8a03.png

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

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


925dcde6850d12bea4ecff975a533675.png

二.jumpserver架构图

277de2fb144dc1700c80913f62f8bcd7.png


7cdedf054795e945b26d697cbb57cc32.png

三.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忽略名称解析:

817c260291b6679263413c339e5b2477.png

启动mariadb:

042b1af7eb2f548262a5614cb1ae0d03.png

连接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:

e5488dfd5342b043fa7208aba7ca3fbd.png

验证:登录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命令验证加速器地址是否应用:

43aa3e3e78cb8b840eac54c19de4a1b5.png

下载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端口。

查看日志:

febd156c22cf6d74fd46a5c44291ec4f.png

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

访问jumpserver:

353c94843d80627572eb854e71baeca1.png

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

2d6558d00ed2c7ab517544db140fb788.png

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

facdfc28f0c03dd29b640f6ca0b8f811.png

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

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

0b5f9e5dbe4601850419c68ef84575ad.png

四.jumpserver使用

1.jumpserver基本设置:

a1931919936a1bfaa821f485680277bf.png

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

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

5a5a1c01f4e315c9d1991d9d83e21242.png

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

3.创建用户:

1538570200b7b8d2491ffb349d4a77d0.png

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

c15ef71075795f649e504f008e616d83.png

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

4a0e63b0b3a5c7db324826ea270e3405.png

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

0617dce5dabb0691d48aba1c9505ec14.png

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

b85a767c8fed010b387cee858a8de53c.png

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

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

8b9c8b9fd5c843fe16a3cca6fae89e69.png

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

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

204ada0b762ee6cf6c479293496eabfb.png

2eefe79e91b204cb10c6ab6963f76e9d.png

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

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

7.创建资产:

a0c0ee8f74289018d86ba19d44f5176d.png

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

dd51c5b2fb638b9772774e92f901aded.png

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

8.资产授权:

2f095bbdf3629ef9d213845804f82950.png

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

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

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

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

a3cd0ebcb756b91387e34f6194c9d7d4.png

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

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

763363953e833699d3a92852b9d377cc.png

acd693226ef51cc8f09700b01e0ccaad.png

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

9.查看用户操作预览:

d0d76ec60d539c111885aa4bf882035e.png

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

24a78762505f4caa6e82ef99f1675b39.png

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

文章来源网络  侵删

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐