当前位置: 首页 > 工具软件 > JumpServer > 使用案例 >

堡垒机 jumpserver

朱运诚
2023-12-01

1. 堡垒机介绍

在一个特定网络环境下, 为了保障网络和数据不受外界入侵和破坏, 而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态、安全事件、网络活动, 以便集中报警、及时处理及审计定责。

我们又把堡垒机叫做跳板机, 简易的跳板机功能简单, 主要核心功能是远程登录服务器和日志审计。

比较优秀的开源软件 jumpserver, 认证、授权、审计、自动化、资产管理。

商业堡垒机: 齐治, Citrix XenApp

2. 开源堡垒机 jumpserver 介绍

  • 官网 http://www.jumpserver.org, 国人开发的
  • Jumpserver 是一款使用 Python, Django 开发的开源跳板机系统, 助力互联网企业高效 用户、资产、权限、审计 管理
  • Auth 统一认证
  • CMDB 资产管理
  • 统一授权
  • 日志审计
  • 自动化运维 (ansible)
  • 最新版 v0.4.0, 基于 python3.6, django 1.11, 目前还未开发完成, 所以我们接下来将要安装 v0.3.2

3. Jumpserver 的用户

  • jumpserver 用户用来登录 jumpserver(web 界面、ssh 登录)
  • 管理用户用来自动创建客户机上的系统用户、批量执行命令等操作
  • 客户机上的系统用户, 用来通过 jumpserver 去登录每一台客户机的用户

4. Jumpserver 使用

  • 浏览器输入 ip:8000 访问 jumpserver
  • 默认用户名是 admin, 密码是 5Lov@wife
  • 点击用户管理, 选择用户, 点击 Administrator 那一行右侧的更新, 设置密码
  • 创建用户组 运维
  • 创建用户 aming
  • 点击设置, 默认管理用户, 该用户为管理员用户, 应该有 sudo 权限, 需要在每一台客户机上创建该用户 (用户名自定义, jump)
  • 在一台 linux 机器上生成一个密钥对, 用来作为该管理用户的密钥对
  • 把私钥粘贴到默认密钥下面
  • 在客户机上创建 jump 用户, 并设置 sudo 权限, 把刚刚生成的密钥对里面的公钥放到该客户机的 jump 用户家目录. ssh/authorized_keys 文件里
  • 资产管理, 查看资产组, 添加资产组 (如, dev)
  • 资产管理, 查看资产, 添加资产, 填写各项信息
  • 授权管理, 系统用户, 添加系统用户, 该用户为我们登录所有客户机的用户
  • 授权规则, 添加规则, 创建授权规则
  • 普通用户的密码以及密钥下载地址、密钥密码都会通过邮件的方式发送给用户
  • 浏览器登录普通用户, 可以查看有权限的主机, 也可以在 web 界面下登录主机、上传和下载文件
  • xshell 创建新的连接
  • ip 为 jumpserver 的 ip, 端口为 22
  • 用户名为普通用户名字 (aming)
  • 设置密钥认证
  • 连接后, 出现登录页面, 数据 p 查看所有被授权主机
  • 输入主机前面的数字可以登录到对应的主机下面

5. 手把手从 0 开始教你搭建 Jumpserver, 为服务器安全保驾护航

5.1. Jumpserver 简单介绍

