我有一台运行 Ubuntu 和 OpenSSH 守护程序的服务器。我们称之为 S1。
我使用来自客户端机器的该服务器(我们称其中一台为 C1)通过远程端口转发来建立 SSH 反向隧道,例如:
ssh -R 1234:localhost:23 login@S1
在 S1 上,我使用默认的 sshd_config 文件。据我所知,任何在 S1 上拥有正确凭据 {login,pwd} 的人都可以登录 S1 并执行远程端口转发和本地端口转发。此类凭证将来可能会成为证书,因此据我了解,任何获得证书的人都可以从任何其他地方(不一定是 C1)登录 S1,从而创建本地端口转发。
对我来说,允许本地端口转发太危险了,因为它允许创建某种公共代理。我正在寻找一种方法来仅禁用 -L 转发。
我尝试了以下操作,但这会禁用本地和远程转发:
AllowTcpForwarding No
我还尝试了以下方法,这只允许 -L 到 SX:1。这比没有要好,但仍然不是我需要的,我需要的是“无”选项。
PermitOpen SX:1
所以我想知道是否有办法,以便我可以禁止所有本地端口转发写类似的东西:
PermitOpen none:none
以下是一个好主意吗?
PermitOpen localhost:1
答案1
任何具有登录凭据的人员都可以启动自己的 sshd 实例,在随机端口上运行并允许他们想要的任何操作,包括 -L 本地转发:
% /usr/sbin/sshd -d -f mysshd.config -p 12345
如果您不信任用户使用您的机器执行某些操作,那么您首先就不应该允许他们登录。
(顺便说一句,-D 标志也是一种“代理问题”)
答案2
另一个解决方案是仅允许向特定用户进行端口转发:
来自 SSH:权威指南
可以在 sshd 中全局启用或禁用端口转发。这可以通过 /etc/sshd_config 中的服务器范围配置关键字 AllowTcpForwarding 来完成。该关键字的值为 yes(默认值,启用转发)或 no(禁用转发):
# SSH1, SSH2, OpenSSH
AllowTcpForwarding no
此外,SSH2 还有以下选项:
# SSH2 only
AllowTcpForwardingForUsers
AllowTcpForwardingForGroups
这些选项的语法与 AllowUsers 和 AllowGroups 选项的语法相同。[第 5.5.2.1 节“帐户访问控制”] 它们指定允许使用端口转发的用户或组列表;服务器拒绝接受任何其他人的端口转发请求。请注意,这些是指 SSH 会话的目标帐户,而不是客户端用户名(通常不知道)。
...
重要的是要意识到本节中的指令实际上并不能阻止端口转发,除非您还禁用交互式登录并限制可以在远程端运行的程序。否则,知识渊博的用户只需通过 SSH 会话运行自己的端口转发应用程序即可。这些设置本身可能足以在非技术社区中起到威慑作用,但它们无法阻止知道自己在做什么的人。
答案3
现在有一个选项可以仅允许本地/远程转发。
允许Tcp转发
指定是否允许 TCP 转发。可用选项为“yes”或“all”(允许 TCP 转发)、“no”(阻止所有 TCP 转发)、“local”(仅允许本地(从 ssh(1) 的角度来看)转发)或 “remote” 仅允许远程转发。默认值为“是”。请注意,禁用 TCP 转发不会提高安全性,除非用户也被拒绝 shell 访问,因为他们始终可以安装自己的转发器。
因此,正如已经说过的,您也应该将 shell 设置为nologin
。
答案4
我正在寻找一种方法来禁用仅 -L 转发
如果我理解正确的话,您的用户拥有完全的 shell 访问权限,但您不希望他们能够打开与网络其余部分的连接。
SSH 允许的“本地端口转发”只是实现此目的的可能方法之一。其他方法包括启动socat
、netcat
或任何其他数量的工具的实例。
在 Linux 中控制传出和传入连接的最佳方式是 Netfilter,又名 IPTables。
它有一个称为所有者()的特殊模块,它允许您匹配数据包创建者的各种特征,用于本地生成的数据包。它在和链ipt_owner
中有效。OUTPUT
POSTROUTING
您可以使用它来拒绝某些用户组生成的传出数据包,从而禁止任何类型的端口转发,而不仅仅是-L
SSH 选项。