我正在寻找一种方法来禁止用户使用特定的 Debian 10.10 主机作为 SSH 跳转主机。我想阻止他们从该主机通过 SSH 连接。
- 在
/etc/ssh/sshd_config
我有AllowTcpForwarding no
。 - 在
/etc/ssh/ssh_config
我有FollowAgent no
。
但是当我连接时,我可以连接到另一台主机。
如何从第一个 SSH 连接拒绝/锁定/阻止新的 SSH 连接?
HOST A --{SSH}--> Other_Host_N --{NO SSH}--X--> hyp_vmware
答案1
阻止从中间主机到“禁止”目标主机的传出 SSH 连接。 Linux 上的 iptables 是这样的:
iptables -A OUTPUT -d forbiddenhost -p tcp --dport 22 -j DROP
(或者另一种方式,删除来自目标主机上的中间主机的传入 SSH 连接。)
请注意,仅仅阻止在中间设备上发起新的 SSH 连接可能是行不通的,因为有一些常见的方法仅使用跳转主机将加密数据从源传递到最终目的地。也就是说,不要将两个管道背靠背放置:
origin *---SSH---* intermediate *---SSH---* target
我们可以将一根管道的一半布线到另一根管道中,弯曲以穿过中间主机:
origin intermediate target
*-]=== tunnel ===[-------SSH-------*
该隧道部分可以是另一个 SSH 连接,或者例如只是一个普通的 TCP 连接(可能在 SSH 中使用端口转发进行设置)。不管是什么,它只是通过源自“origin”的 SSH 连接。所有这一切的好处是用户不需要信任中间主机及其未加密的数据。当然,缺点是 SSH over SSH 情况下的额外开销。 (与通常的 SSH 使用相比,通过转发的 TCP 连接运行 SSH 实际上不会产生任何开销。)
执行此类操作的一些简单方法是将 SSHProxyCommand
与ssh intermediatehost -W targethost:22
, 或ssh intermediatehost nc targethost 22
(或类似)一起使用。参见例如ssh proxycommand -W、nc、exec nc 有什么区别就这样。
中间体作为跳跃宿主所需的全部是一些打开从它到最终目标主机的网络连接的方法。nc
即使没有安装,具有正常 shell 访问权限的用户也可以下载它的静态副本,或者编写一个简短的 Perl 脚本,或者其他什么。即使只使用 Bash 也可以,因为它支持通过重定向打开网络连接。
答案2
对于获得 shell 访问权限的用户来说,您想要实现的目标基本上是不可能的;任何可以通过 SSH 登录的此类用户也可以在他们获得的 shell 中执行任何操作,包括:
- 启动一个单独的
ssh
进程并连接到另一台主机 - 复制静态编译的 ssh 然后使用
- 下载并执行任意软件。
因此,您基本上已经授予他们执行 SSH 跳转功能的特权。您可能只禁用 SSH 守护进程本身提供的跳转主机功能的便利性。这对你来说似乎还不够。
本质上,您需要做出选择:您真的希望用户能够从他们所连接的计算机进行访问(包括网络访问)吗?
如果答案是“否”,那么解决方案很简单:不要让他们访问具有此类网络访问权限的计算机。这是一种非常常见的设置,例如在大学中,一些计算服务器运行一些软件,学生和研究人员可以通过 SSH 访问这些软件,但不应让他们访问内部网络。让你的 SSH 守护进程在自己的 Linux 网络命名空间中的自己的 IPv6 地址上运行,无需连接到互联网(或任何你不希望用户能够跳转到的网络)就可以解决这个问题,而且基本上是免费的。
答案3
感谢所有的回复、分析和其他人。
我开始将“other_host”架构重命名为“Hyp_vmware”,因为他是“other_host”。
今天我在 ESXi 防火墙中设置了一条规则,拒绝所有通过 ssh 的连接并允许所需的 IP。因为 ESXi 7.0 没有“TCP 包装器”(在 Linux 中是)。
我得到“ilkkachu”答案参考并在 ESXi CLI 中进行调整。
请注意,ESXi 命令与“ilkkachu”答案不同。您可以使用以下命令过滤 ip:
esxcli network firewall ruleset set --ruleset-id=sshServer --enabled=true
esxcli network firewall ruleset allowedip add -i @IP -r sshServer
esxcli network firewall refresh
亲切地