(运维篇)-ssh-002- 如何优雅的通过跳板机登入公司内网服务器.

柳叶大数据 用最简单的语言和你分享数仓技术 本文由博客端 https://www.simpledw.com 主动推送

背景

由于博主所在的公司对安全非常重视, 不仅仅登入内网服务器需要使用跳板机, 登入跳板机的时候还需要配合 密码 + 动态口令进行登入。 可谓是重重关卡, 安全是安全了,但是使用起来十分不方便。很多开发,运维人员会使用 SecureCRT 来对机器进行管理。不可否认 SecureCRT 是很好用的软件,但是在 mac 下,个人感觉没必要用, 这款软件就不做介绍了。

问题

jump server

Jump Server,国内的公司把它称之为 堡垒机 或者 跳板机。

  • A jump server, jump host or jump box is a system on a network used to access and manage devices in a separate security zone. The most common example is managing a host in a DMZ from trusted networks or computers.
  • A jump server is a hardened and monitored device that spans two dissimilar security zones and provides a controlled means of access between them. User access should be tightly controlled and monitored.

解决方案

虽然 SSH 命令是个交互命令,没有提供传入密码的参数,但是 Linux 中提供了一套用来处理交互命令的程序 expect.

Expect

所以我们可以利用 expect 这个程序来实现自动化的交互 ssh.

具体思路: 我们开启一个进程来执行 SSH 命令,然后在监听这个进程输出的提示输入密码的交互信息,然后自动输入密码。

用 expect 我们可以非常方便的实现以上思路。

  1. 首先我们使用 spawn linux命令 就可以开启一个进程执行 Linux 命令。
  2. 然后使用 expect 来监听该进程的输出。
  3. 最后使用 send 命令来发送密码给该进程,就可以完成连接。

详细代码如下:

#!/usr/bin/expect
set user wxxxx
set ipaddress jump.xxxxxx.com
set salt 123456
set passwd "$salt [lindex $argv 0]"
set timeout 30
spawn ssh $user@$ipaddress
expect {
    "*Password:" { send "$passwd\r" }
    "Please input server keyword" { send "\r" }
    "Select page:" { send "1\r" }
}
expect {
    "Please input server keyword" { send "\r" }
}
expect {
    "Select page:" { send "1\r" }
}
interact

将上面脚本保存为 connect_server.sh,权限更改为 777.以后登入只需要 ./connect_server.sh 动态口令

最后效果如下图
image.png

后续

brew install expect
brew install spawn-fcgi

我的公众号
simpledw.JPG

  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    119 引用 • 239 回帖 • 3 关注

赞助商 我要投放

4 回帖
请输入回帖内容 ...
  • CismonX

    我司的跳板机就是这样被人玩坏的,尤其是自动输入密码。明文存储的密码是有安全隐患的

    出过几次安全事故后,改成了密码 + 动态码登录。输入密码后系统会向员工的内部 IM 发送一条动态码,这个很快也被自动化了

    警告了数次,辞退了几个人杀鸡儆猴后无果,还是有不少人这么搞

    现在是密码 + 内部 IM 手机客户端扫二维码登录跳板机,输完密码后会给你个时效 60 秒的二维码 😂 目前已知尚未被自动化

    1 回复
  • mufengcoding

    跳板机还是很重要的,安全点好

    1 回复
  • sixleaves

    哈哈哈,主要还是运维起来很麻烦, 密码可以存储在环境变量中,不明文写。或者再做一层加密。

  • sixleaves

    感觉有动态口令就行了。一般人哪知道你动态口令 😂