我有一个在远程服务器端口 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
答案3
我会看一下这个autossh
工具。
手册页可以在这里找到:
我使用它来保持防火墙后面的 IMAP 和 SMTP 服务器端口开放。例如:
% autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 \
myuser@remoteserver
看起来也存在于大多数较大的 Linux 发行版存储库中。