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

设计思路

  • 设计一个跳转网关,所有登录操作都从网关通过

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

  • 设计一个认证模块

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

  • 设计一个授权框架

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

  • 设计审计模块

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

  • 用户和主机模块

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

  • Web Terminal

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

架构图

组件说明

  • 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

技术实现

使用技术

服务启动

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

  • 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

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>

JumpServer 架构浅解的更多相关文章

  1. GIS历史概述与WebGis应用开发技术浅解

    声明:本篇在李晓晖的<杂谈WebGIS>,补充更多的资料说明.基于地图二次开发一直断断续续在做,这里算是补充一下基本功把.其实对于前端,WebGis开发都是api,抄demo,改.GIS深 ...

  2. NopCommerce源码架构详解--初识高性能的开源商城系统cms

    很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...

  3. 领域驱动设计(Domain Driven Design)参考架构详解

    摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...

  4. 从最大似然到EM算法浅解

    从最大似然到EM算法浅解 zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习十大算法之中的一个:EM算法.能评得上十大之中的一个,让人听起来认为挺NB的. ...

  5. WeChatAPI 开源系统架构详解

    WeChatAPI 开源系统架构详解 如果使用WeChatAPI,它扮演着什么样的角色? 从图中我们可以看到主要分为3个部分: 1.业务系统 2.WeChatAPI: WeChatWebAPI,主要是 ...

  6. hdfs文件系统架构详解

    hdfs文件系统架构详解 官方hdfs分布式介绍 NameNode *Namenode负责文件系统的namespace以及客户端文件访问 *NameNode负责文件元数据操作,DataNode负责文件 ...

  7. 基于puppet分布式集群管理公有云多租户的架构浅谈

    基于puppet分布式集群管理公有云多租户的架构浅谈 一.架构介绍   在此架构中,每个租户的业务集群部署一台puppet-master作为自己所在业务集群的puppet的主服务器,在每个业务集群所拥 ...

  8. NopCommerce源码架构详解

    NopCommerce源码架构详解--初识高性能的开源商城系统cms   很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从 ...

  9. RESTful 架构详解

    RESTful 架构详解 分类 编程技术 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次 ...

随机推荐

  1. Pycharm中对与Python的快捷方式

    转自博客园 @python~小成录 pycharm常用快捷键与设置   pycharm高频率使用的快捷键 Ctrl+Shift+F10 运行当前的页面 Ctrl + / 注释(取消注释)选择的行 Ct ...

  2. 浏览器自动化的一些体会4 webBrowser控件之零碎问题2

    1. DocumentCompleted的多次执行问题 有的网页,会多次触发DocumentCompleted事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意 ...

  3. JDK1.8源码学习-HashMap

    JDK1.8源码学习-HashMap 目录 一.HashMap简介 HashMap 主要用来存放键值对,它是基于哈希表的Map接口实现的,是常用的Java集合之一. 我们都知道在JDK1.8 之前 的 ...

  4. 【TTS】文本转语音?如何不调用第三方api来实现,使用pyttsx3

    @ 目录 前言 安装pyttsx3 实现TTS接口 后言 前言 本次的实现需求有点困难,所以也就记录下来,别到时候都忘了. 首先先不说正题,有兴趣的可以看一看: 1.目标是实现一个可以传一个文本就返回 ...

  5. 《Head First 设计模式》:适配器模式

    正文 一.定义 适配器模式将一个类的接口(被适配者),转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 要点: 适配器实现了目标接口,并持有被适配者的实例. 适配器使用被适配者的方 ...

  6. centos AAVMF_CODE.fd 文件下载

    centos: yum install AAVMF -y ubuntu: apt-get install qemu-efi*

  7. 从零开始的SpringBoot项目 ( 一 ) Spring、SpringMVC和SpringBoot

    要想开始一个SpringBoot项目 , 首先要知道SpringBoot是什么 , 可以做什么 , 再去研究怎么用 . 一.概念 1.Spring Spring是一个开源容器框架,可以接管web层,业 ...

  8. 焦大:seo该研究用户需求还是搜索算法

    http://www.wocaoseo.com/thread-62-1-1.html 上一篇博客我写了用户需求点是做seo排名最首要关注的东西,其实这个我在以前也一直说的,seo有两大核心,一个是检索 ...

  9. Java中解析wav音频文件信息:音频声道数,采样频率,采样位数、声音尺寸

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 音频解析方法: public static int toInt(byte[] b) { return ((b[3] << 2 ...

  10. 总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...