Jumpserver的部署和使用

1.Jumpserver简介

JumpServer 是全球首款完全开源的堡垒机, 使用 GNU GPL v2.0 开源协议, 是符合 4A 的专业运维审计系统。

JumpServer 使用 Python / Django 进行开发, 遵循 Web 2.0 规范, 配备了业界领先的 Web Terminal 解决方案, 交互界面美观、用户体验好。

JumpServer 采纳分布式架构, 支持多机房跨区域部署, 中心节点提供 API, 各机房部署登录节点, 可横向扩展、无并发访问限制。

JumpServer 现已支持管理 SSH、 Telnet、 RDP、 VNC 协议资产。

更多详细信息,请参考官方地址:https://docs.jumpserver.org/zh/master/

1.特色优势

  • 开源: 零门槛,线上快速获取和安装;
  • 分布式: 轻松支持大规模并发访问;
  • 无插件: 仅需浏览器,极致的 Web Terminal 使用体验;
  • 多云支持: 一套系统,同时管理不同云上面的资产;
  • 云端存储: 审计录像云端存储,永不丢失;
  • 多租户: 一套系统,多个子公司和部门同时使用。


2.功能列表

 

2.JumpServer的部署

我这里按照容器化的方式进行部署演示,其他部署方式可以参考官方文档https://docs.jumpserver.org/zh/master/install/docker_install/

jumpserver容器化部署,主要分为三个部分,mysql数据库的容器化部署,redis的容器化部署,jumpserver容器的启动。为了更好的部署,保证数据的安全和服务的性能,一般建议就是mysql,redis,jumpserver分开部署,不部署在一台机器上。我这里为了演示方便,就把三个服务部署到一台机器上,其实我选择容器化部署的原因就是,可以在一台服务器进行部署,互不影响,jumpserver镜像集成了所需要的组件, 支持使用外置 Database 和 Redis。不用像非容器化部署一样,还需要安装一堆依赖组件。

1.环境要求

硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘(最低)
操作系统: Linux 发行版 x86_64

Python = 3.6.x
Mysql Server ≥ 5.6
Mariadb Server ≥ 5.5.56
Redis
提前在服务器上安装好docker环境,可以参考我的其他文章,这里就不介绍了。

2.部署mysql容器服务

#从上面的环境要求我们看出,jumpserver依赖的外置数据库服务有版本要求,我们这里从官方容器仓库中直接拉取mysql5.7版本的镜像。
[root@jumpserver-no ~]# docker pull mysql:5.7 #我们在宿主机上准备好mysql的配置文件和数据存放目录,后面mysql容器启动的时候直接挂载宿主机目录,使数据保存在宿主机,实现数据和容器的分离,
可以在容器运行异常时,可以再启动一个新的容器直接使用宿主机的数据,从而保证业务的正常运行
[root@jumpserver
-no ~]# mkdir /iflytek/mysql/mysql.conf.d -pv [root@jumpserver-no ~]# mkdir /iflytek/mysql/conf.d -p [root@jumpserver-no ~]# mkdir /iflytek/mysql/data [root@jumpserver-no mysql]# cat /iflytek/mysql/mysql.conf.d/mysqld.cnf # Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License, version 2.0, # as published by the Free Software Foundation. # # This program is also distributed with certain software (including # but not limited to OpenSSL) that is licensed under separate terms, # as designated in a particular file or component or in included license # documentation. The authors of MySQL hereby grant you an additional # permission to link the program and your derivative works with the # separately licensed software that they have included with MySQL. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License, version 2.0, for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # The MySQL Server configuration file. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql #log-error = /var/log/mysql/error.log # By default we only accept connections from localhost #bind-address = 127.0.0.1 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [root@jumpserver-no mysql]# cat /iflytek/mysql/conf.d/mysql.cnf [mysql] default-character-set=utf8 #启动Mysql容器,挂载上面准备好的配置文件和数据存放目录。然后通过-e MYSQL_ROOT_PASSWORD指定启动的mysql的root密码
[root@jumpserver
-no ~]# docker run -it -d -p 3306:3306 -v /iflytek/mysql/mysql.conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /iflytek/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf -v /iflytek/mysql/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD="Liu@2020" mysql:5.7 9c7b2bc71c84137b10430d9f0e41f80ec63997e65390e1a64160dffcef853c64 #安装mysql客户端,测试访问容器数据库是否正常
[root@jumpserver
-no mysql]# yum install mysql-client [root@jumpserver-no mysql]# mysql -uroot -pLiu@2020 -h172.31.242.80 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.31 MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) #验证数据库的字符编码是否符合要求,jumpserver要求数据库字符编码为utf8,不然后面web显示可能会有问题 mysql> show global variables where variable_name like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) #创建jumpserver数据库,并指定字符编码 mysql> create database jumpserver default charset 'utf8' collate 'utf8_bin'; Query OK, 1 row affected (0.00 sec) #创建jumpserver访问用户,并赋权。 mysql> grant all on jumpserver.* to 'jumpserver'@'%' identified by 'Liu@2020'; Query OK, 0 rows affected, 1 warning (0.00 sec)

 #验证jumpserver用户授权是否成功

