我有一个本地脚本,它从用户那里获取某些数据,例如他们的用户 ID 和唯一代码。然后,此脚本通过 ssh 登录我的服务器并将用户的参数发送到我的远程服务器中的脚本。该脚本稍后将这些数据与远程数据库进行匹配,如果有效,将设置端口转发连接。但是,我刚刚意识到用户也可以键入 ssh -r 并手动连接到我的服务器并转发端口。我该如何阻止它?
编辑:我的设置如下:
- 客户端是 Android 的,在一个名为 termux 的应用程序中,它提供了一个 Linux 终端。
- 该脚本要求输入代码、用户 ID(在我的网站中)和远程端口
- 然后用户输入详细信息。
- 该脚本将启动 ssh -R domain:port:localhost:port user@domain -i key -t "sudo script.ssh code, id, port"
- 远程服务器中的脚本使用数据库验证这 3 个参数。
- 如果有效则提示“验证成功。按 ctrl + c 退出”
- 如果验证失败,则显示错误,睡眠 5 并退出
- 但是,我只需 ssh -r domain:port:localhost:port user@domain -i key 即可转发端口。
我不希望这样的事情发生。
答案1
如果没有更深入的了解,很难提供建议,但是 -
您尝试执行的操作可能不是特别安全或强大,并且我感觉它破坏了多项安全最佳实践(我可能对您的陈述进行了过多的解读“他的脚本然后 ssh 登录我的服务器并将用户的参数发送到我的远程服务器中的脚本。”
您可以通过修改 /etc/ssh/sshd_config 并添加适当的 AllowUsers 命令来限制谁可以登录到 SSH 服务器 - 但是当您修改此行时,您需要重新加载 ssh。
根据您设置 SSHD 的方式,您还可以通过为部分或全部主机设置“ForwardAgent no”来修改配置,尽管我怀疑这不太可能带来太多好处。
为澄清问题而添加
我努力理解 ssh 的 -R 部分,但我认为没有好的方法可以使用 ssh 和脚本来完成你尝试做的事情。
你可以通过让脚本添加 iptables 规则来实现限制,默认情况下会阻止端口,然后通过脚本解除阻止 - 然而这会带来两个难题 -
您如何知道他们何时关闭端口。您可能能够将退出更改为读取命令或类似命令,在读取完成时关闭,但这不太可能是可靠的。您可能能够使用一些复杂的魔法和正则表达式,并使用 fail2ban 来监视 ssh 关闭会话并运行另一个 iptables 规则或关闭脚本 - 但即使这是可能的,它也很混乱和可怕,并且对下面可能的问题 2 没有帮助:
您正在从 SSH shell 运行命令“sudo script.ssh”。这似乎很容易被滥用(无需了解脚本),因为我预计人们可以通过 ssh 进入您的服务器并查看脚本,访问数据库并利用它 - 并且假设您已正确设置 sudo。