Jumpserver 是全球首款完全开源的堡垒机, 使用 GNU GPL v2.0 开源协议, 是符合 4A(认证 Authentication、授权 Authorization、记账 Accounting、审计 Audit) 的专业运维审计系统。Jumpserver 使用 Python / Django 进行开发, 遵循 Web 2.0 规范, 配备了业界领先的 Web Terminal 解决方案, 交互界面美观、用户体验好。

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yx9ETNHo-1670571726181)(http://pfpcar3om.bkt.clouddn.com/server-jumpserver-nginx.webp)]

5.2. 组件说明

  • Jumpserver
    现指 Jumpserver 管理后台, 是核心组件 (Core), 使用 Django Class Based View 风格开发, 支持 Restful API。

  • Coco
    实现了 SSH Server 和 Web Terminal Server 的组件, 提供 SSH 和 WebSocket 接口, 使用 Paramiko 和 Flask 开发。

  • Luna
    现在是 Web Terminal 前端, 计划前端页面都由该项目提供, Jumpserver 只提供 API, 不再负责后台渲染 html 等。

  • Guacamole
    Apache 跳板机项目, Jumpserver 使用其组件实现 RDP 功能, Jumpserver 并没有修改其代码而是添加了额外的插件, 支持 Jumpserver 调用。

  • Jumpserver-Python-SDK
    Jumpserver API Python SDK, Coco 目前使用该 SDK 与 Jumpserver API 交互。

参考文章: http://docs.jumpserver.org/zh/latest/admin_instruction.html

5.3. 安装环境准备

  1. 系统环境说明
[root@test ~]# cat /etc/redhat-release 
[root@test ~]# uname -r
[root@test ~]# ip add|grep 192.168.22
    inet 192.168.22.175/24 brd 192.168.22.255 scope global ens32
  1. 关闭防火墙与 selinux
[root@test ~]# systemctl stop firewalld
[root@test ~]# systemctl disable firewalld
[root@test ~]# sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config
[root@master ~]# grep "SELINUX=" /etc/selinux/config 
[root@test ~]# reboot

5.3.1. 准备 Python3 和 Python 虚拟环境

  1. 安装依赖包
[root@test ~]# yum -y install wget sqlite-devel xz gcc automake zlib-devel openssl-devel epel-release git
  1. 编译安装 python
[root@test ~]# wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
[root@test ~]# tar xf Python-3.6.1.tar.xz
[root@test ~]# cd Python-3.6.1
[root@test Python-3.6.1]# ./configure
[root@test Python-3.6.1]# echo $?
0
[root@test Python-3.6.1]# make && make install
[root@test Python-3.6.1]# echo $?
0
  1. 建立 Python 虚拟环境

因为 CentOS 6/7 自带的是 Python2, 而 Yum 等工具依赖原来的 Python, 为了不扰乱原来的环境我们来使用 Python 虚拟环境。

[root@test Python-3.6.1]# cd /opt/
[root@test opt]# python3 -m  venv py3
[root@test opt]# source /opt/py3/bin/activate
(py3) [root@test opt]#
# 看到上面的提示符代表成功, 以后运行 Jumpserver 都要先运行以上 source 命令, 以下所有命令均在该虚拟环境中运行
(py3) [root@localhost py3]

5.4. 安装 jumpserver

(py3) [root@test opt]# pwd
/opt
(py3) [root@test opt]# git clone --depth=1 https://github.com/jumpserver/jumpserver.git
(py3) [root@test opt]# cd jumpserver/
(py3) [root@test jumpserver]# git checkout master
Already on 'master'

安装依赖 RPM 包

(py3) [root@test jumpserver]# cd /opt/jumpserver/requirements/
(py3) [root@test requirements]# yum -y install $(cat rpm_requirements.txt)
# 无任何报错即可完成

安装 Python 库依赖

(py3) [root@test requirements]# pip install -r requirements.txt
这里官方比较坑, 说不要指定源, 不指定源根本装不了, 可根据实际情况指定相关的新 pip 源进行安装, 实在安装不了的, 下载源码包手工安装。

安装 Redis

Jumpserver 使用 Redis 做 cache 和 celery broke
(py3) [root@master opt]# yum -y install redis
(py3) [root@master opt]# service redis start
(py3) [root@master opt]# lsof -i :6379

安装 MySQL

这里直接使用二进制安装包安装。

(py3) [root@master opt]# /etc/init.d/mysqld start
(py3) [root@master opt]# lsof -i :3306

创建数据库 Jumpserver 并授权

(py3) [root@master opt]# mysql -uroot -p

MySQL [(none)]> create database jumpserver default charset 'utf8';

MySQL [(none)]> grant all on jumpserver.* to 'jumpserver'@'localhost' identified by '123456';

MySQL [(none)]> flush privileges;

修改 Jumpserver 配置文件

(py3) [root@master opt]# cd /opt/jumpserver/
(py3) [root@master jumpserver]# cp config_example.py config.py
(py3) [root@master jumpserver]# vim config.py
--------------------
# Default using Config settings, you can write if/else for different env
class DevelopmentConfig(Config):
    DEBUG = True
    DB_ENGINE = 'mysql'
    DB_HOST = '127.0.0.1'
    DB_PORT = 3306
    DB_USER = 'jumpserver'
    DB_PASSWORD = '123456'
    DB_NAME = 'jumpserver'
config = DevelopmentConfig()
# 增加上面的内容

生成数据库表结构和初始化数据

(py3) [root@master jumpserver]# cd /opt/jumpserver/utils/
(py3) [root@master utils]# bash make_migrations.sh

运行 jumpserver

(py3) [root@master utils]# cd  /opt/jumpserver/
(py3) [root@master jumpserver]# python run_server.py all

运行之后没有报错信息, 就可以使用浏览器访问了 http://server_ip:8080

默认用户名 / 密码: admin/admin 此时运行的只是 jumpserver 的 WEB 端, 如果需要访问访问 Web Terminal 会报错如下

5.4.1. 安装 SSH Server 和 WebSocket Server: Coco

新打开一个 SSH 终端连接去安装

下载项目文件

[root@master ~]# source /opt/py3/bin/activate
(py3) [root@master ~]# cd /opt/
(py3) [root@master opt]# git clone https://github.com/jumpserver/coco.git
(py3) [root@master opt]# cd coco && git checkout master
Already on 'master'

安装依赖

(py3) [root@master coco]# cd /opt/coco/requirements/
(py3) [root@master requirements]# yum -y  install $(cat rpm_requirements.txt)
(py3) [root@master requirements]# pip install -r requirements.txt
(py3) [root@master requirements]# echo $?
0
(py3) [root@master requirements]# cd /opt/coco/
(py3) [root@master coco]# cp conf_example.py conf.py
(py3) [root@master coco]# python run_server.py
# 此时需要去 WEB 管理后台确认注册信息

点击确认之后会出现下面的提示

2018-05-09 14:21:23 [service DEBUG] Set app service auth: 9f13a90b-80e4-47ae-b0ad-d825cff70ff0
2018-05-09 14:21:23 [service DEBUG] Service http auth: <jms.auth.AccessKeyAuth object at 0x7f5d1b18de10>
2018-05-09 14:21:23 [app DEBUG] Loading config from server: {"COMMAND_STORAGE": {"TYPE": "server"}, "REPLAY_STORAGE": {"TYPE": "server"}}
Wed May  9 14:21:23 2018
Coco version 1.3.0, more see https://www.jumpserver.org
Quit the server with CONTROL-C.
Starting ssh server at 0.0.0.0:2222
WebSocket transport not available. Install eventlet or gevent and gevent-websocket for improved performance.
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
# 出现上面的提示表示成功

测试连接

[root@testLinux1 ~]# ssh -p2222 admin@192.168.3.82
The authenticity of host '[192.168.3.82]:2222 ([192.168.3.82]:2222)' can't be established.
RSA key fingerprint is SHA256:Dw9BcxNFFZtgc1EpavxUeamzKT1VoX6UAPNIyzaEhpw.
RSA key fingerprint is MD5:16:d8:05:5e:12:9d:e5:54:ee:96:97:21:ab:33:2c:7e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.3.82]:2222' (RSA) to the list of known hosts.
admin@192.168.3.82's password: 
    Administrator, 欢迎使用 Jumpserver 开源跳板机系统  
    1) 输入 ID 直接登录 或 输入部分 IP, 主机名, 备注 进行搜索登录 (如果唯一).
    2) 输入 / + IP, 主机名 or 备注 搜索. 如: /ip
    3) 输入 P/p 显示您有权限的主机.
    4) 输入 G/g 显示您有权限的主机组.
    5) 输入 G/g + 组 ID 显示该组下主机. 如: g1
    6) 输入 H/h 帮助.
    0) 输入 Q/q 退出.
