JumpServer 架构浅解

Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能。基于ssh协议来管理,客户端无需安装agent。完全开源,GPL授权

设计思路

  • 设计一个跳转网关,所有登录操作都从网关通过
    网关具有模拟终端的功能,透明的中转ssh命令,以支持Tab,Ctrl+A,Ctrl-E等快捷键,网关既可以记录操作日志,又可以审计操作命令。

  • 设计一个认证模块
    为了实现认证功能,需要有个认证模块,认证信息存到数据库,用户使用跳板机首先需要认证。

  • 设计一个授权框架
    授权是跳板机不可缺少的部分,授权就是用户和资产的关系,将关系保存的数据库,用户登录主机需要先查授权。

  • 设计审计模块
    审计是为了追踪,我们支持了在线监控,命令统计,录像回放功能,供管理员审查。

  • 用户和主机模块
    跳板机脱离不了用户和主机,所以这两个部分是基本的模块,另外我们将主机模块扩展,实现基本CMDB功能。

  • Web Terminal
    现在都流行Web操作一切,于是我们又实现了Web Terminal,供用户直接在线链接服务器,这里实现是用了Tornado来完成的,Tornado实现WebSocket特别简单。

架构图

20200526180743745_415773244.png

组件说明

  • Jumpserver 为管理后台,管理员可以通过 Web 页面进行资产管理、用户管理、资产授权等操作,用户可以通过 Web 页面进行资产登录,文件管理等操作是核心组件(Core),使用 Django Class Based View 风格开发,支持 Restful API

  • Luna 为 Web Terminal Server 前端页面,用户使用 Web Terminal 方式登录所需要的组件 ( WebTerminalView )
    该组件由团队自己通过Angular 实现,Jumpserver 只提供 API,不再负责后台渲染html等。

  • Koko(CoCo) 为 SSH Server 和 Web Terminal Server 。用户可以使用自己的账户通过 SSH 或者 Web Terminal 访问 SSH 协议和 Telnet 协议资产。KoKo(最新版)是go版本的coco,新的Jumpserver ssh/ws server,重构了 coco 的 SSH/SFTP 服务和 Web Terminal 服务 ( WebSFTPView )

    SSH/SFTP/web terminal/web文件管理 ( WebSFTPView )
    实现了 SSH Server 和 Web Terminal Server 的组件,提供 SSH 和 WebSocket 接口,使用 Paramiko 和 Flask 开发

  • Guacamole 为 RDP 协议和 VNC 协议资产组件,用户可以通过 Web Terminal 来连接 RDP 协议和 VNC 协议资产 (暂时只能通过 Web Terminal 来访问)
    Guacamole Apache 跳板机项目,Jumpserver 使用其组件实现 RDP 功能,Jumpserver 并没有修改其代码而是添加了额外的插件,支持 Jumpserver 调用。

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

    为 Jumpserver ssh terminal 和 web terminal封装了一个sdk,完成和Jumpserver 交互的一些功能

    • Service 通用RestApi 接口类
    • AppService 增加了app注册等
    • UserService 用户使用该类
  • jms-storage-sdk
    主要作为录像存储的工具类,支持本地或其他cloud存储(e.g. oss)

端口说明

  • Jumpserver 默认端口为 8080/tcp 配置文件 jumpserver/config.yml

  • KoKo(Coco) 默认 SSH 端口为 2222/tcp,默认 Web Terminal 端口为 5000/tcp 配置文件在 KoKo(CoCo)/config.yml

  • Guacamole 默认端口为 8081/tcp,配置文件 /config/tomcat9/conf/server.xml

  • Nginx 默认端口为 80/tcp

  • Redis 默认端口为 6379/tcp

  • Mysql 默认端口为 3306/tcp

20200526180806315_1173897932.png

技术实现

使用技术

服务启动

./jms start 命令将会下面服务

20200528102354700_861856403.png

  • gunicorn - unix系统的wsgi http服务器,负责jsm-core的http请求

  • Daphne - 支持HTTP,HTTP2 和 WebSocket 的asgi的服务器,主要处理WebSocket请求

  • celery - 后台异步任务分发处理 -celery_ansible/celery_default
    简单、灵活且可靠的,处理大量消息的分布式系统;专注于实时处理的异步任务队列,同时也支持任务调度

  • flower - 负责监控 celery worker执行情况

Web Terminal

  • 主要通过Luna,koko 和Guacamole实现