[root@jumpserver-no mysql]# mysql -ujumpserver -pLiu@2020 -h172.31.242.80
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.31 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jumpserver         |
+--------------------+
2 rows in set (0.00 sec)

3.部署redis容器服务

#直接从官方仓库拉取redis镜像,并启动
[root@jumpserver-no ~]# docker pull redis:4.0.14 [root@jumpserver-no ~]# docker run -it -d -p 6379:6379 redis:4.0.14 9cb2b24d2008a541635dc5f9fd21b843cb3c6e04517192ab7442e4eea9d66521 #安装redis,并测试访问redis容器服务,这里还可以设置一个redis的数据库密码,我这里就没设了,设不设问题不大,不过为了安全建议设
[root@jumpserver
-no ~]# yum install redis -y [root@jumpserver-no ~]# redis-cli -h 172.31.242.80 172.31.242.80:6379> info # Server redis_version:4.0.14 redis_git_sha1:00000000 .......

4.生成随机加密秘钥和初始化token

#我这里通过脚本直接生成。
[root@jumpserver-no ~]# cat random_encryption.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@jumpserver-no ~]# bash random_encryption.sh Ty79C2b0CUgYHVDI6nog9hx0Mx55skIXP4piiSHtY1KKtD8Vt6 tFG4SfQae8L0Fzwn

5.部署jumpserver容器服务

#从网上直接拉取最新的jumpserver镜像
[root@jumpserver-no ~]# docker pull jumpserver/jms_all:latest [root@jumpserver-no ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 718a6da099d8 2 days ago 448MB jumpserver/jms_all latest 6e51b94ef54d 2 days ago 1.48GB redis 4.0.14 191c4017dcdd 3 months ago 89.3MB centos/mysql-57-centos7 latest f83a2938370c 10 months ago 452MB
#通过镜像,启动jumpserver
[root@jumpserver-no ~]# docker run --name PL_jumpserver -d \
> -v /iflytek/jumpserver:/opt/jumpserver/data/media \
> -p 80:80 \
> -p 2222:2222 \
> -e SECRET_KEY=Ty79C2b0CUgYHVDI6nog9hx0Mx55skIXP4piiSHtY1KKtD8Vt6 \ #这里填的是上面生成的秘钥
> -e BOOTSTRAP_TOKEN=tFG4SfQae8L0Fzwn \ #这里上面生成的Token
> -e DB_HOST=172.31.242.80 \ #指定mysql服务的地址,因为我这里是本机,所以直接填本机地址就可以了,如果是在别的机器部署的mysql,就填mysql所在地址就可以了
> -e DB_PORT=3306 \ #mysql开发的端口号
> -e DB_USER=jumpserver \ #对数据库上的jumpserver数据库有权限的用户
> -e DB_PASSWORD=Liu@2020 \ #上面用户的密码
> -e DB_NAME=jumpserver \ #指定在mysql上的数据库名。
> -e REDIS_HOST=172.31.242.80 \ #redis服务的地址
> -e REDIS_PORT=6379 \ #redis开放的端口号
> -e REDIS_PASSWORD= \ #redis数据库密码,因为我上面没有设密码,所以我这里直接为空就可以了,如果设了密码,就输入密码就行了
> jumpserver/jms_all:latest
afbd6023d8c0c4bd8a269cd4bbd998d409f76f71608ad5d112f26f9460841eed