Opt>
# 能成功登录的表示安装部署成功

5.4.2. 安装 Web Terminal 前端: Luna

Luna 已改为纯前端, 需要 Nginx 来运行访问, 访问 (https://github.com/jumpserver/luna/releases) 下载对应版本的 release 包, 直接解压, 不需要编译。

(py3) [root@master opt]# docker run --name jms_guacamole -d \
-p 8081:8080 -v /opt/guacamole/key:/config/guacamole/key \
-e JUMPSERVER_KEY_DIR=/config/guacamole/key \
-e JUMPSERVER_SERVER=http://192.168.3.82:8080 \
registry.jumpserver.org/public/guacamole:1.0.0
# 然后去后台接受注册信息

需要注意的是修改默认 IP 如下图

5.4.3. 配置 Nginx 整合各组件

(py3) [root@master opt]# yum install nginx -y
(py3) [root@master opt]# cd /etc/nginx/
(py3) [root@master nginx]# cp nginx.conf nginx.conf.bak
(py3) [root@master nginx]# vim nginx.conf
server {
    listen 80;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location /luna/ {
        try_files $uri / /index.html;
        alias /opt/luna/;
    }

    location /media/ {
        add_header Content-Encoding gzip;
        root /opt/jumpserver/data/;
    }

    location /static/ {
        root /opt/jumpserver/data/;
    }

    location /socket.io/ {
        proxy_pass       http://localhost:5000/socket.io/;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /guacamole/ {
        proxy_pass       http://localhost:8081/;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        access_log off;
    }

    location / {
        proxy_pass http://localhost:8080;
    }
}
}
(py3) [root@master nginx]# nginx -t
(py3) [root@master nginx]# nginx
(py3) [root@master nginx]# lsof -i :80