Luna

  • 打开web terminal link 后,进入luna,luna 会通过api请求jms 的资源列表,进行树状展示

  • 当需要进行RDP访问时,会向guacamole进行post请求 /guacamole/api/session/ext/jumpserver/asset/add

  • 使用 mstsc.js 实现web版的javascript RDP client -https://github.com/citronneur/mstsc.js (很老的框架)
    使用 socket.io 和画布来绑定 mstsc.js 后端。 前端通过 rle.js 文件完成位图的解压缩

  • webterminal 前端由luna 里的html5 canvas 和js 渲染出来

  • Luna 使用了 "guacamole-common-js": "1.1.0", 提供了 Guacamole client的实现
    http://guacamole.apache.org/doc/guacamole-common-js/

    <div class="window" [ngClass]="{'active':view.active}" style="height: 100%">
      <elements-ssh-term
        [view]="view"
        [host]="view.host"
        [sysUser]="view.user"
        *ngIf="view.type=='ssh'"
      >
      </elements-ssh-term>
      <elements-guacamole
        [view]="view"
        [host]="view.host"
        [sysUser]="view.user"
        [remoteAppId]="view.remoteApp"
        *ngIf="view.type=='rdp'"
      >
      </elements-guacamole>
      <app-sftp *ngIf="view.type=='sftp'" [host]="view.host"></app-sftp>
    </div>
    

koko(ssh)

  • 老版本coco使用ssh python 库- Paramiko

  • koko 启动时候会注册到jms,需要配置中 “BOOTSTRAP_TOKEN” 与jump server保持一致,用于身份认证

  • 启动之后将会监听,当有新的ssh terminal窗口打开,就会尝通过websocket 建立ssh 连接 (依赖于Daphne),基于go的websocket实现

  • 用户在web terminal 窗口操作时,koko 会对命令解析,和jms里的过滤规则匹配

  • 连接中断后,开始上传录像(其实是json文件,记录了时序log)到jumpserver(/data/media)

  • 使用了websoket 框架 - https://github.com/kataras/neffos

    20200527094248561_866134588.png

Guacamole(rdp)

  • 对Apache Guacamole 进行了改造,主要是Guacamole client/server war包,看不到源码改造
  • 原生的Guacamole 本身可以单独提供 web terminal 服务,但是部署相对复杂,有单独的postgresql存储机器连接信息
  • 改造后的Guacamole (),也需要通过 BOOTSTRAP_TOKEN 注册到 jms

操作录像回放

  • 操作的录制: ssh 是由koko基于websocket data完成; rdp 是由Guacamole API 完成

  • 操作的回放:由 luna进行 replay 展示的,对ssh 录像(.json) 进行分割处理,使用js渲染成动画;

    <elements-replay-json [replay]="replay" *ngIf="replay.type=='json'"></elements-replay-json>
    <elements-replay-guacamole [replay]="replay" *ngIf="replay.type=='guacamole'"></elements-replay-guacamole>
    
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


