将参数传递给SSH客户端以使用参数执行ForceCommand

问题描述 投票:3回答:3

我无法将命令参数远程传递给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真的支持这个吗?如果是,有关如何使其工作的任何建议?

谢谢。

shell unix ssh openssh
3个回答
0
投票

我找到了答案。远程服务器捕获参数字符串并将其保存在“$ SSH_ORIGINAL_COMMAND”环境变量中。


0
投票

正如已经回答的那样,从ssh客户端发送的命令行被放入SSH_ORIGINAL_COMMAND环境变量中,只执行ForcedCommand。

如果您在ForcedCommand中使用SSH_ORIGINAL_COMMAND中的信息,则必须注意安全隐患。攻击者可以通过发送例如任意附加命令来增强您的命令。 ; rm -rf /在命令行的末尾。

This article显示了一个通用脚本,可用于锁定允许的参数。它还包含相关信息的链接。

描述的方法('only'脚本)的工作原理如下:

  1. 将'only'脚本设为ForcedCommand,并将allowed命令作为其参数。注意,可以使用多于一个允许的命令。
  2. .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'在服务器上查找命令并使用其名称来匹配规则。如果其中任何一项检查失败,则不会运行该命令。


0
投票

[披露:我写了sshdo,如下所述]

这是一个名为sshdo的程序。它控制可以通过传入的ssh连接执行哪些命令。它可以从以下网址下载:

http://raf.org/sshdo/ (read manual pages here)
https://github.com/raforg/sshdo/

它具有允许尝试所有命令的学习模式,以及--learn选项,以生成永久允许学习命令所需的配置。然后可以关闭学习模式,并且不会执行任何其他命令。

它还有一个--unlearn选项,可以停止允许不再使用的命令,以便在需求随时间变化时保持严格的最小权限。

它也可以手动配置。

对于它允许的内容非常挑剔。它不允许带有任何参数的命令。只允许完成shell命令。但它确实支持简单的模式来表示类似的命令,这些命令仅在命令行上出现的数字(例如序列号或日期/时间戳)之间变化。

它就像是ssh命令的防火墙或白名单控件。

© www.soinside.com 2019 - 2024. All rights reserved.