如何限制ssh隧道权限到某个端口?

如何限制ssh隧道权限到某个端口?

我有一个在远程服务器端口 9999 上运行的程序。由于它不支持任何类型的加密和身份验证,因此我使用 ssh 隧道来访问它。

这是我正在使用的命令:

ssh -L 9999:localhost:9999 user@remotehost

为了保持这个隧道畅通,我编写了一个 ssh 脚本来监控,如果出现任何问题,就重新启动它。因此,我必须将密码存储在脚本中。

但是,考虑到这个客户端服务器可能被黑客入侵。我认为最好能限制这个隧道的最小权限。

那么,是否可以限制远程主机用户只能使用 ssh 隧道转发到端口 9999?

答案1

为了保证这个隧道畅通,我编写了一个 ssh 脚本来监控,如果出现任何问题就重新启动它。

你应该考虑使用自动SSH反而。

所以,我必须将密码存储在脚本中。

您应该使用公钥认证而不是密码。

那么,是否可以限制远程主机用户只能使用 ssh 隧道转发到端口 9999?

首先,确保用户无法在服务器机器。如果您尚未使用某个帐户,只需创建一个仅用于打开此隧道的特定帐户即可。将此帐户的默认 shell 设置为/sbin/nologin(或/bin/false如果前者不存在)

useradd tunnel
usermod -s /sbin/nologin tunnel

你应该继续客户机器并生成 ssh 密钥对,并将公钥复制到服务器。

ssh-keygen
ssh-copy-id tunnel@server

最后,服务器,使用 authorized_keys 文件限制除 localhost:9999 之外的任何隧道的能力。将以下内容附加到使用 上传的授权密钥的前面ssh-copy-id

no-pty,permitopen="localhost:9999"

no-pty 是另一个不允许打开交互式 shell 的安全设置。结果行如下所示:

no-pty,permitopen="localhost:9999" ssh-rsa AAAAB3NzaC1y...Rdo/R user@clientbox

您可能还可以在 中设置其他有用的选项authorized_keys file。有关更多信息,请阅读人 sshd

/etc/ssh/sshd_config此外,您还可以通过帐户的匹配块锁定帐户:

Match User tunnel
   ForceCommand /sbin/nologin # An additional configuration to disable any shell command, superfluous when the user's shell is already set to `/sbin/nologin`
   AllowAgentForwarding no
   AllowTcpForwarding local # Disallow port forwarding of remote ports, superfluous when using the `permitopen` restriction in authorized_keys
   AllowStreamLocalForwarding no # Probably not necessary, as the user needs to have access rights to access the AF_UNIX port
   X11Forwarding no # Because some default configuration files, e.g. from Debian, set it to yes
# Beware: Match does not end with indentation!

这些只是改进当前 ssh 隧道设置的技巧。正如 Dennis 所建议的,还有其他更优雅的隧道解决方案值得考虑。

答案2

不,这是不可能的。您可以禁用端口转发,但这会禁用任何端口的转发,没有针对每个端口的设置。

permitopen="localhost:9999"是的,通过在服务器上添加密钥即可实现这一点~/.ssh/authorized_keys,请参阅 sshd 手册页(感谢 Kenny!)。您还需要强制执行一个只执行睡眠的命令,以确保任何攻击者都无法获得 shell(从而删除该限制并执行其他坏事)。

话虽如此,ssh 并不是实现此目的的错误方式。为什么不使用隧道使服务可通过 SSL 访问?或者使用以下方式在两台机器之间建立 VPN 连接:开放VPN

答案3

我会看一下这个autossh工具。

手册页可以在这里找到:

我使用它来保持防火墙后面的 IMAP 和 SMTP 服务器端口开放。例如:

% autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 \
          myuser@remoteserver

看起来也存在于大多数较大的 Linux 发行版存储库中。

相关内容