假设您有一台半信任的机器(例如,您的业务合作伙伴的 IT 部门具有根访问权限的机器),位于防火墙后面,并且您想从其中一台信任的机器连接到该机器。
基本思路是通过从不受信任的机器建立 SSH 隧道来绕过防火墙,以便受信任的机器可以在本地进行连接。此隧道应该是持久的,因此我使用该autossh
程序。
为了确保安全,我目前autossh
在两台机器上都创建了一个用户并授权其无密码的公共密钥,这样用户autossh
就可以建立连接而无需输入密码。此外,我将此用户的 shell 设置为/bin/false
,因为这会禁止正常登录,但仍允许设置隧道。
这基本上是可行的,但我直觉地认为必须做更多的工作才能使其合理安全。
虽然有权访问半信任机器的攻击者无法使用此密钥登录到信任服务器,但她可以通过创建 SSH 隧道循环并淹没打开文件表来执行拒绝服务攻击(例如参见1)像这样
ssh -vN -L4141:localhost:4141 trustedhost
ssh -vN -R4141:localhost:4141 trustedhost
telnet localhost 4141
而且可能还有其他可能的攻击。那么我该如何进一步保护这种创建半信任隧道的机制呢?我只需要在这些服务器之间建立一个持久连接,用户不需要执行/建立其他命令/隧道autossh
。
答案1
首先,确定设置防火墙的人是否真的希望您绕过它。他可能没有意识到您直接访问该机器的请求,并且可能想提供不同的解决方案(例如更改防火墙或网络拓扑)。
像您示例中那样的资源耗尽尝试不应该引起巨大的担忧,因为您可能已经实施了nproc
限制nofile
。
$ ulimit -n
1024
$ ulimit -u
2048
只要您将此类用户 chroot 到大小有限且空的 tmpfs,内存或 inode 耗尽就会变得困难。
如果您希望减少攻击面,请停止使用 autossh(一种旨在解决十年前在 openssh 中解决的历史缺陷的程序)并禁止在您这边使用 TCP 端口(unix 套接字足以维护隧道)。
Match Group untrusted
ChrootDirectory /run/empty/%u
AllowTcpForwarding no
AllowStreamLocalForwarding remote
PermitTunnel no
您可能无法减轻的风险:
- 有人占用了你的网络链接(可能与你关心的服务共享)
- 你的 ssh 服务器存在权限提升漏洞