jumpserver二次开发改造方案
jumpserver二次开发改造方案
前言
jumpserver堡垒机管理了一套用户、资产、资产系统用户。但是如果我们已经建设了运维管理平台,那这一套数据原就存在于运维管理平台。出于统一配置,统一维护的需要,就存在2个基本需求:
-
页面统一入口:即jumpserver的页面集成在运维管理平台,用户不用登录jumpserver的管理系统。
-
数据共享问题:最好的方式是用户、资产、系统用户、以及授权规则统一在运维管理平台中配置,堡垒机通过服务从运维管理平台中获取相关数据。其次方案是堡垒机的数据从运维管理平台同步。
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左侧的收藏夹和资产列表,直接通过单点传来用户和主机标识打开命令窗口。
图7 webTerminal需要达到的效果
【解决方案】:
通过【1.如何集成webTerminal页面】中的方案实现jumpsever登录后,直接跳转到如下页面,其中asset为资产的ID(assets_asset.id)。
http://192.168.159.128:9999/luna/connect?asset=87afc212b0a846acab6fbd1bff743e7b
效果如下:
图8 自动登录主机
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.50.194: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==
效果如下:
图 9 自动登录图形页面
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 非单点情况下打开在线会话页面
下一篇: 回溯法