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>
    
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352