最后通过 nginx 直接访问如下

5.4.4. 简单使用配置

系统几个用户的区别

  • 用户: 是指你在 web 上创建的用户, 会在跳板机上创建这个用户, 作用就是用于登录跳板机, 另外用户分为普通用户和超级管理员, 后者可以审计查看用户登陆记录、命令历史等

  • 管理用户: 是指客户端上的如 root 等高权限账号 (或普通用户拥有 NOPASSWD: ALL sudo 权限), 作用用于推送系统用户, 注意是已经在客户端用户上存在的用户。

  • 系统用户: 是指要在客户端上创建这个系统用户, 通过推送来实现, 作用就是登录客户端。

5.4.5. 管理用户和系统用户的关系

  • 两者都是客户端上的用户, 后者涉及到一个推送动作

  • 比如推送 test 系统用户, 也就是在客户端上创建 test 用户, 那么创建用户需要有权限

  • 有没有权限创建就要看你是用客户端的 root 用户还是普通用户做为管理用户

  • 如果后者做为管理用户就需要添加 sudo 权限又是 NOPASSWD: ALL

添加用户组

添加用户

这个用户是用于登录 jumpsesrver 的用户, 与后面的管理用户、系统用户没有关联。

添加完成

创建管理用户

这个用户必须具备客户端管理权限, 否则后面会有问题, 这里我以管理用户为例创建

添加系统用户

系统用户是 Jumpserver 跳转登录资产时使用的用户, 可以理解为登录资产用户, 如 web, sa, dba(ssh web@some-host), 而不是使用某个用户的用户名跳转登录服务器 (ssh xiaoming@some-host); 简单来说是 用户使用自己的用户名登录 Jumpserver, Jumpserver 使用系统用户登录资产。 系统用户创建时, 如果选择了自动推送 Jumpserver 会使用 ansible 自动推送系统用户到资产中, 如果资产(交换机、windows) 不支持 ansible, 请手动填写账号密码。 目前还不支持 Windows 的自动推送.
注: 这个系统在创建时, 是可以配置 sudo 权限的

创建资产

创建完成后, 可以在下面的界面测试连接性

点击更新硬件信息

点击测试可连接性

表示正常连接, 返回资产列表如下图

5.4.6. 测试登录效果

[root@test ~]# ssh -p2222 jumpserver@192.168.3.82
jumpserver@192.168.3.82's password: 

    登录到jumpserver, 欢迎使用Jumpserver开源跳板机系统  

    1) 输入 ID 直接登录 或 输入部分 IP,主机名,备注 进行搜索登录(如果唯一).
    2) 输入 / + IP, 主机名 or 备注 搜索. 如: /ip
    3) 输入 P/p 显示您有权限的主机.
    4) 输入 G/g 显示您有权限的主机组.
    5) 输入 G/g + 组ID 显示该组下主机. 如: g1
    6) 输入 H/h 帮助.
    0) 输入 Q/q 退出.

Opt> p

 ID Hostname        IP              LoginAs  Comment                                                                                                                                                              
  1 3.26            192.168.3.26    [3.16用户] 
  2 linux           192.168.3.16    [3.16用户] 

总共: 2 匹配: 2
Opt> 1
Connecting to testsysuser@3.26 0.6
[testsysuser@linux1 ~]$ pwd
/home/testsysuser
[testsysuser@linux1 ~]$ ip add |grep 192.168.1.
inet 192.168.3.26/24 brd 192.168.3.255 scope global ens160
#可以正常用系统用户来登录客户端主机了

WEB 端也可以看到在线的会话

历史会话

还可以看到具体回放功能, 点击回放可查看登录用户的操作过程

命令记录

整体仪表盘

 类似资料: