我无法将命令参数远程传递给ssh中的“ForceCommand”程序。
在我的远程服务器中,我在sshd_config中有这个配置:
Match User user_1
ForceCommand /home/user_1/user_1_shell
user_1_shell程序限制用户可以执行的命令,在这种情况下,我只允许用户执行“set_new_mode param1 param2”。任何其他命令都将被忽略。
所以我希望当客户端通过ssh登录时,例如:
ssh user_1@remotehost "set_new_mode param1 param2"
似乎执行了user_1_shell程序,但似乎没有传递参数字符串。
也许,我应该问,ForceCommand真的支持吗? 如果是的话,有关如何使其发挥作用的任何建议吗?
感谢。
答案 0 :(得分:0)
我找到了答案。远程服务器捕获参数字符串并将其保存在“$ SSH_ORIGINAL_COMMAND”环境变量中。
答案 1 :(得分:0)
如前所述,从ssh客户端发送的命令行被放入SSH_ORIGINAL_COMMAND环境变量中,只执行ForcedCommand。
如果您在ForcedCommand中使用SSH_ORIGINAL_COMMAND中的信息,则必须注意安全隐患。攻击者可以通过发送例如任意附加命令来增强您的命令。 ; rm -rf /
在命令行的末尾。
This article显示了一个通用脚本,可用于锁定允许的参数。它还包含相关信息的链接。
所描述的方法('only'脚本)的工作原理如下:
将'only'脚本设为ForcedCommand,并将其设为允许的 命令作为其参数。请注意,可以使用多个允许的命令。
将.onlyrules
个文件放入user_1
的主目录中,并填入规则(正则表达式),这些规则与
命令行由ssh客户端发送。
您的示例如下:
Match User user_1
ForceCommand /usr/local/bin/only /home/user_1/user_1_shell
并且,例如,如果您想仅允许'set_new_mode'作为参数,只有两个字母数字的任意参数,.onlyrules
文件将如下所示:
\:^/home/user_1/user_1_shell set_new_mode [[:alnum:]]\{1,\} [[:alnum:]]\{1,\}$:{p;q}
请注意,要将命令发送到服务器,您必须使用整个命令行:
/home/user_1/user_1_shell set_new_mode param1 param2
'only'在服务器上查找命令并使用其名称来匹配规则。如果其中任何一项检查失败,则不会运行该命令。
答案 2 :(得分:0)
[披露:我写了下面描述的sshdo]
有一个名为sshdo的程序可以执行此操作。它控制可以通过传入的ssh连接执行哪些命令。可以从以下位置下载:
http://raf.org/sshdo/ (read manual pages here)
https://github.com/raforg/sshdo/
它具有学习模式,允许尝试所有命令,并且--learn选项产生所需的配置,以永久允许学习的命令。然后可以关闭学习模式,并且将不执行任何其他命令。
它还具有--unlearn选项,以停止允许不再使用的命令,以便在需求随时间变化时保持严格的最小特权。
它也可以手动配置。
它允许什么非常挑剔。不允许带有任何参数的命令。仅允许使用完整的Shell命令。但是它确实支持简单的模式来表示类似的命令,这些命令仅在命令行上显示的数字(例如序列号或日期/时间戳)上有所不同。
这就像ssh命令的防火墙或白名单控件。