细说ssh
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漏洞,甚至社会工程学攻击。
所以,安全意识并是体现在如果提升安全系数上。
而是以安全一定会被攻破,为前提,做好各种预案,怎么在被攻破后损失最小。
各种隔离,备份,加密,服务分割,都是这种思想的一种体现。
没有绝对的安全,只有随时做好安全被攻破预案的人。
某种角度来说,这可以说是安全的真谛。
意识常在,安全随身。