如何禁用SSH本地端口转发?


20

我有一台运行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

因此,一如既往,让我们开始探究它的根源:您真正的问题是什么,为什么要为移动/嵌入式设备设置类似的东西,您想解决什么?
akira

这里要解决的问题是能够打开Telnet会话,无论是从Internet到互联网的任何地方,都可以将它连接到Internet的移动/嵌入式设备,同时考虑到该设备可能是经过NAT或防火墙保护的,因此无法访问来自网络。
SCO

telnet ..做什么用的?在防火墙Google中打孔以“眩晕”
akira

Answers:


16

具有登录凭据的任何人都可以打开自己的sshd实例,在随机端口上运行,并允许他们想要的任何内容,包括-L本地转发:

% /usr/sbin/sshd -d -f mysshd.config -p 12345

如果您不信任用户对您的计算机执行某些操作,则不应该允许他们首先登录。

(顺便说一句,-D标志也属于“代理问题”)


好吧,我想我可以为此设置一个限制性很强的帐户(例如,将用户放在家中,不列出目录,不浏览文件系统),以使其无法启动和sshd(或安装并启动sshd二进制文件)。关键是客户端应该是嵌入式设备。但是由于它们可能会嵌入证书并且可以将其闪存备忘录转储,因此证书可能会泄漏,因此任何人都可以登录到S1。
SCO

对那个特定的用户使用ChrootDirectory可以解决这个问题,请尝试一下!
SCO

1
在authorized_keys中,设置command="/sbin/nologin"。这样可以防止它们在服务器上运行任何命令。
justis 2012年

语句“具有登录凭据的任何人都可以显示自己的<whatever>”是错误的。ssh可以用于连接到具有严格限制的登录外壳的帐户,这些外壳不允许这样做。在这种受限制的外壳中,端口转发是一个安全漏洞。除了运行允许的命令外,用户还可以创建隧道。
卡兹(Kaz)2012年

3
引自sshd_config手册页:请注意,除非用户也被拒绝shell访问否则禁用TCP转发不会提高安全性,因为他们始终可以安装自己的转发器。(强调我的)。
哈兹2012年

17

另一个解决方案是仅允许将端口转发给特定用户:

从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会话简单地运行自己的端口转发应用程序。仅在非技术社区中,这些设置就足以起到威慑作用,但它们并不能阻止知道她在做什么的人。


1
基本上,我只会在S1上配置一个用户。在这种特定情况下,AFAIU使用AllowTcpForwardingForUsers / AllowTcpForwardingForGroups不会成功,对吗?禁止交互式登录是一个好主意,因为它将使用户无法启动二进制文件。但是,仍然可以使用-L语法来允许任何客户端使用对吗?因此,目前最好的选择是:1 /禁用交互式登录,2 /使用伪造的hostname:port的PermitOpen。我错过了什么 ?
SCO

验证此问题的最佳方法是尝试设置。
基督教徒

我在免费的OpenSSH软件中看不到这些选项。google for AllowTcpForwardingForUsers揭示它是在中配置的sshd2_config,某些商业程序中使用了。查看答案之一:superuser.com/questions/384643/...
卡兹

^ OpenSSH Match在配置中有阻止。您可以Match在用户和组上将其括起来AllowTcpForwarding
卡兹(Kaz)2012年

2

现在有一个选项仅允许本地/远程转发。

AllowTcpForwarding 指定是否允许TCP转发。可用选项包括“是”或“全部”以允许TCP转发,“否”以阻止所有TCP转发,“本地”仅允许本地(从ssh(1)角度)转发,或“远程”以允许远程转发。 仅转发。默认值为“是”。请注意,除非拒绝用户访问外壳程序,否则禁用TCP转发不会提高安全性,因为用户始终可以安装自己的转发器。

因此,如上所述,您也应该将shell设置为nologin。


0

我对这个问题的解决方案是在sshd_config的主要部分中添加: PermitOpen fo.local:80

这只是拒绝fo.local:80之外的任何本地转发请求。


0

我正在寻找一种方法来仅禁用-L转发

如果我理解正确,则您的用户具有完全的外壳访问权限,但您不希望他们能够打开与网络其余部分的连接。

SSH允许的“本地端口转发”只是实现此目的的一种可能方式。其他包括启动的实例socatnetcat或任何其他一些工具。

在Linux中控制传出和传入连接的最佳方法是Netfilter,也就是IPTables。

它有一个称为owner(ipt_owner)的特殊模块,它允许您为本地生成的数据包匹配数据包创建者的各种特征。在OUTPUTPOSTROUTING链中有效。

您可以使用它拒绝某些用户组生成的传出数据包,从而禁止任何类型的端口转发,而不仅仅是-LSSH选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.