细说ssh

发布于2025-01-07

SSH是一种常见的连接Linux服务器的方式。可以说,一般情况下,我们对于网络上的服务器,自SSH始,至SSH终,用好SSH可以说是服务器管理的核心和地基。那么,什么是SSH?SSH能做什么?怎么安全的用好SSH?

什么是SSH

按惯例,我们先引用一下Wiki

The Secure Shell Protocol (SSH Protocol) is a cryptographic network protocol for operating network services securely over an unsecured network.Its most notable applications are remote login and command-line execution.

没错,SSH以一种网络加密协议,只不过我们对服务器最常进行的操作是运维,所以会觉得SSH主要是一种控制工具。

SSH,主要指OpenSSH的实现,常用的应用包括

  • 执行shell命令(远程控制)
  • 复制文件(scp)
  • 建立一个到服务器的TCP通道,供别的软件当跳板使用(常见的如各种数据库维护软件通过SSH连接不开放公网访问的数据库)
  • 建立一个到服务器的反向通道,供服务器端的软件使用本地网络内的资源
  • 建立一个安全简单的代理

基于openssh的应用

OpenSSH是一款知名的SSH服务软件,可以说是SSH的事实标准。通过OpenSSH软件,我们可以方便的建立安全的网络连接(SSH Tunnel),进行各种服务器操作

建立直连通道

直连通道的本质就是本地端口转法,具体指令为

ssh -R 服务器端口:远程IP:远程端口 USER@SERVER -N

成功连接后,本地端口映射为远程端口,这样可以很边便捷的使用各种数据库运维软件来远程管理数据库了。可以说这是ssh连接的最重要的形式之一。在实际使用中,可能不止一层转法,会建立 本机->跳板机->服务器这种形式的连接

建立反向连接

反向连接,指将本地网络的服务端口映射到服务器上,具体指令为

ssh -L 本地端口:远程IP:远程端口 USER@SERVER -N

成功连接后,远程访问指定端口会连接到本地端口,,可以用来让服务器连接本地网络的代理和同步代码库等操作。实际使用场景较少,但真遇到具体场景也是极为重要的一个功能。

因为正向连接还能通过代理/vpn/临时开放端口等方式代替,反向连接没有特别好用的替代品。

建立代理

建立代理就是进行动态端口转发,具体指令为

ssh -D 本地端口 用户名@SSH服务器 -N

这个相对不常用,因为这个场景是VPN和各种内网组网工具的天下。只能说出差临时一下,可以不用安装各种软件。

当然,作为一种非正式的代理机制,也可以配合autossh和sshpass软件来作为一个服务按需启用。

可以建立一个systemd的service文件

[Unit]

Description=proxy over ssh

After=network.target

[Service]

Type=simple

User=root

Restart=on-failure

RestartSec=5s

ExecStart=sshpass -p "SSH密码" autossh -o ServerAliveInterval=99999999 -N  -D 代理端口 服务器用户名@服务器地址

[Install]

WantedBy=multi-user.target

就是真的不太推荐,还是用专用的代理软件或者vpn比较好

如何安全的使用SSH

SSH如此重要,所以关于SSH的安全可以说是一个渗透测试/安全检测/等级保护的必备项了。

当然,从实际操作来说,很多检测和建议对大部份普通用户来说,并不是很合理,所以我们也分享下我们的实际经验。

第一,使用证书连接是安全的第一步。

如果你想方便,可以用密码来连接服务器(其实也是证书更方便)。如果你要考虑安全,那么证书是绕不过去,必不可少的一步了。绝大部分公开使用SSH的服务,比如github,各种身份安全认证也是通过证书来实现的。

整个SSH体系就是围绕证书来建立的。

不使用证书的SSH安全,就如同无源之水,无从谈起。

第二,可以使用跳板机,但谨慎使用堡垒机。

堡垒机是一个,比较特殊的产品。

他的本质是一个带审核功能的跳板机。但如同我们之前说的,SSH有太多功能。审核对于传递文件,建立通道可以说毫无意义。

所以,很多堡垒机也会选择不支持这些功能。这叫让人比较难过。

至于标准的跳板机,哪怕被扫描/漏洞,也不至于直接把所有服务暴露出来,还是有一定的意义的。

第三,适当的网络隔离。

可以通过一个通用的vpn连接服务器是最常见的安全连接方式。如果一定需要公网开放,限制ssh端口的访问ip也是一种很好的安全与方便性的均衡。

在解决了第一步的直连问题后,使用类似跳板机进行内网隔离也能增加不少的安全系数。

最后,足够的安全意识。

安全问题,不光光是攻防问题,还是一个短板的问题。再严密的安全防护措施,也无法防范day0漏洞,甚至社会工程学攻击。

所以,安全意识并是体现在如果提升安全系数上。

而是以安全一定会被攻破,为前提,做好各种预案,怎么在被攻破后损失最小。

各种隔离,备份,加密,服务分割,都是这种思想的一种体现。

没有绝对的安全,只有随时做好安全被攻破预案的人。

某种角度来说,这可以说是安全的真谛。

意识常在,安全随身。