启动完之后。我们进入数据库,验证数据库内容,看jumpserver数据是否写入到数据库中的。

[root@jumpserver-no ~]# mysql -uroot -pLiu@2020 -h 172.31.242.80
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 65
Server version: 5.7.31 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> use jumpserver;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------------------------------------+
| Tables_in_jumpserver                         |
+----------------------------------------------+
| applications_databaseapp                     |
| applications_remoteapp                       |
| assets_adminuser                             |
| assets_asset                                 |
| assets_asset_labels                          |
| assets_asset_nodes                           |
| assets_assetgroup                            |
| assets_authbook                              |
| assets_cluster                               |
| assets_commandfilter                         |
| assets_commandfilterrule                     |
| assets_domain                                |
| assets_favoriteasset                         |

至此,服务部署完成,如果想看容器日志信息的话可以执行下面的命令

[root@jumpserver-no ~]# docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                        NAMES
afbd6023d8c0        jumpserver/jms_all:latest   "./entrypoint.sh"        33 seconds ago      Up 32 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:2222->2222/tcp   PL_jumpserver
9cb2b24d2008        redis:4.0.14                "docker-entrypoint.s…"   52 minutes ago      Up 52 minutes       0.0.0.0:6379->6379/tcp                       suspicious_fermi
9c7b2bc71c84        mysql:5.7                   "docker-entrypoint.s…"   2 hours ago         Up 2 hours          0.0.0.0:3306->3306/tcp, 33060/tcp            lucid_hypatia
[root@jumpserver-no ~]# docker logs -f afbd6023d8c0
。。。。。
2020-08-07 13:52:56 Collect static files
2020-08-07 13:53:00 Collect static files done
guacd[136]: INFO:    Guacamole proxy daemon (guacd) version 1.2.0 started
Starting guacd: SUCCESS
Tomcat started.
Jumpserver ALL v2.1.1
官网 http://www.jumpserver.org
文档 http://docs.jumpserver.org
有问题请参考 http://docs.jumpserver.org/zh/docs/faq.html

进入容器命令 docker exec -it jms_all /bin/bash

下面我们可以访问web界面进行使用了

3.Jumpserver管理员的使用

1.Jumpserver的登录

 

2.在使用Jumpserver过程中的一些名词解释

用户:用户是授权和登陆jumpserver的主体,将来为每个员工建立一个账户,用来登录跳板机, 将资产授权给该用户,查看用户登陆记录命令历史等。

用户组:多个用户可以组合成用户组,为了方便进行授权,可以将一个部门或几个用户 组建成用户组,在进行授权中使用组授权,该组中的用户拥有所有授权的主机权限。

资产:资产通常是我们的服务器、网络设备等,将资产授权给用户,用户则会有权限登 录资产,执行命令等。