随着云计算和网络技术的发展,越来越多的数据需要在服务器之间进行传输和共享。云挂机宝作为一种常见的服务器设备,具有高效、稳定的特性,使得它成为了许多企业和个人用户传输数据的首选。本文将讨论云挂机宝服务器
阿里云服务器Tomcat无法从外部访问一、环境阿里云Ubuntu 12.04.5 LTStomcat和java都是阿里云默认的7的版本,如下图二、问题部署后./startup.sh启动tomcat 之后外部访问http://ip:8080/无法访问,之后去查看防火墙关闭了Ubuntu下面的防火墙123
购买一系列的东西其实就是花钱买块区域,服务器,域名,云解析,花了好多money。。。一、租服务器百度搜索阿里云进入官网首页,点击登录进入登录页面,可以使用邮箱登录或者注册进入注册页面,填写注册信息登录成功,进入主页,点击云服务ECS,点击购买推荐或者选购配置根据实际情况选择产品,可能没有货,那么就需要更改购买条件如果是新用户,购买
前言昨天买了域名,服务器,然后搭建了环境,然后想他通过默认的端口,不用端口就访问。设置WEB项目的欢迎页在WEB-INF文件夹下有个web.xml文件(最近新建的项目不包含此文件,可以手动新建),在welcome-file-list节点中设置,代码如下 <welcome-file-list> <welcome-file>test.html</welcome-file>
前言由于服务器centos6.8安装mysql一直出现不能连接问题,然后看到一个方法,一不小心就把yum给删除了,都还原不了,很是绝望,很难受。然后没有yum这个centos就感觉废了,然后找方法装上去。 python --version查看python 版本 whereis python 查看python文件 python: /usr/bin/python2.6 /usr/bin/python
前言用 SSH客户端登录上以后,自己想要在本地连接服务器上的mysql服务器。解决方法1、首先启动数据库[root@iZm5ec880z2rorZ ~]# service mysqld start可以输入一下加粗命令:[root@iZm5ec880z2rorZ ~]# mysql -u root -p Enter password: (输入你的数据库密码)Welcome to the My
前言乱码问题是很让人抓狂的问题,下面我将记录一下Linux下MySQL乱码问题的解决方法。 mysql在linux下乱码问题一、操作mysql默认字符集是latin1,但是我们大部分程序使用的字符集是utf8,我们就需要修改mysql的字符集了。1)查看默认编码show variables like 'character%';+--------------------------+--------
问题描述今天阿里云服务器安装mysql的收,遇到了一个很熟悉的问题 输入#mysql -u root -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 解决方案一、方案1 1.#ps -A|grep mysql 显示类似:
今天在使用filezilla连接虚拟机中的ubuntu的时候出现上次出错,错误详情为:open for write: permission denied看完错误大概知道和权限有问题,再次查看虚拟机,我们使用以下命令给我们需要放入的目标文件权限:sudo chmod 777 /home再次尝试上传,上传成功! ...
直接上步骤,做一个简单的记录!配置阿里云oss找到对应的oss如果没有bucket,则新建一个新建之后,进入到对应的bucket,然后进行相关设置以上就是oss的基本设置,接下来是域名相关设置,这也是最重要的一些步骤。oss域名解析和cdn设置oss域名解析设置oss的域名设置是在传输管理下进行设置。如果没有域名,需要添加域名,没有注册域名自行注册。添加之后就会在上面列表上显示。以上就是域名的解析配置,期间还需要设置域名解析cname等。oss的cdn设置加速设置cdn
这个需要开放centos的端口和腾讯云服务器的端口。防火墙开放8080端口因为Centos7以上用firewalld代替了iptables,也就是说firewalld开通了8080端口应该就行了1.输入netstat -tunlp 查看8080是否放开。2.如果没有开放,输入firewall-cmd --state #查看防火墙状态。3.在running 状态下,向firewall 添加需要开放的端口firewall-cmd --permanent --zone=public --add-po
前言:博主资历尚浅,很多东西都还在刚起步学习的阶段,这几天开发任务比较轻,就在自己window系统下,模拟部署远程服务器,利用Jenkins + Ant + Tomcat 搭建了一个自动发布部署的环境
为了做集群测试,在每台机器上装了3个tomcat,每次发布项目的时候都要反复敲一些命令,重启 tomcat 之前先检查 tomcat 进程有没有停掉,没有还要手动 kill 该进程。 发布次数多了,操
Jenkins修改管理员密码,我看了网上所有的教程,竟然全都是拿着一串已经加密好的 111111 的密文去替代 config.xml 文件里面的密码,然后大家的密码都是 111111!我觉得这种做法实
一、四层与七层负载均衡在原理上的区别 1.图示 2.概述 四层负载均衡工作在 OSI 模型中的四层,即传输层。四层负载均衡只能根据报文中目标地址和源地址对请求进行转发,而无法修改或判断所请求资源的具体
和 window不同,在Linux压缩文件需要注意的是,压缩后的文件会把源文件给替代,无论是gzip、bzip2、xz 均不支持压缩目录,要达到压缩目录的目的,需要用到tar指令。 gzip 压缩 g
一、前言 随着每天业务的增长,Tomcat 的catalina.out日志 变得越来越大,占用磁盘空间不说。要查看某个时候的日志的时候,庞大的日志让你顿时无从下手,所以日志的切割的变得刻不容缓。而且,
一、安装 和 准备工作 我们选择了用 Tomcat 服务器下 war 包的安装方式。Jenkins 的下载地址:http://mirrors.jenkins-ci.org/,打开链接后,表格有war列
一、gcc gcc是Linux上面最标准的C语言的编译程序,用来源代码的编译链接。 gcc -c hello.c 编译产生目标文件hello.o gcc -O hello.c 编译产生目标文件,并进行
随着智能化互联时代的来临,家中的智能设备越来越多:电视机、平板、游戏主机、电脑、手机等遍及家中各个角落,同时设备之间共享数据的需求变的越来越强烈。比如同步、备份手机上的照片和视频,在电视机上观看电脑中