jumpserver二次开发改造方案

前言

jumpserver堡垒机管理了一套用户、资产、资产系统用户。但是如果我们已经建设了运维管理平台,那这一套数据原就存在于运维管理平台。出于统一配置,统一维护的需要,就存在2个基本需求:

  1. 页面统一入口:即jumpserver的页面集成在运维管理平台,用户不用登录jumpserver的管理系统。

  2. 数据共享问题:最好的方式是用户、资产、系统用户、以及授权规则统一在运维管理平台中配置,堡垒机通过服务从运维管理平台中获取相关数据。其次方案是堡垒机的数据从运维管理平台同步。

1. 如何集成SSH模式的webTerminal页面

【问题】:
1、项目中想要将jumpserver的webTerminal页面集成到运维管理平台中(比如在点击资产可以打开资产的终端命令页面),最理想的方法是jumpserver有提供登录鉴权api,先通过api实现鉴权认证,再单点到页面中。然而,jumpserver考虑的还是基于自身提供的管理系统使用webTerminal页面,并未考虑提供单点能力。api登录时,不会将登录信息设置在redis中并返回cookies,因此用api登录,获取token后再重定向到luna的方案是不可行的。
涉及API为:/api/v1/users/auth/

图1 api调用用户认证api未返回cookies
在这里插入图片描述
【解决方案】:
在与堡垒机同域下扩展外部应用,提供一个单点业务供外部系统或模块集成。此单点页面需要模拟jumpserver登录实现。
1) 先用get请求/users/login/,从返回的登录首页中截取csrfmiddlewaretoken

图2 获取csrfmiddlewaretoken
在这里插入图片描述
截取的方法参考如下python代码:

login_url = "http://{ip}:{port}/users/login/".format(ip=xxx,port=xxx)
headers = {'Content-Type': "application/x-www-form-urlencoded"}
conn = requests.Session()
resp = conn.get(login_url, headers=headers)
tree = etree.HTML(resp.content)
csrf_token = tree.xpath('//div[@class="col-md-6"][2]//form[@class="m-t"]/input/@value')

2) 跟jumpserver的登录页面一样用post方法调用/auth/login/,模拟登录。参数为username、password还有上一步获取的csrfmiddlewaretoken,调用成功后,jumpserver会将会话信息保存在redis中,并在cookie中写入sessionId。

图3 模拟登录
在这里插入图片描述
3) 完成以上两步,就可以重定向luna,重定向地址为luna根路径加时间戳。

http://192.168.159.128:9999/luna/?_=1574412321342

使用luna调用jumpserver的api/v1/users/profile方法验证,可以返回登录用户信息。

图4 luna获取登录用户信息
在这里插入图片描述【优化】:
通过界面登录方式进行登录,如果登录失败,需要用验证码。正常情况下单点登录是不会出现登录异常的,因为能够打开jumpserver的页面,就表示该用户在运维平台已经登录成功了,但也不排除异常情况。因此可对源码做如下修改:
/apps/templates/login.py

图5 单点页面时不校验验证码
在这里插入图片描述
并且在POST请求时,带上is_single的参数。

图6 post请求时带上is_single,表示是单点登录
在这里插入图片描述

2. 如何指定用户、主机进入远程主机的SSH界面

【问题】:
如何屏蔽webTerminal左侧的收藏夹和资产列表,直接通过单点传来用户和主机标识打开命令窗口。

【解决方案】:
通过【1.如何集成webTerminal页面】中的方案实现jumpsever登录后,直接跳转到如下页面,其中asset为资产的ID(assets_asset.id)。

http://192.168.159.128:9999/luna/connect?asset=87afc212b0a846acab6fbd1bff743e7b

3. 如何指定用户、主机进入远程主机的图形界面

通过【1.如何集成webTerminal页面】中的方案实现jumpsever登录后,调用guacamole获取token,需要传递参数username(users_user.id)和password(‘jumpserver’),返回数据authToken

http://192.168.3.222:9999/guacamole/api/tokens

得到token后,再次调用guacamole传递参数,user_id为用户id(users_user.id),asset_id为用户资产id(assets_asset.id),system_user_id为系统用户id(assets_systemuser.id),token为上步骤获取的authToken,返回数据result

http://192.168.167.175:9999/guacamole/api/session/ext/jumpserver/asset/add?user_id=c1fb45e3-f469-4c05-add0-abe779f9b3ae&asset_id=cac06f51-b40d-43b7-bdea-14cf54e27de3&system_user_id=ecd94f9b-33a2-4bf4-a435-864fc3473549&token=B331DC01E6183E56694B872F48BF1A5EA5755485694FA8A665B169965E358576

最后,直接跳转到如下页面,client后面数据为上步骤获取的result

http://192.168.3.222:9999/guacamole/#/client/Y2FjMDZmNTEtYjQwZC00M2I3LWJkZWEtMTRjZjU0ZTI3ZGUzAGMAanVtcHNlcnZlcg==

4. 如何指定用户、主机进入远程主机的文件管理界面

通过【1.如何集成webTerminal页面】中的方案实现jumpsever登录后,直接跳转到如下页面,其中aeb2986e-bf4c-4fb9-a2e6-a59ba8cb09c9为资产的ID(assets_asset.id)。

http://127.0.0.1:9999/koko/elfinder/sftp/aeb2986e-bf4c-4fb9-a2e6-a59ba8cb09c9/

效果如下:
图 10 自动登录文件管理页面
在这里插入图片描述

5. 登录jumpserver鉴权改造

【问题】:
jumpserver做为运维平台的一个组件不允许保存用户、密码,而客户端(如SecureCRT 、xshell等)登录堡垒机时一定时需要输入密码才能进行登录的。

【解决方案】:
对jumpserver提供给koko的用户登录鉴权服务进行改造,原是查数据库校验用户密码是否一致,改为调用运维平台提供的鉴权服务。并支持开关控制,开关打开时走接口鉴权,未打开走源码的数据库鉴权。
代码位置:jumpserver中auth.py的post方法

6. 如何使jumpserver的菜单页面支持单点集成?

【问题】:
希望将jumpserver的审计管理、会话管理及相关配置等页面集成到运维管理平台中。

【解决方案】
1、 单点打开页面的时候,先用传入的用户信息模拟登录jumpserver(与集成webTerminal页面一样)
2、 约定单点登录地址需要增加参数is_single=1,表示是通过单点页面登录的。

http://192.168.159.128:9999/terminal/session-online/?is_single=1

3、 对base.html进行改造,当is_single=1时只保留中间的内容区,去掉头部baner、左侧菜单、底部版权信息。
4、 对需要单点的页面进行改造,如对在线会话页面对应的session.py进行改造,截取地址参数中的is_single的值,设置到html中。

图11 session.py改造
在这里插入图片描述
5、 Jumpserver的一些子页面没有返回主页面的功能,需要点菜单才能返回主页面,如创建资产编辑页面,从用户交互友好性考虑,需要加上返回按钮。

【实现效果】

图12 单点登录在线会话页面
在这里插入图片描述
图13 非单点情况下打开在线会话页面
在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值