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

本贴最后更新于 1805 天前,其中的信息可能已经时异事殊

背景

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

问题

  • 每次手动的输入密码 + 动态口令 十分繁琐.如果使用的是命令行窗口,切换或者关闭窗口后还得重新登入.
  • ssh 命令是个交互命令, 没有提供参数密码的参数.
  • 公司的跳板机不允许配置密钥.所以无法走密钥方案来自动化

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 语言是基于 Tcl 的。
  • Tcl 实际上是一个子程序库,这些子程序库可以嵌入到程序里从而提供语言服务。 最终的语言有点象一个典型的 Shell 语言。
  • Expect 给变量赋值用 set 命令, 控制程序执行的 if,for,continue 等命令,还能进行普通的数学和字符串操作.以用 exec 来调用 Unix 程序。
  • spawn 命令激活一个 Unix 程序来进行交互式的运行
  • send 命令向进程发送字符串
  • expect 命令等待进程的某些字符串 .expect 支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。expect 还能理解一些特殊情况,如超时和遇到文件尾

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

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

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

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

详细代码如下:

  • 其中使用 set 变量名 变量值 的方式来设置变量.使用 $变量名 来获取值.
#!/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

后续

  • 理论上,就连同动态口令都可以做成自动化.只要直到对应的接口和 token 就可以获取到动态口令.如果还想做得更自动化点, 感兴趣的,可以研究下.
  • Mac 的 OSX 系统只需要使用以下命令就可以使用按照好 expect
brew install expect
brew install spawn-fcgi

我的公众号
simpledw.JPG

  • 运维

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

    149 引用 • 257 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 我司的跳板机就是这样被人玩坏的,尤其是自动输入密码。明文存储的密码是有安全隐患的

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

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

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

    1 回复
  • 跳板机还是很重要的,安全点好

    1 回复
  • sixleaves
    作者

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

  • sixleaves
    作者

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