在本文中,我们将讨论使用SSH时的有用技巧和命令。即:
- 如何对SSH连接使用两因素身份验证。
- 安全使用“代理转发”。
- 结束挂起的会话。
- 退出或断开连接时,我们将终端保持打开状态。
- ( Zoom!).
有五种激活方法。
1.我们更新OpenSSH并使用硬件令牌。今年二月,OpenSSH增加了对FIDO U2F(通用第二因素)令牌的支持。我能说什么-很好,但是有一个警告。
关键是该更新添加了新的密钥类型以支持令牌。但是,仅在将客户端和服务器更新到8.2版或更高版本时才能使用此功能。您可以使用ssh -V命令检查客户端的当前版本。就远程服务器而言,值得使用nc [servername]22
。此外,还添加了两个新的密钥类型-ecdsa-sk和ed25519-sk。也有针对他们的证书。为了创建密钥文件,您需要插入一个令牌并执行命令
$ ssh-keygen -t ecdsa-sk -f〜/ .ssh / id_ecdsa_sk。
她在干嘛?创建绑定到U2F令牌的公钥和私钥。令牌上的私钥用于解密存储在磁盘上的私钥。
另一种可能性是将密钥文件的密码设置为第二个因素。事实是,OpenSSH可与另一个生成选项sk一起使用。因此,密钥文件存储在硬件令牌上,并且始终与您在一起。为了创建驻留密钥,您需要使用以下命令:
$ ssh-keygen -t ecdsa-sk -O resident -f ~/.ssh/id_ecdsa_sk.
好了,为了将密钥文件传输到新机器上,您需要插入媒体并运行命令$ ssh-add -K。请记住-令牌必须在连接后激活。
2.我们使用PIV + PKCS11和Yubikey。如果需要连接到安装了较早版本SSH服务器的计算机,则还有另一个选择。这是带有PIV / PKCS11的U2F + SSH的详细说明。有点棘手,但值得。
3.第三种方法是使用yubikey-agent。这是由Filipo Valsorda创建的Yubikeys本身的SSH代理。
4.触摸ID和密钥。另一种方法是使用Sekey-开源代理。它在MacOS的安全飞地系统中存储私钥,并允许您触发Touch ID签名功能。
5.最后,使用Single Sign On SSH。这是安装说明。单一登录SSH的优点在于,用户能够强制执行帐户提供者的安全策略,包括对多因素身份验证的支持。
安全转发密钥(代理转发)
密钥转发的作用是什么?用于远程主机访问本地SSH用户代理。事实是,当SSH客户端使用密钥转发时(大多数情况下ssh -A被激活),则在连接期间有2个通道。第一个是交互式用户会话,第二个是密钥转发通道。
本地SSH代理创建一个IPC套接字,该套接字通过此通道连接到远程主机。这是非常危险的,因为远程主机上的root用户可以访问连接用户的本地SSH代理。因此,它可以用来代表该用户访问网络资源。而且,如果您使用标准的SSH代理,则不会发现问题。但是使用U2F密钥或Sekey可以解决此问题。
通常,您可以转发密钥,但是建议不要对所有连接都经常使用此方法。建议仅在用户对情况有信心时才使用它。
注销挂起的SSH会话
SSH会话通常由于网络问题,可执行程序的控制权丢失或终端的转义序列之一阻止键盘输入而冻结。退出挂起的会话有几种方法:
1.在网络断开连接时自动进行。为此,将以下内容添加到SSH配置文件.ssh / config中:
ServerAliveInterval 5
ServerAliveCountMax 1
在这种情况下,ssh将通过定期向远程主机发送回显请求来检查连接。它们由ServerAliveInterval参数设置。如果未答复的请求多于ServerAliveCountMax,则SSH将关闭连接。
2.中断会议。ssh使用〜字符作为默认转义序列。〜命令将关闭当前连接并返回到终端。
还有,〜?显示当前会话中可以使用的命令的完整列表。如果安装了多个布局,则必须按两次〜按钮才能发送字符。
使远程主机上的终端保持打开状态
在网络之间切换时,有两个选项可用于保存会话。
1.使用Mosh或Eternal终端
如果需要可靠且非关闭的连接,即使在网络之间切换时,也有一种解决方法-您需要使用Mosh-移动外壳。 Mosh是指使用SSH初始化会话(握手)的安全外壳。之后,她切换到自己的加密通道,该通道非常稳定。例如,它可以处理各种情况,包括断开连接,设备IP地址的更改,数据传输的较大滞后等等。这一切都要归功于UDP和Mosh使用的同步协议。
要使用它,首先,需要将其安装在服务器和客户端上,打开60000到61000端口以用于远程主机上的传入UDP通信。之后,您只需要键入mosh user @ server即可连接。
Mosh在终端屏幕和按键级别工作,与SSH相比,Mosh具有很多优点,SSH在客户端和服务器之间从常规I / O传输二进制数据流。如果只需要同步终端屏幕和按键,那么中断的连接将恢复得更快。相同的SSH需要存储在缓冲区中并发送所有内容,但是Mosh只需要保存击键,即可将终端窗口的最后状态与客户端同步。
2.使用tmux。为了根据需要进行连接和断开连接,同时在远程主机上保持相同的会话,值得使用名为tmux的终端多路复用器。如果SSH连接断开,则需要重新连接并键入tmux attach。然后,用户返回到tmux会话。
它还提供了其他一些功能,包括选项卡,面板(与macOS终端相同)以及与其他用户一起使用终端的功能。您可以使用Byobu(该软件包添加了许多便捷的功能和键盘快捷键)获得更多收益。它随Ubuntu一起提供,并且可以在带有Homebrew的macOS上运行。
共享远程终端
在某些情况下,您需要共享SSH会话-例如,解决服务器的复杂问题时。最好的方法是使用tmux。要解决此问题,您需要执行以下操作:
- 确保在DMZ中的服务器上(或您要连接的位置)安装了tmux。
- 两个用户都需要使用相同的帐户通过SSH连接到服务器。
- 用户之一必须运行tmux才能创建tmux会话。
- 第二个用户运行tmux attach命令。
- 全部都准备好了!
如果需要微调多用户会话,则应使用tmate。这是tmux的改进分支。
专家建议
我们决定用我们自己的建议来补充翻译-我们希望它们也能有用。Jet信息系统网络解决方案中心高级顾问,Skillbox网络安全专业课程的老师Maxim Klochkov分享了他的有益经验。
TCP端口转发
Ssh有两个有用的选项:-L和-R。
-L参数在尝试建立TCP连接时会在本地计算机上组织一个开放的TCP端口,该连接将透明地转发到ssh隧道,然后从远程计算机建立连接。
-L参数后跟以下格式的参数:
ssh -L XXX:server1:YYY login@server2
这里server2是我们通过ssh访问的远程服务器,login是登录到远程服务器时使用的用户名,XXX是需要在本地计算机上组织的端口号,server1是我们需要从该端口转发连接的主机,最后,YYY是应将此连接转发到的端口。
让我们看两个例子。
范例1。
- 我们在spb.company1.ru服务器上,我们想测试访问位于central-db.company1.ru上的数据库的Web应用程序。
- 该数据库仅可从moscow.company1.ru服务器的端口9999上获得
- 我们将组织通过ssh隧道将本地端口55555转发到数据库的方法如下:ssh -L 55555: central-db.company1.ru :9999 login@moscow.company1.ru
- 之后,我们将Web应用程序部署在本地服务器上,并且不指定base-db.company1.ru:9999作为基础,而是将localhost:55555指定为该连接-该连接将转发到moscow.company1.ru服务器,并且该服务器将建立连接在主机Central-db.company1.ru上的数据库,端口9999
示例2
- 我们位于spb.company1.ru服务器上,我们希望向客户展示位于moscow.company1.ru的端口5000的测试网站。
- 无法从Internet访问此站点,只能从部署该站点的同一主机(即moscow.company1.ru)进行内部访问。
- 我们通过ssh隧道组织本地端口80的转发,如下所示ssh -L 80:localhost:5000 login@moscow.company1.ru
- 如果现在用户使用链接spb.company1.ru进入浏览器,则该连接将通过ssh隧道转发到moscow.company1.ru服务器,并且该服务器已建立与地址localhost:5000的连接,即与我们的测试网站的连接-现场。
-R参数在远程服务器上组织一个开放的TCP端口,当您尝试建立TCP连接时,该连接将透明地转发到ssh隧道,然后从本地服务器建立连接。
-R参数后跟以下格式的参数:
ssh -R XXX:server1:YYY login@server2
这里的server2是我们通过ssh登录到的远程服务器,login是登录到远程服务器的用户名,XXX是需要在远程服务器上组织的端口号,server1是我们需要从远程服务器转发连接的主机,最后,YYY是此连接应转发到的端口。
让我们看两个例子。
范例1。
- 我们位于moscow.company1.ru服务器上,该服务器上的数据库位于Central-db.company1.ru服务器上的端口9999上。
- 我们正在spb.company1.ru服务器上部署Web应用程序,并且无法从该服务器访问数据库。
- 我们将组织从spb.company1.ru服务器到数据库的端口转发,如下所示:ssh -R 55555: central-db.company1.ru :9999 login@spb.company1.ru
- 之后,我们将Web应用程序部署在spb.company1.ru服务器上,但由于该服务器对我们不可用,但我们未将central-db.company1.ru:9999指定为基础,但是localhost:55555-此连接将转发至我们的本地通过ssh隧道连接计算机,然后本地计算机将建立与Central-db.company1.ru服务器端口9999的连接。
示例2
- 我们位于moscow.company1.ru服务器上,并在服务器上的端口5000上部署了一个测试网站。
- 该测试网站仅在本地可用,不允许通过Internet连接,但我们想向可以使用网络浏览器访问spb.company1.ru服务器的客户展示此网站。
- 我们将按以下方式组织来自spb.company1.ru服务器的端口转发:ssh -R 80:localhost:5000 login@spb.company1.ru
- 如果现在用户使用链接spb.company1.ru进入浏览器,则该连接将通过ssh隧道转发到我们的本地服务器moscow.company1.ru,并从该连接建立到本地主机的连接:5000-即连接到我们的测试网站现场。
您可以分享哪些技巧?
关于这个话题:
- 文章“如何使用Bash将执行任务”;
- 实用的在线课程“ Linux OS管理”。