GateOne尝试

实现目标:使用web-ssh希望实现的功能是通过在网页上进行远程运维,简单来说就是实现了一个网页版的ssh登录界面。自动登录对方的主机然后执行相关命令(像使用客户端putty一样)。

原本的ssh客户端在运维管理中有点麻烦,不同的用户需要不同等登录名、授权等管理,而且存在一定的风险,可能会导致个人电脑被攻击等安全问题…一般的解决方案包括堡垒机、跳板机等一系列安全措施来防止系统非法访问。跳板机就是先登录到一台服务器 再通过这台服务器登录到目标服务器上;堡垒机对运维人员的身份认证、对运维操作的访问控制和审计等功能。
Web-ssh是可以替代堡垒机的功能的一个软件。
前期调研,我了解了几个比较普及的web-ssh工具,比如gateone、shellinabox、web-shell、qweb等等,这里主要是研究了gateone。下面将记录gateone使用的文档。

1.安装python2.7.9+, tornado 2.2+

1.1 安装前提

python -V
wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo pip install tornado

1.2 验证安装环境

python -V
python -c "import tornado; print(tornado.version)"

1.3 tornado与python的版本会影响后续的安装(更新20190116)

TypeError: __init__() got an unexpected keyword argument 'io_loop' Exception AttributeError: "'AutoExpireDict' object has no attribute '_key_watcher'" in <bound method AutoExpireDict.__del__ of {}> ignored

我这里使用的tornado版本为4.1, python版本为2.7.12。 上述报错是在安装tornado 5.0的时候报错。

2.GateOne的获取和安装

2.1 通过git上源码获取

sudo apt-get install git
git clone https://github.com/liftoff/GateOne.git
cd GateOne
sudo python ./setup.py install

2.2 安装过程中可能会遇到的问题

安装HTML5lib时提示setuptools版本太低,需要升级

pip install -U setuptools

将setup.py成功运行之后即可启动gateone服务,至此,gateone的安装完成

3.GateOne的测试

默认的配置文件是/etc/gateone/conf.d/10.server.conf(位置不是绝对的)

sudo gateone

默认打开的端口号为443。在浏览器中输入’‘https://127.0.0.1:443’’。
(更新20190116)亲测:firefox浏览器无法打开,提示报错跟ssl ca证书相关。换个浏览器,例如chrome浏览器可以。
如果配置成功,会出现gateone的页面。点击Terminal图标,可以在web端上使用命令行、也可以通过ssh登录到其他主机上进行操作。
不正常显示:
在这里插入图片描述
正常显示
在这里插入图片描述

4.GateOne嵌入到其他应用中

4.1 配置文件的修改

我们使用GateOne/gateone/docs/embeddings_configs/99tutorial_chapter1.conf作为默认的配置文件,可以设置端口号以及是否需要验证等

本身这个文件是有一个语法问题, auth=none后面要加上一个,,不然运行的时候会报错

  • origin = [*]表示不对源进行检查
  • "port": 8000 修改数字可以改变gateone的端口号

4.2 将配置文件放到一个目录下,并运行gateone(运行时需要添加setting_dir参数)

mkdir /tmp/chapter1
cd GateOne
cp gateone/docs/embedding_configs/99tutorial_chapter1.conf /tmp/chapter1
./run_gateone.py --settings_dir=/tmp/chapter1

4.3 将Gateone/gateone/static/gateone.js复制到应用的static文件夹中
4.4 在你想要展示的页面文件.html文件下添加以下内容:

<div id="gateone"></div>
//或者调一调格式啥的
<div id="gateone_container" style="width:60em; height:30em;">
    <div id="gateone"></div>
</div>

4.5 引入gateone.js文件

<script src="https://your-gateone-server/static/gateone.js"></script>

4.6 调用GateOne.init()函数来进行信息传递

GateOne.init({url:"https://yourgateone-server/:port"})

5.gateone免密码登录(autologin)

其实gateone的url可以变为https://ip_addr:port/?ssh=ssh://hostname@host_ipaddr,这样只需要输入密码即可通过SSH访问其他主机。但还是不方便,如果有很多台主机,还要记住一堆主机的密码…

5.1 SSH 免密码登录 具体的操作步骤就不提了

5.2 将id_rsa写入到.default_ids里,形成对应关系

echo id_rsa > /var/lib/gateone/user/ANOUNYOUS/.ssh/.default_ids

5.3 修改GateOne.init函数,添加参数autoconnect_url
一点小建议:

  • 首先确保本机能够免密码登录到远程主机,首次登录的时候可能要输入yes,可以在远程主机中进行设置ssh -o stricthostkeychecking=no
  • 保存公钥的那个文件是要自己创建的,是个隐藏文件,文件名不要打错了,不然gateone会找不到这个文件
  • gateone URL根据你自己远程主机信息进行改写
  • 如果上述步骤都执行了,还是不行的话,建议查看log文件,具体问题具体分析

ps:在gateone的开源代码中,其实有一些简单的已经实现好的实例,可以去玩一下。

实例

这里主要分享下项目里的代码。
点击start按钮可以添加一个终端。用一个div承载gateone的terminal。

{% block page_content %}
<form id="add_terminal">
    <input type="submit" value="START" class="btn btn-primary"
           id="connect_btn"></input>
</form>
<div id="gateone_container" style="position: relative; width: 60em; height: 30em;">
    <div id="gateone"></div>
</div>
{% endblock %}

相关的javascript代码

<script src="{{ url_for('static', filename='gateone.js')}}"></script>
<script type="text/javascript">
   window.onload = function(){
   authobj = {{auth_object|tojson}}
   gateone_url = {{gateoneURL|tojson}}
   GateOne.init({
       auth: authobj,
       url: gateone_url,
       embedded: true,
       style: {'background-color': 'black', 'box-shadow': '0 0 20px black'}
   });
}
</script>
<script>
    document.querySelector('#add_terminal').onsubmit = function(e) {

        var existingContainer = GateOne.Utils.getNode('#'+GateOne.prefs.prefix+'container'),
            container = GateOne.Utils.createElement('div', {
                'id': 'container', 'class': 'terminal', 'style': {'height': '100%', 'width': '100%'}
            }),
            gateone3 = GateOne.Utils.getNode('#gateone');
        e.preventDefault(); // Don't actually submit the form
        if (!existingContainer) {
            gateone3.appendChild(container); // Put our terminal in the container
        } else {
            container = existingContainer;
        }
        autoURL = {{autoURL|tojson}}
        termNum = GateOne.Terminal.newTerminal(null, null, container); // Create the new terminal
        GateOne.Terminal.sendString(autoURL,null)
        $('#connect_btn').hide()
    }
</script>

效果图
提供一个入口进入远程运维界面。
这里写图片描述
这里提供了一个start按钮,用于生成新的terminal。开始远程运维。点击start按钮后start按钮会消失。
这里写图片描述
我们通过一个sendString的命令将autoURL传到命令行。只需要回车就可以直接执行这个命令。
这里写图片描述
首次登录的时候需要通过签名认证,需要手动填一个yes。如果私钥公钥不匹配的话,会提示让你输入密码
这里写图片描述

博文内容参考链接:
参考网址:
http://liftoff.github.io/GateOne/Developer/index.html#embeddeding-gate-one-into-other-applications
http://www.cnblogs.com/lienhua34/p/4876300.html
http://www.cnblogs.com/lienhua34/p/4884115.html
https://github.com/liftoff/GateOne/issues/591

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值