管理账户:添加资产时需要添加一个管理账户,该账户是该资产上已有的有管理权限的用户, 如root,或者有 NOPASSWD: ALL sudo权限的用户,该管理账户用来向资产推送系统用户, 为系统用户添加sudo,获取资产的一些硬件信息。(简单的讲就这用户就是服务器上的管理员用户,列如root

资产组:同用户组,是资产组成的集合,为了方便授权。

Sudo:这里的sudo其实是Linux中的sudo命令别名,一个sudo别名包含多个命令, 系统用户关联sudo就代表该系统用户有权限sudo执行这些命令。

系统用户系统用户是服务器上建立的一些真实存在的可以ssh登陆的用户,如 dev, sa, dba等,系统用户可使用jumpserver推送到服务器上,也可以利用自己公司 的工具进行推送,授权时将用户、资产、系统用户关联起来则表明用户有权限登陆该资产的这个系统用户,比如用户小明 以 dev系统用户登录 172.16.1.1资产, 简单理解就是 将某个资产在进行授权给某个用户(这里的用户是上面的第一个用户的概念)后,该资产上一个非root的用户的账号(也就是系统用户)和这个jumpserver登录用户关联了,jumpserver用户登录进资产后不是通过jumpserver用户名进行登录的,而是这个所谓系统用户进行登录的。

推送系统用户:添加完系统用户,需要推送,推送操作是使用ansible,把添加的系统用户和系统用户管理的sudo,推送到资产上,具体体现是在资产上useradd该系统用户,设置它的key,然后设置它的sudo,为了让用户可以登录它。 

授权规则授权规则是将资产系统用户和用户关联起来,用来完成授权。 这样用户就可以以某个系统用户账号登陆资产。大家对这好像不是很理解,其实也是对系统用户, 用户这里没有搞清楚。我们可以把用户当做虚拟的用户,而系统用户是真实再服务器上存在的用户, 系统用户可以使用jumpserver推送,也可以自己手动建立,但是推送的过程一定要有,哪怕是模拟 推送(不选择秘钥和密码推送,如网络设备),因为添加授权规则会检查推送记录。为了简化理解, 我们暂时 以 用户 资产 系统用户 来理解,暂时不考虑组,添加这样的规则意思是 授权 用户 在这个资产上 以这个系统用户来登陆, 系统用户是一组具有通用性,具有sudo的用户, 不同的用户授权不同的 系统用户,比如 dba可能有用数据库的sudo权限。

日志审计:分为以下5个方式:1)在线:查看当前在线的用户(非web在线),可以监控用户的命令执行,强制结束用户 登录;2)实时监控:实时监控用户的操作;3)登录历史:查看以往用户的登录历史,可以查看用户登陆操作的命令,可以回放用户 执行命令的录像;4)命令记录:查看用户批量执行命令的历史,包含执行命令的主机,执行的命令,执行的结果;5)上传下载:查看用户上传下载文件的记录。

3.创建相关用户,资产并进行相关授权操作

创建jumpserver登录用户

 

 

 

 创建管理员用户

 

 创建系统用户

 

 

 

 创建资产

 

 

 

 

 

 

资产授权

 

 

 

4.普通用户的相关登录使用

 

1.web界面的相关使用

上面的一系列步骤做完之后,我们就可以通过jumpserver用户进行登录了。我们这里拿刚刚创建的ceshi2用户进行示范。登录之后我们看到下面的界面

 

 

 

 一般用户通过web界面登录进服务器后,因为登录进的系统用户只是一般用户,所以有时候很多命令不能执行,操作起来也不方便,所以一般我们会通过sudo su的命令临时切换到root用户进行操作。不过sudo su一般需要你输入当前用户的密码,也就是现在系统用户的密码,但是一般不建议把系统用户密码外泄。所以我们在把服务器纳入jumpserver管理的之前,一般会在服务器上已root执行一下如下脚本。

#/bin/bash
chmod u+w /etc/sudoers
sed -i '/^root/a\ZF-USER  ALL=(ALL)  NOPASSWD: ALL' /etc/sudoers
chmod u-w /etc/sudoers

 这样我们就可以通过sudo su免秘钥切换到root用户(这里可能会有用户会问,root用户操作不是不安全吗?对,可能是不安全,但是这个不安全是相对的,以前的话,如果别人已root用户操作,造成系统故障,可能都找不到操作人,但现在不一样,你如果想切换到root用户操作,你只能通过jumpserver登录后进到资产中进行切换,这样做到任何操作有迹可循,不泄漏系统用户密码的原因是,防止用户绕过jumpserver直接登录服务器进行root用户切换

这里还有用户可能会问,我们通过浏览器web界面的方式登录资产服务器是没问题啊,但是我经常要传输文件到服务器上,web界面的方式怎么传输文件到服务器。我们看下面的步骤,解决了我们的问题

 

 

 

 

 2.xshell的相关使用

有人习惯用xshell黑窗口看日志,还有当传大文件到服务器上的时候,就不建议通过web的方式传文件。而是推荐xshell的方式,jumpserver提供这样的方式,确保堡垒机已经安装coco组件(容器部署的默认安装了此组件),具体如下:

 

 

 

posted @ 2020-08-07 12:03  清白之年980410  阅读(7584)  评论(1编辑  收藏  举报